2017-10-09 3 views
1

Im essayant de faire un sommatoires cumulé de vecteur et obtenir l'accumulation chaque 3 valeurs, par exemple:Comment faire une cumsum chaque 3 valeurs d'un vecteur dans R

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

b = Valeur accumulée somme des valeurs chacune 3 valeurs

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

Dans Matlab, il est facilement résolu avec b=movsum(a,3). Quelle est la manière la plus simple de le faire en R?

+2

'zoo :: rollapply (1:10, 3, somme, partiel = TRUE)' – alistaire

Répondre

2
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 

Vous pouvez vous écrire propre fonction

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 

NOTE que si n est pair, la fonction prendra moins d'éléments sur la droite

1

Le paquet zoo a une fonction rollapply qui vous permet d'itérer sur une fenêtre mobile de largeur arbitraire, ce qui signifie que vous pouvez faire

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

rollsum peut être utile.

zoo::rollsum(x, 3) 
[1] 6 9 12 15 18 21 24 27