使用第二个字段的值修改累计总和

Modifying cumulative sum with values from a second field

这就是我的数据框的样子。 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=V11=V22=V3 ,这是 V3 从之前的 Group=1 到 it.So,

的最后一个值
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=1V2=2V3=3 添加到 it.So,

23+1+2+3=29(last row)

我试过:

dt[NewCumV1:= cumsum(V1+V2)+ last(V3), by=Group))]

也许是这样的 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