我目前使用data.table
以下列方式滞后面板数据:
require(data.table)
x <- data.table(id=1:10, t=rep(1:10, each=10), v=1:100)
setkey(x, id, t) #so that things are in increasing order
x[,lag_v:=c(NA, v[1:(length(v)-1)]),by=id]
我想知道是否有更好的方法来做到这一点?我在网上找到了关于交叉连接的东西,这是有道理的。但是,交叉连接会为大型数据集生成相当大的data.table
,因此我对使用它犹豫不决。
答案 0 :(得分:5)
我不确定这与您的方法有多大不同,但您可以使用x
id
的事实
x[J(1:10), lag_v := c(NA,head(v, -1)) ]
我没有测试过这是否比by
更快,特别是如果它已经被锁定了。
或者,使用t
(不要将函数用作变量名!)的事实是时间id
x <- data.table(id=1:10, t=rep(1:10, each=10), v=1:100)
setkey(x, t)
replacing <- J(setdiff(x[, unique(t)],1))
x[replacing, lag_v := x[replacing, v][,v]]
但是,再次使用双连接似乎效率低下