假设我有以下创建数据表的脚本
library(data.table)
dt <- data.table(a = c(1,2,3,4,5), b = c(6,7,8,9,10), c = c(22,0,0,0,0))
我想在第2行到第5行中替换c
的值,如下所示
a b c
1: 1 6 22
2: 2 7 31
3: 3 8 42
4: 4 9 55
5: 5 10 70
类似
c = a + b + shift(c, n = 1, fill = 0, type="lag")
换句话说,保持第1行相同并将公式应用于第2行到第5行。
我试过了
dt[2:nrow(dt), c := a + b + shift(c, n = 1, fill = 0, type="lag")]
但是这给了
a b c
1: 1 6 22
2: 2 7 9
3: 3 8 11
4: 4 9 13
5: 5 10 15
有什么建议吗?
答案 0 :(得分:4)
data.table
这样做的方法,考虑到添加a + b + c[i-1]
实际上是a + b
累积总和的事实:
dt[, c := shift(cumsum(shift(a+b, n = 1, type = "lead")) + c[1],
n = 1, type = "lag", fill = c[1])]
dt
a b c
1: 1 6 22
2: 2 7 31
3: 3 8 42
4: 4 9 55
5: 5 10 70
答案 1 :(得分:4)
我们也可以(@ Frank的建议的变体)
dt[, c:= c[1L]][-1L, c := cumsum(a+b)+c]
dt
# a b c
#1: 1 6 22
#2: 2 7 31
#3: 3 8 42
#4: 4 9 55
#5: 5 10 70