Если цель состоит в том, чтобы вычислить скользящую сумму из 3 значений так, чтобы неявно добавлялись 0, чтобы гарантировать, что на выходе есть 5 элементов, даже если на входе есть 3, тогда попробуйте следующее:
1) rollapply Умножьте x
и y
и вставьте 0 в зависимости от того, используется ли правое, центральное или левое выравнивание, и от того, используется ли partial=
. align="center"
является значением по умолчанию rollapply
, а align = "right"
является значением по умолчанию rollapplyr
.
library(zoo)
rollapply(c(0, x*y, 0), 3, sum, partial = TRUE)
## [1] 2 5 9 7 4
rollapplyr(c(x*y, 0, 0), 3, sum, partial = TRUE)
## [1] 2 5 9 7 4
rollapplyr(c(0, 0, x*y), 3, sum, align = "left", partial = TRUE)
## [1] 2 5 9 7 4
rollapply(c(0, 0, x*y, 0, 0), 3, sum)
## [1] 2 5 9 7 4
rollsum(c(0, 0, x*y, 0, 0), 3) # this solution has the lowest character count
## [1] 2 5 9 7 4
2) База R Базовое решение может быть написано с использованием embed
:
rowSums(embed(c(0, 0, x*y, 0, 0), 3))
## [1] 2 5 9 7 4
2a) или возьмите накопленную сумму и вычтите совокупную сумму 3 обратно:
cumsum(c(x*y,0,0)) - cumsum(c(0, 0, 0, (x*y)[-3]))
## [1] 2 5 9 7 4
2b) Если идея состоит в том, чтобы выполнить круговой расчет, то:
c(filter(c(0, x*y, 0), c(1,1,1), circular = TRUE))
## [1] 2 5 9 7 4