如何将summary()的结果转换为漂亮的数据表

时间:2019-07-17 03:34:22

标签: r

使用R的summary(),我要创建一个表,其中包含多个变量的均值,std,n,min和max。我将使用mtcars作为数据集(R的默认数据集)。如果只是一个变量,则效果很好:

as.data.frame(t(unclass(summary(mtcars$disp))))

结果:

Min. 1st Qu. Median     Mean 3rd Qu. Max.
1 71.1 120.825  196.3 230.7219     326  472

如果不止一个,则效果不佳。我得到的结果与上述相同(仅显示mtcars $ disp的结果)。

as.data.frame(t(unclass(summary(mtcars$disp,mtcars$hp,mtcars$drat))))

结果(与上面相同):   最小第一区中位数第三区最高 1 71.1 120.825 196.3 230.7219 326 472

理想结果应如下所示。

Min. 1st Qu. Median     Mean 3rd Qu. Max.
71.1 120.825  196.3 230.7219     326  472
52    96.5    123 146.6875     180  335
2.76    3.08  3.695 3.596563    3.92 4.93

我也想要变量名:

Name  Min. 1st Qu. Median     Mean 3rd Qu. Max.
disp  71.1 120.825  196.3 230.7219     326  472
hp    52    96.5    123 146.6875     180  335
drat  2.76    3.08  3.695 3.596563    3.92 4.93

你能建议吗?同样在最后的代码中,我不得不重复$ mtcars很多次。有办法避免这种情况吗?

谢谢。

我在这里提出了类似的问题,但是建议的代码变得非常复杂。如果可能的话,我想坚持使用summary()。 R question: how to save summary results into a dataset

2 个答案:

答案 0 :(得分:2)

您可以在各列上sapply,并为每列获取summary

cols <- c("disp", "hp", "drat")
t(sapply(mtcars[cols], summary))

#      Min. 1st Qu.  Median       Mean 3rd Qu.   Max.
#disp 71.10 120.825 196.300 230.721875  326.00 472.00
#hp   52.00  96.500 123.000 146.687500  180.00 335.00
#drat  2.76   3.080   3.695   3.596563    3.92   4.93

如果您还需要在单独的栏中输入姓名

summary_df <- data.frame(t(sapply(mtcars[cols], summary)), check.names = FALSE)
summary_df$Name <- rownames(summary_df)
rownames(summary_df) <- NULL

summary_df
#   Min. 1st Qu.  Median       Mean 3rd Qu.   Max. Name
#1 71.10 120.825 196.300 230.721875  326.00 472.00 disp
#2 52.00  96.500 123.000 146.687500  180.00 335.00   hp
#3  2.76   3.080   3.695   3.596563    3.92   4.93 drat

要添加一些其他统计信息,我们需要创建一个自定义函数

custom_summary <- function(x) {
  c(summary(x), length = length(x), nonmissing = sum(!is.na(x)), 
                sd = sd(x, na.rm = TRUE))
}
t(sapply(mtcars[cols], custom_summary))

#      Min. 1st Qu.  Median       Mean 3rd Qu.   Max. length nonmissing          sd
#disp 71.10 120.825 196.300 230.721875  326.00 472.00     32         32 123.9386938
#hp   52.00  96.500 123.000 146.687500  180.00 335.00     32         32  68.5628685
#drat  2.76   3.080   3.695   3.596563    3.92   4.93     32         32   0.5346787

答案 1 :(得分:2)

您可以使用dplyrsummarise(),这将输出整洁的tibble / data.frame,并且您可以轻松指定所需的摘要统计信息。

mtcars %>% select(disp,hp,drat) %>% 
  gather(k,v) %>% group_by(k) %>% 
  summarise(min=min(v),median=median(v),mean=mean(v),max=max(v),n=n())

# A tibble: 3 x 6
  k       min median   mean    max     n
  <chr> <dbl>  <dbl>  <dbl>  <dbl> <int>
1 disp  71.1  196.   231.   472       32
2 drat   2.76   3.70   3.60   4.93    32
3 hp    52    123    147.   335       32