使用R中的plyr制作更好的汇总统计表

时间:2011-04-07 16:29:05

标签: r plyr

每次获得新数据集时,我要做的第一件事就是查看摘要统计信息。 summary函数做得很好,但我经常对标准偏差,不同断点的分位数,观察数等感兴趣。另外,summary的表示并不是最简单的消化方式或在期刊中看到的内容(即summary是水平的而不是垂直的。)

例如,以下是我从摘要中获得的一些数据。

> 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  

但是,让我说我真的想要更像这样的东西。

> 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

对于这个小数据集(即,只是几个公司特征),这很容易。但是我有更多或者做什么更多的统计数据或更多的切片切割,它可能会变得乏味。

我尝试使用reshape2plyr,但收到错误。

> 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

这给我留下了两个问题:

  1. 我对ddply做错了什么?
  2. 我在这里重新发明了轮子吗?鉴于这是我读写的所有内容中的表1,是否存在我尚未找到的现有解决方案?
  3. 谢谢!

2 个答案:

答案 0 :(得分:11)

尝试stat.desc包中的pastecs。您可以通过调用stat.desc(my.data)在数据集上使用它。要以您希望的格式获得输出,您需要(a)转置数据框,(b)删除非数字变量,(c)仅保留您需要的摘要统计列

答案 1 :(得分:3)

我在上面的代码中发现了概念错误。由于meanmediansd对向量进行操作,因此我需要在ddply根据.variables创建的数据框中为它们提供特定向量。 (我错误地应用了手册中的示例,该手册使用了数据框操作符nrowncol。)以下是正确的代码:

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

Ramnath的解决方案更容易,但这可以扩展到您可能想要的任何类型的摘要统计数据。