2014-07-01 35 views
1

我試圖使用滯後和數據表符號來延遲變量,以便它是最快的。 這是我試圖做到這一點,在R中的data.table中滯後,這是時間序列面板數據

head(DT) 
setkey(DT,code,year) 

輸出是

 
    code year pt_N_1y ws_country close is_msci 
1: 130104 2003  0  ISRAEL  0  0  
2: 130104 2004  0  ISRAEL  0  0 
3: 130104 2005  0  ISRAEL  0  0  
4: 130104 2006  0  ISRAEL  0  0  
5: 130104 2007  0  ISRAEL  0  0  
6: 130104 2008  0  ISRAEL  0  0 
DT[,L1_is_msci:=.SD[lag(is_msci,1)],by=code] 

這給50個警告,並給所有NA的。 是不是.SD應該通過「代碼」對數據進行子集化並應用功能lag(is_msci, 1)。 我理想上喜歡1行函數來做滯後操作,並且希望使用base函數和數據表符號,因爲它是處理大數據集時最優化的,而不需要安裝許多軟件包。可能嗎?

我想達到什麼是

 
    code year pt_N_1y ws_country close is_msci L1_is_msci 
1: 130104 2003  0  ISRAEL  0  0 NA 
2: 130104 2004  0  ISRAEL  0  0 0 
3: 130104 2005  0  ISRAEL  0  0 0 
4: 130104 2006  0  ISRAEL  0  0 0 
5: 130104 2007  0  ISRAEL  0  0 0 
6: 130104 2008  0  ISRAEL  0  0 0 
+0

你想'.SD [,滯後(is_msci,1)] '? –

+0

不,這不會延遲這個系列,我希望NA在先前沒有觀察時出現在第一個滯後期。這由團體完成。 – Rads

+0

'DT [,L1_is_msci:= lag(is_msci,1),by = code]'? – eddi

回答

1

在未來,請提供reproducible example - 一個從中我們可以只複製/粘貼代碼來獲取數據。

我不確定您使用的是哪個功能lag - 您不顯示它。基本功能lag(來自stats)似乎做了一些不同的事情。如果你正在使用它,難怪你的結果不符合你的期望。測試你正在使用的功能是很容易的:

# base function from package stats 
lag(1:5, k=1L) 
# [1] 1 2 3 4 5 
# attr(,"tsp") 
# [1] 0 4 1 

顯然不是我們想要的。所以,讓我們寫我們自己的函數:

lag <- function(x, n) 
    if (n == 0) x else c(rep.int(NA, n), head(x, -n)) 

# test it 
lag(1:5, 0) 
# [1] 1 2 3 4 5 

lag(1:5, 2) 
# [1] NA NA 1 2 3 

現在,您的申請@ EDDI代碼:

DT[, L1_is_msci := lag(is_msci, 1L), by = code] 
#  code year pt_N_1y ws_country close is_msci L1_is_msci 
# 1: 130104 2003  0  ISRAEL  0  0   NA 
# 2: 130104 2004  0  ISRAEL  0  0   0 
# 3: 130104 2005  0  ISRAEL  0  0   0 
# 4: 130104 2006  0  ISRAEL  0  0   0 
# 5: 130104 2007  0  ISRAEL  0  0   0 
# 6: 130104 2008  0  ISRAEL  0  0   0 

HTH