次の 4 列のデータフレームを考えてみましょう。
df = data.frame(A = rnorm(10), B = rnorm(10), C = rnorm(10), D = rnorm(10))
列 A、B、C、D は異なるグループに属し、グループは別のデータフレームで定義されます。
groups = data.frame(Class = c("A","B","C","D"), Group = c("G1", "G2", "G2", "G1"))
#> groups
# Class Group
#1 A G1
#2 B G2
#3 C G2
#4 D G1
同じグループに属する列の要素を平均化し、次のようなものを取得したいと思います。
#> res
# G1 G2
#1 -0.30023039 -0.71075139
#2 0.53053443 -0.12397126
#3 0.21968567 -0.46916160
#4 -1.13775100 -0.61266026
#5 1.30388130 -0.28021734
#6 0.29275876 -0.03994522
#7 -0.09649998 0.59396983
#8 0.71334020 -0.29818438
#9 -0.29830924 -0.47094084
#10 -0.36102888 -0.40181739
ここで、G1 の各セルは A と D の相対的なセルの平均であり、G2 の各セルは B と C の相対的なセルの平均です。
私はこの結果を達成することができましたが、かなり強引な方法で:
l = levels(groups$Group)
res = data.frame(matrix(nc = length(levels), nr = nrow(df)))
for(i in 1:length(l)) {
df.sub = df[which(groups$Group == l[i])]
res[,i] = apply(df.sub, 1, mean)
}
names(res) <- l
これを行うより良い方法はありますか?実際には、20 以上の列と 10 以上のグループがあります。
ありがとうございました!