我有一个带有一些计算列的数据表
dt <- data.table(x=c(1,4,-3,-2,3,4))
dt[,y:=cumsum(x)]
dt[,q:=cumsum(ifelse(x>0,x,0))]
x y q
1: 1 1 1
2: 4 5 5
3: -3 2 5
4: -2 0 5
5: 3 3 8
6: 4 7 12
我需要做的是在y == 0之后重置q。本质上,行1:4属于A组,5:6属于B组。结果应为:
x y q
1: 1 1 1
2: 4 5 5
3: -3 2 5
4: -2 0 5
5: 3 3 3
6: 4 7 7
我想我可以引入另一个具有值A,B,......的列组,它们会在y == 0之后改变,然后通过探索使用它,但我不知道如何(至少不是其他的)比使用for for clause)
答案 0 :(得分:9)
使用data.table
开发版
dt[, q:=cumsum(ifelse(x>0,x,0)),by=shift(cumsum(y==0),1, fill=0)]
#library(devtools)
#install_github("Rdatatable/data.table", build_vignettes = FALSE)
# x y q
#1: 1 1 1
#2: 4 5 5
#3: -3 2 5
#4: -2 0 5
#5: 3 3 3
#6: 4 7 7
答案 1 :(得分:8)
尝试这样的事情
dt[, group:= cumsum(y == 0)]
dt[y == 0, group := group - 1]
dt[, q:=cumsum(ifelse(x>0,x,0)), by = group]
dt
# x y group q
#1: 1 1 0 1
#2: 4 5 0 5
#3: -3 2 0 5
#4: -2 0 0 5
#5: 3 3 1 3
#6: 4 7 1 7
答案 2 :(得分:6)
您可以将条件c(0L, cumsum(y == 0L))[-length(y)]
添加到by
语句
dt[, q := cumsum(ifelse(x > 0, x, 0)), by = c(0L, cumsum(y == 0L))[-length(y)]][]
# x y q
# 1: 1 1 1
# 2: 4 5 5
# 3: -3 2 5
# 4: -2 0 5
# 5: 3 3 3
# 6: 4 7 7