Ventana corredera de datos R

¿Cuál es la mejor manera (más rápida) de implementar una función de ventana deslizante con el paquete data.table?

Estoy tratando de calcular una mediana móvil pero tengo múltiples filas por fecha (debido a 2 factores adicionales), lo que creo que significa que la función de 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))]
}

Respuestas a la pregunta(3)

Su respuesta a la pregunta