使用内部订单的 data.table 摘要

Summary of a data.table using internal order

我需要一种方法来计算此 data.table 的第三列。

DT=data.table(group=c(1,1,0,0,1,1),x=c(1,1,1,2,2,2),ResultNeeded=c(2,2,3,3,4,4))

我猜可以修改以下内容以获得我需要的结果。 DT[,sum:=sum(x),by=group]。我只是不知道该怎么做。

你很接近,你只需要正确的分组:

DT[, sum := sum(x), by = cumsum(c(F, diff(group) != 0))]
#   group x ResultNeeded sum
#1:     1 1            2   2
#2:     1 1            2   2
#3:     0 1            3   3
#4:     0 2            3   3
#5:     1 2            4   4
#6:     1 2            4   4

data.table 的开发版本 v1.9.5 中,有一个函数 rleid() 可以帮助以更简洁的方式完成此操作:

require(data.table) ## v1.9.5+
DT[, ans := sum(x), by=rleid(group)]
#    group x ResultNeeded ans
# 1:     1 1            2   2
# 2:     1 1            2   2
# 3:     0 1            3   3
# 4:     0 2            3   3
# 5:     1 2            4   4
# 6:     1 2            4   4

rleid() 将相同值的连续运行组合在一起(以基本函数 rle() 命名)。

您可以按照说明安装开发版here