2012-05-28 17 views
21

Ok, zweite R Frage in schneller Folge.ddply + Zusammenfassung für die Wiederholung der gleichen statistischen Funktion über eine große Anzahl von Spalten

Meine Daten:

  Timestamp St_01 St_02 ... 
1 2008-02-08 00:00:00 26.020 25.840 ... 
2 2008-02-08 00:10:00 25.985 25.790 ... 
3 2008-02-08 00:20:00 25.930 25.765 ... 
4 2008-02-08 00:30:00 25.925 25.730 ... 
5 2008-02-08 00:40:00 25.975 25.695 ... 
... 

Grundsätzlich normalerweise würde ich eine Kombination aus ddply und summarize verwenden Ensembles zu berechnen (beispielsweise für jede Stunde über das ganze Jahr bedeuten).

In dem obigen Fall würde ich eine Kategorie, z. Stunde (zB strptime(data$Timestamp,"%H") -> data$hour und dann diese Kategorie in ddply, wie ddply(data,"hour", summarize, St_01=mean(St_01), St_02=mean(St_02)...) auf durchschnittlich über jede der Spalten nach Kategorie verwenden.

aber hier ist, wo es klebrig wird. ich mehr als 40 Spalten zu behandeln und ich bin nicht Ich schrieb eine Schleife in der Shell, um diesen Code zu generieren, aber das ist nicht, wie Programmierer Probleme lösen, ist es?

Also bitte sagen, hat jemand eine bessere Möglichkeit, das gleiche Ergebnis zu erreichen, aber mit weniger Tastenanschlägen?

+0

Verwenden 'numcolwise()' – Andrie

+2

Oder das 'St' Variablen langen umformen dann Funktionen Ihrer Liebling Aggregation verwenden' by', 'aggregate',' ddply' von 'c (Stunde zu kombinieren , index) ', wobei' index' die in der Umformung erzeugte Variable ist. –

+0

einfache punkte für ya :-) –

Antwort

36

Sie können numcolwise() verwenden, um eine Zusammenfassung über alle n auszuführen umerische Spalten.

Hier ist ein Beispiel unter Verwendung von iris:

ddply(iris, .(Species), numcolwise(mean)) 
    Species Sepal.Length Sepal.Width Petal.Length Petal.Width 
1  setosa  5.006  3.428  1.462  0.246 
2 versicolor  5.936  2.770  4.260  1.326 
3 virginica  6.588  2.974  5.552  2.026 

Ebenso gibt es catcolwise(), um alle kategorischen Spalten zusammenfassen über.

Weitere Informationen und Beispiele finden Sie unter ?numcolwise.


EDIT

Ein alternativer Ansatz ist reshape2 (vorgeschlagen von @ GSK3) zu verwenden. Dies hat mehrere Tastenanschläge in diesem Beispiel, sondern gibt Ihnen eine enorme Flexibilität:

Bibliothek (reshape2)

miris <- melt(iris, id.vars="Species") 
x <- ddply(miris, .(Species, variable), summarize, mean=mean(value)) 

dcast(x, Species~variable, value.var="mean") 
    Species Sepal.Length Sepal.Width Petal.Length Petal.Width 
1  setosa  5.006  3.428  1.462  0.246 
2 versicolor  5.936  2.770  4.260  1.326 
3 virginica  6.588  2.974  5.552  2.026 
+0

sieht gut aus! Vielen Dank! –

+0

eine Sache. Wie funktioniert es mit zusammenfassen? cos ich muss kategorisch innerhalb jeder Spalte auch zusammenfassen. –

+1

Ich bin mir nicht sicher, was du meinst. Die Verwendung von 'colwise' oder Familie bedeutet normalerweise, dass Sie' summarize' nicht verwenden müssen. Kannst du bitte auf deine Frage eingehen? – Andrie

7

Sie können sogar den zweiten Ansatz von Andrie vorgeschlagen vereinfachen, indem die ddply Anruf vollständig weggelassen wird. Geben Sie einfach mean als Aggregationsfunktion im dcast Aufruf:

library(reshape2) 
miris <- melt(iris, id.vars="Species") 
dcast(miris, Species ~ variable, mean) 

    Species Sepal.Length Sepal.Width Petal.Length Petal.Width 
1  setosa  5.006  3.428  1.462  0.246 
2 versicolor  5.936  2.770  4.260  1.326 
3 virginica  6.588  2.974  5.552  2.026 

Das gleiche Ergebnis auch sehr schnell berechnet werden kann, das data.table Paket. Die .SD-Variable im j-Ausdruck ist eine spezielle data.table-Variable, die die Teilmenge von Daten für jede Gruppe enthält, mit Ausnahme aller Spalten, die in by verwendet werden.

library(data.table) 
dt_iris <- as.data.table(iris) 
dt_iris[, lapply(.SD, mean), by = Species] 

    Species Sepal.Length Sepal.Width Petal.Length Petal.Width 
1:  setosa  5.006  3.428  1.462  0.246 
2: versicolor  5.936  2.770  4.260  1.326 
3: virginica  6.588  2.974  5.552  2.026 

Eine weitere Option wäre die neue Version 0.2 von dplyr Paket Hadley

library(dplyr) 
group_by(iris, Species) %>% summarise_each(funs(mean)) 

Source: local data frame [3 x 5] 

    Species Sepal.Length Sepal.Width Petal.Length Petal.Width 
1  setosa  5.006  3.428  1.462  0.246 
2 versicolor  5.936  2.770  4.260  1.326 
3 virginica  6.588  2.974  5.552  2.026