汇总data.table .SD,同时按.SDcols排序

时间:2019-01-23 14:05:01

标签: r data.table

如何在按.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列。 altogher。

所需的输出应将dow列排序,但不能求和。

1 个答案:

答案 0 :(得分:2)

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

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

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