【问题标题】:lagging panel data with data.table带有 data.table 的滞后面板数据
【发布时间】:2012-10-12 20:25:53
【问题描述】:

我目前使用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,所以我犹豫是否要使用它。

【问题讨论】:

  • v[1:(length(v)-1)] 很危险(想想id 会发生什么情况)。按照下面的建议使用head(v, -1) 是正确的做法。
  • 是的,非常好!谢谢。
  • 我应该在我的代码中提到,如果 (length(v)>1) {} .. 但head 解决方案肯定更好

标签: r time-series data.table


【解决方案1】:

我不确定这与您的方法有多大不同,但您可以使用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]]

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

【讨论】:

  • 谢谢!我们会看看是否有其他人提出了不同的建议
  • 看起来这是最好的方法!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-13
  • 2014-12-02
  • 1970-01-01
  • 2023-01-19
  • 1970-01-01
  • 1970-01-01
  • 2022-09-26
相关资源
最近更新 更多