2012-05-28 8 views
21

Ok, seconda domanda R in rapida successione.ddply + riepilogare per ripetere la stessa funzione statistica su un gran numero di colonne

I miei dati:

  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 ... 
... 

In sostanza normalmente vorrei usare una combinazione di ddply e summarize per calcolare complessi (ad esempio significare per ogni ora attraverso tutto l'anno).

Nel caso precedente, vorrei creare una categoria, ad es. ora (ad esempio strptime(data$Timestamp,"%H") -> data$hour e quindi utilizzare tale categoria in ddply, come ddply(data,"hour", summarize, St_01=mean(St_01), St_02=mean(St_02)...) alla media per categoria attraverso ciascuna delle colonne.

ma qui è dove ottiene appiccicoso. Ho più di 40 colonne per affrontare e io non sono preparato per digitarli tutti uno per uno come parametri per la funzione summarize. Ho usato per scrivere un ciclo in shell per generare questo codice ma non è così che i programmatori risolvono i problemi è vero?

Quindi, per favore, qualcuno ha una migliore modo di ottenere lo stesso risultato ma con meno battute?

+0

Usa 'numcolwise()' – Andrie

+2

o rimodellare le variabili 'St' lungo quindi utilizzare le funzioni di aggregazione preferiti' by', 'aggregate',' ddply' combinare da 'c (ora , indice) ', dove' index' è la variabile creata nella risagoma. –

+0

punti facili per te :-) –

risposta

36

È possibile utilizzare numcolwise() per eseguire un riepilogo su tutto il n colonne umeric.

Ecco un esempio utilizzando 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 

Analogamente, non v'è catcolwise() riassumere su tutte le colonne categoriali.

Vedere ?numcolwise per ulteriori informazioni ed esempi.


EDIT

Un approccio alternativo consiste nell'utilizzare reshape2 (proposto da GSK3 @). Questo ha più battute in questo esempio, ma ti dà grande flessibilità:

libreria (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

sembra buono! Grazie! –

+0

una cosa. come funziona con riassumere? cos ho bisogno di riassumere categoricamente anche all'interno di ogni colonna. –

+1

Non sono sicuro di cosa intendi. Usare 'colwise' o famiglia di solito significa che non è necessario usare' riepiloga'. Puoi per favore espandere la tua domanda? – Andrie

7

Si può anche semplificare il secondo approccio proposto da Andrie omettendo completamente la chiamata ddply. Basta specificare mean come la funzione di aggregazione nella chiamata dcast:

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 

Lo stesso risultato può essere calcolato anche molto veloce utilizzando il pacchetto data.table. La variabile .SD nell'espressione j è una variabile data.table speciale contenente il sottoinsieme di dati per ciascun gruppo, escluse tutte le colonne utilizzate in by.

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 

Un'altra opzione potrebbe essere la nuova versione 0.2 del pacchetto di Hadley dplyr

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