我需要一种方法来计算此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]
。我只是不知道该怎么做。
答案 0 :(得分: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说明安装开发版本。
答案 1 :(得分:2)
你很接近,你只需要正确的分组:
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