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.
+1 Cosa succede se 'x' è codificato, ma da un'altra colonna (non' dte') per errore? –
@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
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. –