Как составить сумму каждые 3 значения вектора в R

Я пытаюсь сделать накопленное суммирование любого вектора и получить накопление каждые 3 значения, например:

a: 1
   2
   3
   4
   5
   6
   7
   8
   9
   10 

b = Накопленная сумма значений каждые 3 значения

b =  3
     6
     9
    12
    15
    18
    21
    24
    27
    19

В Matlab это легко решается с b=movsum(a,3), Какой самый простой способ сделать это в R?

3 ответа

Решение
a = 1:10
sapply(seq_along(a), function(i) sum(a[max(1, i-1):min(length(a), i+1)]))
# [1]  3  6  9 12 15 18 21 24 27 19

Вы можете написать свою собственную функцию

movsum = function(x, n){
    before = floor(n - n/2)
    after = n - before - 1
    sapply(seq_along(x), function(i)
        sum(x[max(1, i-before):min(length(a), i+after)]))
}
movsum(1:10, 3)
# [1]  3  6  9 12 15 18 21 24 27 19

Обратите внимание, что если n Равномерно, функция будет занимать меньше элементов справа

zoo пакет имеет rollapply функция, которая позволяет перебирать движущееся окно произвольной ширины, а это значит, что вы можете сделать

zoo::rollapply(1:10, 3, sum, partial = TRUE)
#> [1]  3  6  9 12 15 18 21 24 27 19

rollsum может быть полезным

zoo::rollsum(x, 3)
[1]  6  9 12 15 18 21 24 27
Другие вопросы по тегам