J'ai un vecteur de valeurs que je voudrais signaler la moyenne dans les fenêtres le long d'une petite diapositive.
Par exemple, pour un vecteur des valeurs suivantes:
4, 5, 7, 3, 9, 8
Une taille de fenêtre de 3 et une diapositive de 2 feraient ce qui suit:
(4+5+7)/3 = 5.33
(7+3+9)/3 = 6.33
(9+8)/3 = 5.67
Et retournez un vecteur de ces valeurs:
5.33, 6.33, 5.67
Y a-t-il une fonction simple qui fera cela pour moi? S'il renvoyait également les indices de la fenêtre, ce serait un bonus supplémentaire. Dans cet exemple, ce serait 1,3,5
Réponses:
La fonction
rollapply
du package zoo vous rapproche:Il ne calculera tout simplement pas la dernière valeur pour vous car il ne contient pas 3 observations. Peut-être que ce sera suffisant pour votre vrai problème? Notez également que l'objet renvoyé a les indices que vous souhaitez en tant que du
names
vecteur renvoyé.Votre exemple fait l'hypothèse qu'il y a un 0 non observé dans la dernière fenêtre. Il peut être plus utile ou réaliste de remplir avec un
NA
pour représenter les informations manquantes et de diremean
de gérer les valeurs manquantes. Dans ce cas, nous aurons (8 + 9) / 2 comme valeur fenêtrée finale.la source
x<-c(x,0)
) pour obtenir le dernier élément de réponse.na.rm = TRUE
argument àmean
. La réponse ne sera pas la même que celle demandée par le PO, mais elle semble plus utile. Je vais modifier ma réponse pour l'inclure.Rollapply fonctionne très bien avec un petit ensemble de données. Cependant, si vous travaillez avec plusieurs millions de lignes (génomique), c'est assez lent.
La fonction suivante est super rapide.
http://coleoguy.blogspot.com/2014/04/sliding-window-analysis.html
la source
-1
(à la plage) et un+1
(à la boucle).Cette simple ligne de code fait la chose:
si
x
est le vecteur en question.la source
(c(0,0,x)+c(0,x,0)+c(x,0,0))/3
ce que je veux dire (et comment ça marche). La formule appropriée serait:(c(0,0,x)+c(0,x,0)+c(x,0,0))[1:(length(x)-3)*2+1]/3
(nous devons couper le remplissage 0 au début et sélectionner ensuite les éléments pairs.ou
la source
réponse de shabbychef dans R:
EDIT: Les indices que vous recherchez sont juste
idx1
... cette fonction peut être facilement modifiée pour les renvoyer également, mais il est presque aussi rapide de les recréer avec un autre appel àseq(1,length(x),by=slide)
.la source
fromo::running_mean
de la version de pointe de mon package fromo .Je peux le faire facilement dans Matlab et canard pendant que vous me downvote:
comme effet secondaire,
idx1
est l'indice de l'élément dans la somme. Je suis sûr que cela peut être facilement traduit en R. L'idiomefirst:skip:last
dans Matlab donne le tableau en premier, premier + saut, premier + 2 saut, ..., premier + n saut, où le dernier élément du tableau n'est pas supérieur àlast
.edit : j'avais omis la partie moyenne (diviser par
windowsize
).la source
Cela vous donnera les moyennes de la fenêtre et l'index de la première valeur de la fenêtre:
Diverses mises en garde s'appliquent: je n'ai pas testé cela par rapport à vos données d'échantillon; Je crois que l'ajout à des trames de données comme celle-ci peut devenir très lent si vous avez beaucoup de valeurs (car cela copiera le data.frame à chaque fois); etc. Mais cela produit ce que vous avez demandé.
la source
rollapply
).rollapply
est beaucoup plus facile à comprendre et à comprendre l'intention de. En outre, ilrollapply
est probable qu'il y ait eu beaucoup plus de globes oculaires vérifiant son code que quelque chose que je pourrais cuisiner un après-midi. Chevaux de course.[i:(i+2)]
pour[i:(i+win.size-1)]
rendre le code plus général, je pense.