data.table,如何重置cumsum(或将组添加到group by)

zap*_*pp0 7 r data.table

我有一个包含一些计算列的数据表

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
Run Code Online (Sandbox Code Playgroud)

我需要做的是在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
Run Code Online (Sandbox Code Playgroud)

我想我可以引入另一个具有值A,B,......的列组,它们会在y == 0之后发生变化,然后通过exssion使用它,但我不知道如何(至少不是使用for子句)

Exp*_*teR 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
Run Code Online (Sandbox Code Playgroud)


kon*_*vas 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
Run Code Online (Sandbox Code Playgroud)


Dav*_*urg 7

您可以将条件添加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
Run Code Online (Sandbox Code Playgroud)