请问如何按组汇总多列?
对于以下数据,我可以使用 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]
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] 删除。
我来说两句