2012-05-28 16 views
21

Ok, segunda pregunta R en rápida sucesión.ddply + resumen para repetir la misma función estadística en un gran número de columnas

Mis datos:

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

Básicamente normalmente utilizarían una combinación de ddply y summarize para calcular conjuntos (por ejemplo significar para cada hora a través de todo el año).

En el caso anterior, crearía una categoría, p. hora (por ejemplo strptime(data$Timestamp,"%H") -> data$hour y luego usar esa categoría en ddply, al igual que a ddply(data,"hour", summarize, St_01=mean(St_01), St_02=mean(St_02)...) promedio por categoría en cada una de las columnas.

pero aquí es donde se pone pegajosa. Tengo más de 40 columnas para hacer frente y no estoy preparado para escribirlos todos uno por uno como parámetros para la función summarize. Solía ​​escribir un bucle en shell para generar este código, pero no es así como los programadores resuelven los problemas ¿

Así que díganlo, ¿alguien tiene una mejor forma de lograr el mismo resultado pero con menos teclas?

+0

Use 'numcolwise()' – Andrie

+2

o la forma del 'variables de St' larga a continuación, utilizar sus funciones de agregación favoritos' BY', 'aggregate',' ddply' combinar con 'c (hora , index) ', donde' index' es la variable creada en la remodelación. –

+0

puntos fáciles para ti :-) –

Respuesta

36

Puede usar numcolwise() para ejecutar un resumen sobre todo n columnas de la umeric

Aquí hay un ejemplo usando 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 

Del mismo modo, hay catcolwise() resumir sobre todas las columnas categóricas.

Consulte ?numcolwise para obtener más ayuda y ejemplos.


EDITAR

Un enfoque alternativo es utilizar reshape2 (propuesto por @ GSK3). Esto tiene más pulsaciones de teclado en este ejemplo, pero le da una enorme flexibilidad:

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

se ve bien! ¡Gracias! –

+0

una cosa. ¿Cómo funciona con resumir? porque necesito resumir categóricamente dentro de cada columna también. –

+1

No estoy seguro de lo que quieres decir. Usar 'colwise' o familia generalmente significa que no necesita usar' summarize'. ¿Puedes ampliar tu pregunta? – Andrie

7

Incluso puede simplificar el segundo enfoque propuesto por Andrie omitiendo la llamada ddply por completo. Sólo especifique mean como la función de agregación en la llamada 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 

El mismo resultado se puede calcular también muy rápido usando el paquete data.table. La variable .SD en la expresión j es una variable especial datatable que contiene el subconjunto de datos para cada grupo, excluyendo todas las columnas utilizadas en 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 

Otra opción sería la nueva versión 0.2 del envase de 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 
Cuestiones relacionadas