2013-01-17 14 views
7

Şu anda lags öğesinin data.table grubuna göre bir yardımcı işlevine sahibim. fonksiyonu basit: O zaman bir data.table bu çağırabilirsinizdata.table'da gecikme var 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))) 
    } 
} 

:

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 

Bu benim x anahtarlı olup olmadığını panel_lag iç kontrol gerektirir. Gecikme yapmak için daha iyi bir yolu var mı? Tablolar büyük olma eğilimindedir, bu yüzden gerçekten anahtarlanması gerekir. Sadece gecikmeden önce setkey yapıyorum. Onları tuşlamayı ihmal etmediğime emin olmak isterim. Bu yüzden, insanların bunu yapmasının standart bir yolu olup olmadığını bilmek istiyorum. Eğer tarih düzenine mantıklı olur içinde çok şey yapıyoruz eğer

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

olsa: Eğer başka sütunun sırayla gecikme sağlamak istiyorsanız

+0

+1 x 'anahtarlıysa, ancak başka bir sütunla (dte değil) kaza sonucu ne olur? –

+0

@MatthewDowle: evet, bu tam olarak doğru .. başka bir sorun. Bu fonksiyonun, anahtarın – Alex

+0

anahtar olup olmadığını kontrol etmek için sıralama sütununun ismini kabul etmesi gerektiğinden şüpheleniyorum. Eğer dte bir 3 sütun anahtarının 3. sütunu ise ve sorgu '= = 2 sütununda ise anahtar? Yani anahtar kullanılmaz, ancak 'x' anahtarlanır ve anahtarda dte bulunur. –

cevap

4

, sen order işlevini kullanabilirsiniz Bu şekilde anahtar.

+0

teşekkürler! ama tablolar büyük olma eğilimindedir, bu yüzden anahtarlama iyi bir fikirdir. – Alex

+0

sanırım şu an soruyu şu an düzenlediğimi sanmıyorum. İşlevinizi gerçekleştirmeden önce 'setkey' kullanmanın nesi yanlış? Anahtarı ayarlayacak ve değişkeni geciktirecek tek bir satır mı arıyorsunuz? –

+0

bununla ilgili hiçbir sorun yok. Ben şimdi yapıyorum. ama ben bunu kodda yapmayı unutursam ne olur? emin olmak istediğim şey budur – Alex