【问题标题】:sum over multiple columns by group [duplicate]按组对多列求和[重复]
【发布时间】:2021-02-28 16:32:38
【问题描述】:

请问如何按组对多列求和?

对于以下数据,我可以使用 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), .SDcols=a:d, by=grp]
  • 嘘,谢谢 Ronak;不知道我通过分配名称在做什么

标签: r data.table


【解决方案1】:
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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    相关资源
    最近更新 更多