Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R data.table,如何重置累计金额(或将组添加到分组依据)_R_Data.table - Fatal编程技术网

R data.table,如何重置累计金额(或将组添加到分组依据)

R data.table,如何重置累计金额(或将组添加到分组依据),r,data.table,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 我想我可以介绍另一个列组,其值为A,B,。。。在y==0之后,它会改变,然后通过expression在中使用它,但我不知道如何

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

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

我想我可以介绍另一个列组,其值为A,B,。。。在y==0之后,它会改变,然后通过expression在中使用它,但我不知道如何(至少除了使用for子句之外)尝试这样的方法

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

您可以将条件
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

使用
data.table
devel版本

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

数据表中y列中有多少个0?类似于
dt[,q:=cumsum((x>0)*x),by=cumsum(y==0)]
?但是我不知道你为什么想要第4行的5我有点困惑你想要什么,所以你想要1:4的总和,而不是5:6的新的??你需要这里的devel版本。看起来很有趣,但我不能在这个项目上使用devel谢谢!现在,我将继续使用更详细的实现,因为我实际上刚刚开始使用RI,它有一个类似的案例,经过轻微修改,效果很好。做得好。
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