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

时间:2015-04-13 11:30:05

标签: 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

我需要做的是在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)

3 个答案:

答案 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