Команда Matlab buffer
может быть выражена с помощью rollapply
из зоопарка. Следующий вкладыш дает тот же результат, что и buffer(x, n, p)
, и, кажется, работает для неотрицательного p:
> library(zoo)
> x <- 1:30
> n <- 7
> p <- 3
> unname(t(rollapply(zoo(c(rep(0, p), x, rep(0, n-p))), n, by = n-p, c)))
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 0 2 6 10 14 18 22 26
[2,] 0 3 7 11 15 19 23 27
[3,] 0 4 8 12 16 20 24 28
[4,] 1 5 9 13 17 21 25 29
[5,] 2 6 10 14 18 22 26 30
[6,] 3 7 11 15 19 23 27 0
[7,] 4 8 12 16 20 24 28 0
В версии для разработчиков в зоопарке это можно немного сократить до:
t(rollapply(c(rep(0, p), x, rep(0, n-p)), n, by = n-p, c))
EDIT:
Обратите внимание, что когда на вопрос был впервые дан ответ, то была версия разработки zoo, ставшая производственной версией zoo на CRAN, поэтому теперь работает более короткая вторая версия кода.