studio para matematicas librerias funciones funcion estadisticas estadistica ejercicios definicion basicas r multiple-columns plyr idiomatic split-apply-combine

matematicas - librerias para r studio



ddply+resume para repetir la misma función estadística en un gran número de columnas (2)

Ok, segunda pregunta R 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 usaría una combinación de ddply y summarize para calcular conjuntos (por ejemplo, media para cada hora durante todo el año).

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

Pero aquí es donde se pone pegajoso. Tengo que lidiar con más de 40 columnas y no estoy preparado para escribirlas todas una por una como parámetros de la función de summarize . Solía ​​escribir un bucle en el shell para generar este código, pero no es así como los programadores resuelven los problemas, ¿no es así?

Entonces dime, ¿alguien tiene una mejor manera de lograr el mismo resultado pero con menos pulsaciones de teclas?


Incluso puede simplificar el segundo enfoque propuesto por Andrie omitiendo completamente la llamada a ddply. Simplemente especifique la mean como la función de agregación en la llamada de difusión:

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


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

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() para resumir en 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 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