【问题标题】:summarize data.table .SD, while sorting by one of .SDcols汇总 data.table .SD,同时按 .SDcols 之一排序
【发布时间】:2019-01-23 14:05:01
【问题描述】:

如何在按 .SDcols 中的第一个排序时计算 .SD 列的累积总和(不求第一列的总和)

以玩具为例:

require(data.table)
dt<-data.table(expand.grid(dow = 1:5, person = c("alice", "bob")))
setcolorder(dt, c("person", "dow"))
dt[, `:=`(current1 = runif(nrow(dt)), current2 = runif(nrow(dt)))]

求和前的数据:

    person dow current1 current2
1:  alice   1    0.266   0.9447
2:  alice   2    0.372   0.6608
3:  alice   3    0.573   0.6291
4:    bob   1    0.908   0.0618
5:    bob   2    0.202   0.2060
6:    bob   3    0.898   0.1766

dt[order(dow), lapply(.SD, cumsum), by = c("person")] 产生所需的 current1current2 的累积总和:

    person dow current1 current2
1:  alice   1    0.266   0.9447
2:  alice   3    0.638   1.6055
3:  alice   6    1.210   2.2346
4:    bob   1    0.908   0.0618
5:    bob   3    1.110   0.2678
6:    bob   6    2.008   0.4443

而且,不希望地,总和dow

dt[order(dow), lapply(.SD, cumsum), by = c("person"), .SDcols = c("current1", "current2")] 删除 dow 列。总而言之。

所需的输出应该对 dow 列进行排序但不求和。

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    我们可以在.SDcols 中指定感兴趣的列,并通过赋值运算符:= 更新其他列,以将输出值分配到位

    dt[order(dow), c('current1', 'current2') := lapply(.SD, cumsum),
          by = .(person), .SDcols = current1:current2]
    

    注意:使用的函数是cumsum,因此它将生成与原始数据集中相同数量的行

    【讨论】:

    • 行得通。但是有没有办法将它扩展到引用 cols,例如,cols_to_sum &lt;- grep("current", names(dt), value = T); dt[order(dow), cols_to_sum := lapply(.SD, cumsum), by = .(person), .SDcols = cols_to_sum] 将不起作用,因为它会生成一个名为 cols_to_sum 的列。
    • @dzeltzer。只需用括号括起来,即 cols_tosum 应该是 (cols_to_sum) :=
    猜你喜欢
    • 2019-02-05
    • 2016-07-31
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多