按组对多列求和

用户2957945

请问如何按组汇总多列?

对于以下数据,我可以使用 base r split-apply 函数获得预期结果:

library(data.table)
set.seed(1234)
df1 = data.table(grp = sample(0:2, 10, TRUE), 
                 a=sample(0:1, 10, TRUE), b=sample(0:1, 10, TRUE), 
                 c=sample(0:1, 10, TRUE), d=sample(0:1, 10, TRUE))
df1
#     grp a b c d
#  1:   1 1 1 1 0
#  2:   1 1 0 0 0
#  3:   0 0 1 1 0
#  4:   2 1 1 1 0
#  5:   0 1 1 0 1
#  6:   0 1 0 1 1
#  7:   1 1 1 0 1
#  8:   1 1 0 1 1
#  9:   2 1 0 1 1
# 10:   1 1 0 1 0

rbindlist(lapply(split(df1, df1$grp), 
                    function(x) as.data.table(t(colSums(x[,-1])))), idcol="grp")
#    grp a b c d
# 1:   0 2 2 2 2
# 2:   1 5 2 3 2
# 3:   2 2 1 2 1

如何用data.table语法做到这一点

这些尝试没有给出预期的结果:

df1[, .(s = lapply(.SD, sum)), .SDcols=a:d, by=grp]
df1[, .(s = colSums(.SD)), .SDcols=a:d, by=grp]
r2evans
df1[, lapply(.SD, sum), by = .(grp), .SDcols = c("a", "b", "c", "d")]
#    grp a b c d
# 1:   1 5 2 3 2
# 2:   0 2 2 2 2
# 3:   2 2 1 2 1

我使用了列确定 ( c(...))的编程模式,并猜测您可能需要动态生成它们,例如setdiff(colnames(df1), "grp"). 如果不需要,您也可以使用 RonakShah 的推荐a:d

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章