Ok, segundo R pregunta en rápida sucesión.

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 yo uso una combinación de ddply y summarize para calcular los conjuntos (por ejemplo, significa que por cada hora en todo el año).

Que en el caso anterior, me gustaría crear una categoría, por ejemplo, la hora (por ejemplo, strptime(data$Timestamp,"%H") -> data$hour y, a continuación, utilizar esa categoría en ddply, como 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 a tratar y yo no estoy preparado para el tipo de todos ellos, uno por uno como parámetros para la summarize función. He utilizado para escribir un bucle en el shell para generar este código, pero que no es como los programadores de resolver los problemas es?

Para orar decir, ¿alguien tiene una mejor forma de lograr el mismo resultado pero con menos pulsaciones de teclas?

  • Uso numcolwise()
  • O remodelar la St variables de largo, a continuación, utilizar su favorito de las funciones de agregación de by, aggregate, ddply combinar por c(hour,index), donde index es la variable creada en el remodelar.
  • puntos fáciles para ya 🙂
  • lol gracias! jajaja. la fe en la humanidad restaurada.
InformationsquelleAutor Reuben L. | 2012-05-28

2 Comentarios

  1. 37

    Puede utilizar numcolwise() para ejecutar un resumen sobre todas las columnas numéricas.

    Aquí es un ejemplo del uso de 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() para resumir sobre todas las columnas de categorías.

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


    EDITAR

    Un enfoque alternativo es el uso de reshape2 (propuesto por @gsk3). Este tiene más pulsaciones de teclas 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
    • se ve bien! gracias!
    • una cosa. ¿cómo es trabajar con resumir? cos necesito para resumir categóricamente dentro de cada columna.
    • No estoy seguro de lo que quieres decir. El uso de colwise o familia por lo general significa que usted no necesita utilizar summarize. Por favor, puedes ampliar tu pregunta?
    • ah yar está a la derecha. lo siento, estoy siendo tonto.
    • es una o la otra, dos enfoques diferentes. Ambos tienen sus méritos. El melt uno es limpio si vas a hacer una gran cantidad de cálculos estadísticos en cada columna, y quiere echar un vistazo a los resultados intermedios.
  2. 7

    Incluso puede simplificar el segundo enfoque propuesto por Andrie por la omisión de la ddply llamar completamente. Sólo tiene que especificar mean como la función de agregación en la dcast llamada:

    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 puede ser calculado también muy rápido el uso de la data.table paquete. El .SD variable en la j de expresión es un especial de datos.tabla variable que contiene el subconjunto de datos para cada grupo, con exclusión de todas las columnas que se utilizan 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 de Hadley del dplyr paquete

    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

Dejar respuesta

Please enter your comment!
Please enter your name here