这就是我的数据框架的样子。 NewCumV1
是我想要的领域。
库(data.table) dt< - fread('
V1 V2 NewCumV1 Group V3
1 1 2 1 1
0 2 4 1 1
0 4 8 1 1
0 3 11 1 2
2 1 16 2 1
0 2 18 2 2
0 5 23 2 3
1 2 29 3 1 ')
NewCumV1
一般只有cumsum(V1+V2)
,cumsum(V1+V2)+Last Value of V3 from prior group
代表组更改时的行。
因此,在第5行,当群组从Group=1
更改为Group=2
时,我会使用现有的cumsum
,即11,并添加2=V1
和1=V2
和2=V3
,它是之前Group=1
的V3的最后一个值,然后是它。那么,
NewCumV1 For New Group2 at 5th row= 11+2+1+2 = 16
之后,在cumsum(V1+V2)
更改之前,它会再次定期Group
。所以从第6行开始计算:
16+0+2=18(6th row)
18+0+5=23(7th row)
第8行是Group=3
的新组,因此有cumsum
重置。我从最后一组23开始NewCumV1
,然后将V1=1
和V2=2
以及V3=3
添加到其中。所以,
23+1+2+3=29(last row)
我试过了:
dt[NewCumV1:= cumsum(V1+V2)+ last(V3), by=Group))]
答案 0 :(得分:1)
也许像这样的IIUW:
library(data.table)
dt <- fread('
V1 V2 NewCumV1 Group
1 1 1 1
0 2 3 1
0 4 7 1
0 3 10 1
2 1 13 2
0 2 15 2
0 5 20 2
1 2 23 3 ')
dt[Group == 1, cus := cumsum(V2)]
dt[Group != 1, cus := cumsum(V2+V1), by = Group]
foo <- dt[, .(addons = cus[.N]), by = Group]
foo[, `:=`(addons = cumsum(addons), Group = Group + 1)]
dt <- merge(dt, foo[1:(nrow(foo)-1)], by = "Group", all = T)
dt[, cus := rowSums(.SD, na.rm = T), .SDcols = c("cus", "addons")]
# Group V1 V2 NewCumV1 cus addons
# 1: 1 1 1 1 1 NA
# 2: 1 0 2 3 3 NA
# 3: 1 0 4 7 7 NA
# 4: 1 0 3 10 10 NA
# 5: 2 2 1 13 13 10
# 6: 2 0 2 15 15 10
# 7: 2 0 5 20 20 10
# 8: 3 1 2 23 23 20