Вот некоторые подходы:
1) частичное=ИСТИНА
n <- length(x)
c(NA, rollapplyr(x, 12, mean, partial = TRUE)[-n])
Обратите внимание на r в конце rollapplyr
.
2) ширина в виде списка Аргумент width
функции rollapply
может быть списком, в котором i-й элемент списка является вектором смещений, используемых для i-го скользящего вычисления. Если мы укажем partial=TRUE, то смещения, выходящие за конец вектора, будут игнорироваться. Если мы укажем только один элемент в списке, он будет переработан:
rollapply(x, list(-seq(12)), mean, partial = TRUE, fill = NA)
2a) Вместо того, чтобы перерабатывать и в зависимости от partial
, мы можем записать его. Здесь нам нужно width <- list(numeric(0), -1, -(1:2), -(1:3), ..., -(1:12), ..., -(1:12))
, которое можно рассчитать следующим образом:
width <- lapply(seq_along(x), function(x) -seq_len(min(12, x-1)))
rollapply(x, width, mean)
Это в основном будет представлять интерес, если вы хотите немного изменить спецификацию, потому что она очень гибкая.
Примечание. Позже в комментариях автор попросил использовать то же скользящее среднее, за исключением того, что оно не должно отставать. Это было бы просто:
rollapplyr(x, 12, mean, partial = TRUE)
Обратите внимание на r в конце rollapplyr
.
Обновление Некоторые улучшения и дополнительные решения.
person
G. Grothendieck
schedule
08.07.2014