如何在按.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
列。 altogher。
所需的输出应将dow列排序,但不能求和。
答案 0 :(得分:2)
我们可以在.SDcols
中指定感兴趣的列,并通过赋值运算符:=
更新其他列以在适当位置分配输出值
dt[order(dow), c('current1', 'current2') := lapply(.SD, cumsum),
by = .(person), .SDcols = current1:current2]
注意:所使用的函数为cumsum
,因此它将生成与原始数据集中相同数量的行