2012-10-22 29 views
4

我目前落後於下述方式使用data.table面板數據:滯後面板數據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,所以我很猶豫要使用它。

+3

'V [1 :(length(v)-1)]'是危險的(考慮一個單行的'id'會發生什麼)。如下所示使用'head(v,-1)'是正確的選擇。 – flodel

+0

是的,非常好的一點!謝謝。 – Alex

+0

我應該只是提到,在我的代碼我做如果(長(V)> 1){} ..但'頭'解決方案肯定是更好 – Alex

回答

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

但同樣,使用雙連接在這裏似乎低效

+0

謝謝!我們會看看是否有其他人想出了不同的東西 – Alex

+0

看起來這是最好的方式! – Alex