我有一个包含一些计算列的数据表
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子句)
随着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)
尝试这样的事情
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)
您可以将条件添加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)
| 归档时间: |
|
| 查看次数: |
812 次 |
| 最近记录: |