【问题标题】:Modifying cumulative sum with values from a second field使用第二个字段中的值修改累积总和
【发布时间】:2016-11-17 00:37:33
【问题描述】:

这就是我的数据框的样子。 NewCumV1 是我想要的领域。

库(data.table) dt

        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)generally 和 cumsum(V1+V2)+Last Value of V3 from prior group 用于组更改时的行。

所以在第 5 行,当 Group 从 Group=1 更改为 Group=2 时,我采用现有的 cumsum 11 并添加 2=V11=V22=V3 ,这是最后一个值V3 从之前的Group=1,到它。所以,

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 到它。所以,

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

我试过了:

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

【问题讨论】:

  • NewCumV1 中的最后一个值,对吗?如果你为每个“组”计算cumsum(V2),第 7 个观察值是 8,所以我得到 31 而不是 23
  • 如果上面的评论是对的,那么dt[, New1 := cumsum(V2), Group][, i1 := shift((!duplicated(Group, fromLast=TRUE))*New1, fill=0)][Group!=1, New1 := cumsum(i1+V1+V2)][, i1:= NULL][]
  • @akrun 感谢您的出色回答。代码末尾的这个小改动dt[Group!=1, New1 := cumsum(i1+V1+V2), by=Group] 让我完成了工作。我将在我的帖子中进行一些编辑以使其清楚。
  • @akrun 请发布您的解决方案作为答案。
  • 我发布了你提到的修改,但我仍然没有得到最后一个值的 23

标签: r data.table dplyr zoo


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    • 2020-03-30
    • 2021-02-08
    相关资源
    最近更新 更多