2011-04-07 12 views
8

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:

  1. ¿qué estoy haciendo mal con ddply?
  2. ¿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!

Respuesta

11

Pruebe stat.desc en el paquete pastecs. Puede usarlo en su conjunto de datos llamando al stat.desc(my.data). Para obtener el resultado en el formato que desea, debe (a) transponer el marco de datos, (b) eliminar variables no numéricas y (c) solo conservar las columnas de estadísticas de resumen que necesita

+0

Esto bueno. Y mucho más fácil que mi solución 'plyr'. ¡Gracias! –

3

Encontré el error conceptual en mi código de arriba Como mean, median y sd funcionan en un vector, necesito alimentarlos con un vector específico en el marco de datos creado por ddply basado en .variables. (I estaba aplicando de forma incorrecta un ejemplo del manual, que utiliza los operadores de tramas de datos nrow y ncol.) Aquí está el código correcto:

my.melted.data <- melt(my.data) 
my.improved.summary <- ddply(
    my.melted.data 
    , .(variable) 
    , function(x) data.frame(
    mean = mean(x$value) 
    , median = median(x$value) 
    , sd = sd(x$value) 
) 
) 

solución de Ramnath es más fácil, pero esto es extensible a cualquier estadísticas de resumen tipo es posible que desee .

Cuestiones relacionadas