r - 按组汇总数据框

标签 r dataframe

考虑以下具有 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 多个组。

谢谢!

最佳答案

使用数据表

library(data.table)
groups <- data.table(groups, key="Group")
DT <- data.table(df)

groups[, rowMeans(DT[, Class, with=FALSE]), by=Group][, setnames(as.data.table(matrix(V1, ncol=length(unique(Group)))), unique(Group))]

             G1         G2
 1: -0.13052091 -0.3667552
 2:  1.17178729 -0.5496347
 3:  0.23115841  0.8317714
 4:  0.45209516 -1.2180895
 5: -0.01861638 -0.4174929
 6: -0.43156831  0.9008427
 7: -0.64026238  0.1854066
 8:  0.56225108 -0.3563087
 9: -2.00405840 -0.4680040
10:  0.57608055 -0.6177605



# Also, make sure you have characters, not factors, 
groups[, Class := as.character(Class)]
groups[, Group := as.character(Group)]

简单的基础:
 tapply(groups$Class, groups$Group, function(X) rowMeans(df[, X]))

使用 sapply :
 sapply(unique(groups$Group), function(X) 
     rowMeans(df[, groups[groups$Group==X, "Class"]]) )

关于r - 按组汇总数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19546919/

相关文章:

r - 如何通过现有名称列表将矩阵行或列名称更改为新名称?

python - 如何计算列表中groupby的加权平均值或总和?

python - 基于具有空白行的列向数据框添加新列

r - 如何循环打印列表中的元素?

从 CRAN 安装软件包时 R 找不到 Rtools

r - 每日数据的运行总和在月份轮换时重置

javascript - 重新设计的半折叠侧边栏 - R shinydashboardplus

python - Dataframe 按列值过滤行

python - 如果列的组合与 Panda Dataframe 相同,如何删除行

python - 按 pandas 中除一个索引列以外的所有内容分组