¿Cuál es la mejor forma (más rápida) de implementar una función de ventana deslizante con el paquete data.table?R data.table sliding window
Estoy tratando de calcular una mediana móvil pero tengo varias filas por fecha (debido a 2 factores adicionales), lo que creo que significa que la función rollapply del zoológico no funcionaría. Aquí hay un ejemplo usando un ingenuo para bucle:
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, buena pregunta. – Ryogi
+1 también. ¿Puede proporcionar más información sobre el tamaño y el horario de los datos? De tu comentario a la respuesta de Alan (¿Alan y Alan son personas diferentes?), Se necesitan 6.4s (vs 973s para 'data.frame') y quisieras mejorar 6.4s más? –
Alan y Alan son personas diferentes :). El conjunto de datos tiene ~ 650,000 filas. Se me ocurrió una solución que funciona mucho más rápido pero requiere mucha memoria. ¿Alguna idea sobre cómo se puede mejorar aún más? – alan