首页 > 解决方案 > 汇总 data.table .SD,同时按 .SDcols 之一排序

问题描述

如何在按 .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")]产生 和 的所需累积current1总和current2

    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 列进行排序但不求和。

标签: rdata.table

解决方案


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

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

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


推荐阅读