如何使数据表值滞后多个

时间:2014-11-04 23:28:12

标签: r data.table

说我有一个数据表。我可以创建一个滞后值列:

>x
date    id   val  valPr
1/4/14   a    1     2
1/3/14   a    2     3 
1/2/14   a    3     4
1/1/14   a    4     NA
1/4/14   b    10    20
1/3/14   b    20    30
1/2/14   b    30    40
1/1/14   b    40    NA

使用:

setDT(x)[, valPr := c(val[-1], NA), by = "id"]

有没有办法做一些类似滞后超过一个时期的事情?例如三个?

它会产生这样的东西:

>x
date    id   val  valPr
1/4/14   a    1     4
1/3/14   a    2     NA 
1/2/14   a    3     NA
1/1/14   a    4     NA
1/4/14   b    10    40
1/3/14   b    20    NA
1/2/14   b    30    NA
1/1/14   b    40    NA

2 个答案:

答案 0 :(得分:2)

使用data.table,您可以这样做:

nlags = 3 x[ by="id", , valPr := c( val[ - seq(nlags) ], rep( NA, nlags) ) ]

这样做会替换nlags中的第一个val,然后将该NA个值放在最后。您可以对此进行调整,以便将滞后值轻松放在系列的开头或结尾。

答案 1 :(得分:2)

您也可以执行以下操作。 leaddplyr中的函数。

setDT(mydf)[, valPr2 := lead(val, 3), by = "id"]

#     date id val valPr valPr2
#1: 1/4/14  a   1     2      4
#2: 1/3/14  a   2     3     NA
#3: 1/2/14  a   3     4     NA
#4: 1/1/14  a   4    NA     NA
#5: 1/4/14  b  10    20     40
#6: 1/3/14  b  20    30     NA
#7: 1/2/14  b  30    40     NA
#8: 1/1/14  b  40    NA     NA

数据

mydf <- structure(list(date = structure(c(4L, 3L, 2L, 1L, 4L, 3L, 2L, 
1L), .Label = c("1/1/14", "1/2/14", "1/3/14", "1/4/14"), class = "factor"), 
id = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label = c("a", 
"b"), class = "factor"), val = c(1L, 2L, 3L, 4L, 10L, 20L, 
30L, 40L), valPr = c(2L, 3L, 4L, NA, 20L, 30L, 40L, NA)), .Names = c("date", 
"id", "val", "valPr"), class = "data.frame", row.names = c(NA, 
-8L))