Использование cumsum
должно быть достаточным и эффективным. Предполагая, что у вас есть вектор x и вы хотите получить текущую сумму n чисел
cx <- c(0,cumsum(x))
rsum <- (cx[(n+1):length(cx)] - cx[1:(length(cx) - n)]) / n
Как указано в комментариях @mzuther, это предполагает, что в данных нет NA. чтобы справиться с этим, потребуется разделить каждое окно на количество значений, не относящихся к NA. Вот один из способов сделать это, включив комментарий @Ricardo Cruz:
cx <- c(0, cumsum(ifelse(is.na(x), 0, x)))
cn <- c(0, cumsum(ifelse(is.na(x), 0, 1)))
rx <- cx[(n+1):length(cx)] - cx[1:(length(cx) - n)]
rn <- cn[(n+1):length(cx)] - cn[1:(length(cx) - n)]
rsum <- rx / rn
По-прежнему существует проблема, заключающаяся в том, что если все значения в окне являются NA, тогда будет ошибка деления на ноль.