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

これがあなたのアプローチとそれほど異なるかどうかはわかりませんが、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]]

ただし、ここで二重結合を使用すると効率が悪いようです

于 2012-10-23T00:10:23.597 に答える