构造具有滞后值的列

时间:2016-05-21 01:59:00

标签: r data.table

假设我有以下创建数据表的脚本

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

有什么建议吗?

2 个答案:

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