Ich habe einen Vektor von Werten, die ich den Durchschnitt in Fenstern entlang einer kleineren Folie angeben möchte.
Zum Beispiel für einen Vektor mit den folgenden Werten:
4, 5, 7, 3, 9, 8
Eine Fenstergröße von 3 und eine Folie von 2 würden Folgendes bewirken:
(4+5+7)/3 = 5.33
(7+3+9)/3 = 6.33
(9+8)/3 = 5.67
Und geben Sie einen Vektor dieser Werte zurück:
5.33, 6.33, 5.67
Gibt es eine einfache Funktion, die dies für mich erledigt? Wenn auch die Indizes des Fensters zurückgegeben werden, ist dies ein zusätzlicher Bonus. In diesem Beispiel wäre das 1,3,5
Antworten:
Die Funktion
rollapply
im Paket zoo bringt Sie näher:Es wird einfach nicht der letzte Wert für Sie berechnet, da es keine 3 Beobachtungen enthält. Vielleicht reicht das für Ihr eigentliches Problem aus? Beachten Sie außerdem, dass das zurückgegebene Objekt die gewünschten Indizes
names
für den zurückgegebenen Vektor hat.In Ihrem Beispiel wird davon ausgegangen, dass im letzten Fenster eine unbeobachtete 0 vorhanden ist. Es kann nützlicher oder realistischer sein, mit einem zu füllen
NA
, um die fehlenden Informationen darzustellen und zu sagen,mean
wie mit fehlenden Werten umzugehen ist. In diesem Fall haben wir (8 + 9) / 2 als endgültigen Fensterwert.quelle
x<-c(x,0)
) eine 0 einfügen , um das letzte Antwortelement zu erhalten.na.rm = TRUE
Argument an weiterzuleitenmean
. Die Antwort stimmt nicht mit der des OP überein, scheint jedoch nützlicher zu sein. Ich werde meine Antwort bearbeiten, um dies einzuschließen.Rollapply funktioniert hervorragend mit einem kleinen Datensatz. Wenn Sie jedoch mit mehreren Millionen Zeilen (Genomics) arbeiten, ist dies recht langsam.
Die folgende Funktion ist super schnell.
http://coleoguy.blogspot.com/2014/04/sliding-window-analysis.html
quelle
-1
(zum Bereich) und ein+1
(zur Schleife) hinzu.Diese einfache Codezeile macht das Ding:
Wenn
x
ist der Vektor in Frage.quelle
(c(0,0,x)+c(0,x,0)+c(x,0,0))/3
an, was ich meine (und wie es funktioniert). Die richtige Formel wäre:(c(0,0,x)+c(0,x,0)+c(x,0,0))[1:(length(x)-3)*2+1]/3
(wir müssen am Anfang 0-Padding ausschneiden und dann gerade Elemente auswählen.oder
quelle
shabbychefs antwort in R:
BEARBEITEN: Die Indizes, nach denen Sie suchen, sind nur
idx1
... Diese Funktion kann leicht modifiziert werden, um sie auch zurückzugeben, aber es ist fast genauso schnell, sie mit einem anderen Aufruf von neu zu erstellenseq(1,length(x),by=slide)
.quelle
fromo::running_mean
aus der neuesten Version meines Fromo-Pakets .Ich kann das leicht in Matlab und duck machen, während du mich abstimmst:
Als Nebeneffekt
idx1
ist der Index des Elements in der Summe. Ich bin sicher, dass dies leicht in R übersetzt werden kann. Die Redewendungfirst:skip:last
in Matlab gibt das Array first, first + skip, first + 2skip, ..., first + n skip an, wobei das letzte Element im Array nicht größer als istlast
.edit : Ich hatte den Mittelwertbildungsteil weggelassen (dividiere durch
windowsize
).quelle
Damit erhalten Sie die Fenstermittel und den Index des ersten Wertes des Fensters:
Es gelten verschiedene Einschränkungen: Sie haben dies nur anhand Ihrer Beispieldaten getestet. Ich glaube, dass das Anhängen an Datenrahmen wie diesen sehr langsam werden kann, wenn Sie viele Werte haben (da der data.frame jedes Mal kopiert wird). usw. Aber es produziert, was Sie gefragt haben.
quelle
rollapply
).rollapply
einlineare Methode viel einfacher zu verstehen und die Absicht von zu begreifen. Auchrollapply
ist wahrscheinlich viel mehr Augäpfel Überprüfung seinen Code als etwas zu haben , hatte ich an einem Nachmittag kochen könnte. Pferde für Kurse.[i:(i+2)]
von[i:(i+win.size-1)]
würde den Code allgemeiner machen, denke ich.