本当に簡単な R の質問があるのですが、適切な解決策が見つからないようです。次のデータ フレームがあるとします。
groupid<-rep(1:5, each=3)
names<-rep(c("Bill", "Jim", "Sarah", "Mike", "Jennifer"),3)
test1<-rep(c(90, 70, 90, NA, 100),3)
test2<-rep(c(80, NA, 92, 80, 65), 3)
testscores<-data.frame(groupid, names, test1, test2)
groupid names test1 test2
1 1 Bill 90 80
2 1 Jim 70 NA
3 1 Sarah 90 92
4 1 Mike NA 80
5 1 Jennifer 100 65
6 2 Bill 90 80
7 2 Jim 70 NA
8 2 Sarah 90 92
9 2 Mike NA 80
10 2 Jennifer 100 65
11 3 Bill 90 80
12 3 Jim 70 NA
13 3 Sarah 90 92
14 3 Mike NA 80
15 3 Jennifer 100 65
NA 値を無視して、各テストの行全体の平均 (データ フレームに列を追加) を取得することに興味があります。たとえば、「Jim」の平均値は 70 で、「Mike」の平均値は 80 になります。その他はすべて通常の平均になります。
plyr パッケージの transform を使用しようとしましたが、NA の問題には対応していないようです。
ベストアンサー1
testscores$testMean <- rowMeans(testscores[,3:4], na.rm=TRUE)
> testscores
groupid names test1 test2 testMean
1 1 Bill 90 80 85.0
2 1 Jim 70 NA 70.0
3 1 Sarah 90 92 91.0
4 2 Mike NA 80 80.0
5 2 Jennifer 100 65 82.5
6 2 Bill 90 80 85.0
7 3 Jim 70 NA 70.0
8 3 Sarah 90 92 91.0
9 3 Mike NA 80 80.0
10 4 Jennifer 100 65 82.5
11 4 Bill 90 80 85.0
12 4 Jim 70 NA 70.0
13 5 Sarah 90 92 91.0
14 5 Mike NA 80 80.0
15 5 Jennifer 100 65 82.5