2011-01-13 11 views
7

sagen, dass ich die folgende Matrix habe:ein Tagesmittels in R Berechnung

x1 = 1:288 
x2 = matrix(x1,nrow=96,ncol=3) 

Gibt es einen einfachen Weg, um die Mittel der Reihen 1 zu erhalten: 24,25: 48,49: 72,73: 96 für Spalte 2?

Grundsätzlich habe ich ein Jahr Zeitreihe und ich muss alle 24 Stunden einige Daten durchschnittlich.

Antwort

8

Es gibt.

Angenommen, wir die Tage haben:

Days <- rep(1:4,each=24) 

Sie

tapply(x2[,2],Days,mean) 

leicht tun könnte, wenn Sie einen Datenrahmen mit einer Datumsvariablen haben, können Sie diese verwenden. Sie können auf einmal für alle Variablen zu tun, Aggregat mit:

x2 <- as.data.frame(cbind(x2,Days)) 
aggregate(x2[,1:3],by=list(Days),mean) 

Werfen Sie einen Blick auf die Hilfedateien dieser Funktionen mit zu beginnen. Auch eine Suche hier gibt es einige ganz andere interessante Antworten auf dieses Problem:

PS: Wenn Sie vorhaben, viel Zeitreihen zu tun, sollten Sie Werfen Sie einen Blick auf die zoo Paket (auf CRAN: http://cran.r-project.org/web/packages/zoo/index.html)

+0

@SnowFrog Sie liegen falsch. tapply erstellt keinen Datenrahmen. Es erstellt einen Vektor (in diesem Fall). Großer Unterschied. –

+0

Ein Problem mit der 'tapply' Methode ist, dass es einen Vektor erstellt (Anzahl der Spalten = Anzahl der Tage).Die "aggregate" -Methode erstellt einen Datenrahmen (1 Spalte mit Anzahl der Zeilen = Anzahl der Tage), was praktischer sein kann, wenn eine nachfolgende Manipulation der Daten benötigt wird. – SnowFrog

2

Ganz kompakt und rechenintensiv ist dies, um den Vektor in eine geeignete Matrix umzuformen und die Spalte me zu berechnen ans.

colMeans(matrix(x2[,2],nrow=24)) 
+0

saubere Lösung, vorausgesetzt, dass nirgends Daten fehlen. Sonst würde die Matrix nicht die Tage darstellen. –

+0

Sie müssen bei dieser Methode vorsichtig sein, damit die Abmessungen stimmen. Aber Sie können mit fehlenden Daten umgehen, indem Sie NA für diese verwenden und na.rm = TRUE –

+0

verwenden. Ich bin mir dessen bewusst :-) Ich meine fehlt im Sinne von "nicht jeden Tag hat 24 Zeilen von Daten" –

4

1) ts. Da dies eine regelmßig beabstandeten Zeitreihe ist, wandelt es in eine Serie ts und dann Aggregieren von Frequenz zu Frequenz 24 1:

> aggregate(ts(x2[, 2], freq = 24), 1, mean) 

geben:

Time Series: 
Start = 1 
End = 4 
Frequency = 1 
[1] 108.5 132.5 156.5 180.5 

2) Zoo. Hier ist es mit Zoo. Das Zoo-Paket kann auch unregelmäßig beabstandete Serien verarbeiten (wenn wir das verlängern müssten). Unterhalb day.hour ist die Tag-Nummer (1, 2, 3, 4) sowie die Stunde, als Bruchteil des Tages, so dass floor(day.hour) nur die Tageszahl ist:

> library(zoo) 
> day.hour <- seq(1, length = length(x2[, 2]), by = 1/24) 
> z <- zoo(x2[, 2], day.hour) 
> aggregate(z, floor, mean) 
    1  2  3  4 
108.5 132.5 156.5 180.5 

Wenn zz die Ausgabe ist dann coredata(zz) und time(zz) sind die Werte bzw. Zeiten als gewöhnliche Vektoren.

+0

+1 für die Darstellung wie man zoo und ts dafür benutzt. Ich habe es nicht erwähnt, weil ich nicht zu sehr auf die Daten im wirklichen Problem eingehen wollte, aber es ist definitiv relevant und hilfreich. –

Verwandte Themen