使用第二个字段中的值修改累积和

时间:2016-11-17 00:37:33

标签: r data.table dplyr zoo

这就是我的数据框架的样子。 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,它是之前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=1V2=2以及V3=3添加到其中。所以,

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

我试过了:

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

1 个答案:

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