4

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为大型数据集生成相当大的数据,因此我对使用它犹豫不决。

4

1 回答 1

5

我不确定这与您的方法有什么不同,但是您可以使用xid

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]]

但同样,在这里使用双重连接似乎效率低下

于 2012-10-23T00:10:23.597 回答