2013-01-17 4 views
7

Attualmente ho una funzione di utilità che lags cose in data.table per gruppo. La funzione è semplice:ritardo in 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))) 
    } 
} 

posso quindi chiamare questo da un 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 

Ciò richiede che posso controllare dentro panel_lag se x è calettata. C'è un modo migliore per fare ritardare? Le tabelle tendono ad essere grandi, quindi dovrebbero essere veramente modificate. Faccio solo il setkey prima di ritardarmi. Mi piacerebbe essere sicuro di non dimenticarmi di crearli. Quindi mi piacerebbe sapere se c'è un modo standard in cui le persone lo fanno.

+0

+1 Cosa succede se 'x' è codificato, ma da un'altra colonna (non' dte') per errore? –

+0

@MatthewDowle: sì, questo è esattamente giusto .. è un altro problema. Ho il sospetto che possa essere necessario che la funzione accetti il ​​nome della colonna di ordinamento per verificare se questa è la chiave – Alex

+0

Cosa succede se 'dte' è la terza colonna di una chiave di 3 colonne e la query esegue' by = 'la seconda colonna di il tasto? la chiave non è usata, ma 'x' è keyed e' dte' è nella chiave. –

risposta

4

Se si vuole garantire che si lag in ordine di qualche altra colonna, è possibile utilizzare la funzione order:

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

Anche se si sta facendo un sacco di cose in ordine di data non avrebbe molto senso per accenderlo in quel modo.

+0

grazie! ma i tavoli tendono ad essere grandi, quindi il key-ing è una buona idea, penso – Alex

+0

Non credo di aver capito la domanda come modificata ora. Cosa c'è di sbagliato nell'uso di 'setkey' prima di eseguire la funzione? Stai cercando una singola riga che imposterà la chiave e ritarderà la variabile? –

+0

non c'è niente di sbagliato in questo. questo è quello che faccio adesso. ma io cosa succede se mi dimentico di farlo nel codice? questo è quello che vorrei essere sicuro che non succedesse – Alex