使用第二个字段的值修改累计总和
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=V1
和 1=V2
和 2=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=1
和 V2=2
和 V3=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
这就是我的数据框的样子。 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
,这是 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=1
和 V2=2
和 V3=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