【发布时间】: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=V1 和 1=V2 和 2=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=1 和 V2=2 和 V3=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