Qual è il modo migliore (più veloce) per implementare una funzione finestra scorrevole con il pacchetto data.table?R data.table sliding window
Sto provando a calcolare una media mobile, ma ho più righe per data (a causa di 2 fattori aggiuntivi), che penso significhi che la funzione di rollapply dello zoo non funzionerebbe. Ecco un esempio di naive for loop:
library(data.table)
df <- data.frame(
id=30000,
date=rep(as.IDate(as.IDate("2012-01-01")+0:29, origin="1970-01-01"), each=1000),
factor1=rep(1:5, each=200),
factor2=1:5,
value=rnorm(30, 100, 10)
)
dt = data.table(df)
setkeyv(dt, c("date", "factor1", "factor2"))
get_window <- function(date, factor1, factor2) {
criteria <- data.table(
date=as.IDate((date - 7):(date - 1), origin="1970-01-01"),
factor1=as.integer(factor1),
factor2=as.integer(factor2)
)
return(dt[criteria][, value])
}
output <- data.table(unique(dt[, list(date, factor1, factor2)]))[, window_median:=as.numeric(NA)]
for(i in nrow(output):1) {
print(i)
output[i, window_median:=median(get_window(date, factor1, factor2))]
}
+1, buona domanda. – Ryogi
+1. Puoi fornire maggiori informazioni su dimensioni e tempi dei dati. Dal tuo commento alla risposta di Alan (Alan e Alan sono persone diverse?), Ci vogliono 6.4 secondi (contro 973 per 'data.frame') e vorresti migliorare ulteriormente i 6.4? –
Alan e Alan sono persone diverse :). Il set di dati ha ~ 650.000 righe. Ho trovato una soluzione che funziona molto più velocemente ma richiede molta memoria. Qualche idea su come può essere ulteriormente migliorata? – alan