使用内部订单的 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。
我需要一种方法来计算此 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。