2009-12-11 4 views
1

J'ai décidé d'apprendre R. Je cherche à comprendre comment écrire des fonctions de type "R" et éviter les boucles. Voici une situation exemple:Eviter les boucles dans R

Étant donné un vecteur a, je voudrais calculer un vecteur b dont les éléments b[i] (l'indice vectoriel commence à 1) sont définis comme suit:

1 <= i <= 4: 
b[i] = NaN 

5 <= i <= length(a): 
b[i] = mean(a[i-4] to a[i]) 

Essentiellement, si nous prétendre 'a' est une liste de vitesses où la première entrée est à temps = 0, la seconde à temps = 1 seconde, la troisième à temps = 2 secondes ... Je voudrais obtenir un vecteur correspondant décrivant la vitesse moyenne sur les 5 dernières secondes.

.: Si par exemple a is (1,1,1,1,1,4,6,3,6,8,9) alors b devrait être (NaN, NaN, NaN, NaN, 1, 1.6, 2.6, 3, 4, 5.4, 6.4)

je pourrais le faire en utilisant une boucle, mais je pense que le faire ne serait pas dans le « style R ».

Merci,

Tungata

Répondre

3

Quelque chose comme b = filter(a, rep(1.0/5, 5), sides=1) fera le travail, bien que vous obtiendrez probablement des zéros dans les premières fentes, au lieu de NaN. R a une grande bibliothèque de fonctions intégrées, et "R style" est d'utiliser ceux-ci dans la mesure du possible. Jetez un oeil à la documentation de la fonction filter.

+0

Oui, c'est probablement la mise en œuvre de moyenne mobile la plus simple possible –

5

Parce que ces fonctions de roulement appliquent souvent avec des données de séries chronologiques, quelques-uns des plus récents et les plus riches paquets de données de manipulation de séries chronologiques font déjà pour vous:

R> library(zoo) ## load zoo 
R> speed <- c(1,1,1,1,1,4,6,3,6,8,9) 
R> zsp <- zoo(speed, order.by=1:length(speed)) ## creates a zoo object 
R> rollmean(zsp, 5)        ## default use 
    3 4 5 6 7 8 9 
1.0 1.6 2.6 3.0 4.0 5.4 6.4 
R> rollmean(zsp, 5, na.pad=TRUE, align="right") ## with padding and aligned 
    1 2 3 4 5 6 7 8 9 10 11 
NA NA NA NA 1.0 1.6 2.6 3.0 4.0 5.4 6.4 
R> 

Le zoo a une excellente documentation montrerez vous beaucoup, beaucoup d'autres exemples, en particulier comment faire cela avec des dates réelles (et éventuellement irrégulières); xts étend cela plus loin mais zoo est un meilleur point de départ.

1

Vous pouvez également utiliser une combinaison de cumsum et diff pour obtenir la somme sur les fenêtres coulissantes. Vous aurez besoin de pad avec votre propre NaN, bien que:

> speed <- c(1,1,1,1,1,4,6,3,6,8,9) 
> diff(cumsum(c(0,speed)), 5)/5 
[1] 1.0 1.6 2.6 3.0 4.0 5.4 6.4