Cada vez que obtengo un nuevo conjunto de datos, lo primero que hago es verificar las estadísticas de resumen. La función summary
hace un trabajo bastante bueno, pero a menudo me interesan las desviaciones estándar, los cuantiles con diferentes puntos de interrupción, el número de observaciones, etc. Además, la presentación de summary
no es realmente la forma más fácil de digerir o lo que se ve en Revistas (es decir, summary
es horizontal en lugar de vertical).Hacer una mejor tabla de estadísticas de resumen con plyr en R
Por ejemplo, esto es lo que obtengo del resumen con algunos datos inventados.
> library(plyr)
> library(reshape2)
> my.data <- data.frame(firm = factor(rep(letters[1:5], each = 5)), returns = rnorm(n = 5 * 5), leverage = rep(c(0.3, 0.4, 0.5, 0.6, 0.7), each = 5) + .... [TRUNCATED]
> my.summary <- summary(my.data)
> my.summary
firm returns leverage
a:5 Min. :-1.6765 Min. :0.2863
b:5 1st Qu.:-0.6945 1st Qu.:0.3929
c:5 Median :-0.1930 Median :0.5061
d:5 Mean :-0.1159 Mean :0.5009
e:5 3rd Qu.: 0.4323 3rd Qu.:0.6011
Max. : 1.1915 Max. :0.7093
Pero digamos que realmente quiero algo más como esto.
> my.manual.summary <- data.frame(mean = c(mean(my.data$returns), mean(my.data$leverage)), median = c(median(my.data$returns), median(my.data$leverage .... [TRUNCATED]
> rownames(my.manual.summary) <- c("returns", "leverage")
> my.manual.summary
mean median sd
returns -0.1158633 -0.1929571 0.6996548
leverage 0.5008895 0.5061301 0.1453381
Para este conjunto pequeño de datos (es decir, sólo unas pocas características de las empresas) esto es fácil. Pero tengo más o qué hacer más estadísticas o más slicing-dicing, puede ser tedioso.
Intenté esto con reshape2
y plyr
, pero me sale un error.
> my.melted.data <- melt(my.data)
Using firm as id variables
> my.improved.summary <- ddply(my.melted.data[, -1], .(variable), c("mean", "median", "sd"), na.rm = T)
Error in proto[[i]] <- fs[[i]](x, ...) :
more elements supplied than there are to replace
In addition: Warning messages:
1: In mean.default(X[[1L]], ...) :
argument is not numeric or logical: returning NA
2: In mean.default(sort(x, partial = half + 0L:1L)[half + 0L:1L]) :
argument is not numeric or logical: returning NA
3: In var(as.vector(x), na.rm = na.rm) : NAs introduced by coercion
4: In mean.default(X[[1L]], ...) :
argument is not numeric or logical: returning NA
Esto me deja con dos preguntas:
- ¿qué estoy haciendo mal con
ddply
? - ¿Estoy reinventando la rueda aquí? Dado que esta es la tabla 1 de todo lo que leo y escribo, ¿hay alguna solución que no haya encontrado?
¡Gracias!
Esto bueno. Y mucho más fácil que mi solución 'plyr'. ¡Gracias! –