2013-01-17 157 views
7

目前我有一個實用功能lagsdata.table按組。功能很簡單:滯後data.table R

panel_lag <- function(var, k) { 
    if (k > 0) { 
    # Bring past values forward k times 
    return(c(rep(NA, k), head(var, -k))) 
    } else { 
    # Bring future values backward 
    return(c(tail(var, k), rep(NA, -k))) 
    } 
} 

然後我就可以從data.table稱之爲:

x = data.table(a=1:10, 
       dte=sample(seq.Date(from=as.Date("2012-01-20"), 
            to=as.Date("2012-01-30"), by=1), 
          10)) 
x[, L1_a:=panel_lag(a, 1)] # This won't work correctly as `x` isn't keyed by date 
setkey(x, dte) 
x[, L1_a:=panel_lag(a, 1)] # This will 

這就要求我檢查裏面panel_lagx是否被鍵入。有沒有更好的方法來做滯後?這些表格往往很大,所以它們應該真的被鎖定。在我滯後之前,我只是做了setkey。我想確保我不會忘記關鍵。所以我想知道是否有一個標準的方式,人們這樣做。

+0

+1如果'x'被鍵入,但是被另一列(而不是'dte')意外? –

+0

@MatthewDowle:是的,這是完全正確的..這是另一個問題。我懷疑我可能必須讓該函數接受排序列的名稱,以檢查它是否爲鍵 – Alex

+0

如果'dte'是3列鍵的第3列,而查詢做了'by ='第二列鑰匙?即密鑰沒有被使用,但'x'被鍵入並且'dte'在密鑰中。 –

回答

4

如果你想確保你在一些列的滯後,你可以使用order功能:

x[order(dte),L1_a:=panel_lag(a,1)] 

但如果你按照日期順序它將使意義做了很多事情以這種方式來鎖定它。

+0

謝謝!但表格往往​​很大,所以鍵入是一個好主意,我認爲 – Alex

+0

我不認爲我理解現在編輯的問題。在執行你的功能之前使用'setkey'有什麼問題?你在尋找一個能夠設置密鑰並延遲變量的行嗎? –

+0

沒有什麼不對。這就是我現在所做的。但是,如果我忘記在代碼中這麼做,該怎麼辦?這就是我想確保不會發生的事 – Alex