使用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
答案 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)
您可以使用dplyr
和summarise()
,这将输出整洁的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