[英]Making a better summary statistics table with plyr in R
每次我獲得一個新的數據集時,我要做的第一件事就是查看摘要統計信息。 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
對於這個小數據集(即,只有幾個公司特征),這很容易。 但是我有更多或者做什么更多的統計數據或更多的切片切割,它可能會變得乏味。
我用reshape2
和plyr
嘗試了這個,但是得到了一個錯誤。
> 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
這讓我有兩個問題:
ddply
我做錯了ddply
? 謝謝!
嘗試stat.desc
在pastecs
包。 您可以通過調用stat.desc(my.data)
在數據集上使用它。 要以您希望的格式獲得輸出,您需要(a)轉置數據框,(b)刪除非數字變量和(c)僅保留您需要的摘要統計列
我在上面的代碼中發現了概念錯誤。 因為mean
, median
和sd
上的向量操作,我需要養活他們在數據幀的特定載體ddply
創建一個基於.variables
。 (I被錯誤地施加從手動,其使用的數據幀運營商的示例nrow
和ncol
。)這里的正確的代碼:
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的解決方案更容易,但這可以擴展到您可能想要的任何類型的摘要統計數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.