说我有一个数据表。我可以创建一个滞后值列:
>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
答案 0 :(得分:2)
使用data.table
,您可以这样做:
nlags = 3
x[ by="id",
, valPr := c( val[ - seq(nlags) ], rep( NA, nlags) )
]
这样做会替换nlags
中的第一个val
,然后将该NA
个值放在最后。您可以对此进行调整,以便将滞后值轻松放在系列的开头或结尾。
答案 1 :(得分:2)
您也可以执行以下操作。 lead
是dplyr
中的函数。
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))