如何在R语言中从箱线图提取中位数等统计数值?
在R中从箱线图提取中位数等统计量
嘿,这个问题很常见!其实R的boxplot()函数不仅仅是用来生成可视化图的,它还会返回一个包含所有箱线图背后统计量的列表对象——这正是你需要的。下面一步步来解决:
方法1:从已绘制的箱线图中提取统计量
首先,你需要把boxplot()的执行结果赋值给一个变量,这样就能拿到背后的数据:
# 把箱线图结果保存到变量bp中 bp <- boxplot(PM2.5~year, data=subset(dat, hour==12), las=1)
这时候图依然会正常绘制,但同时你获得了一个名为bp的列表对象。
查看返回的统计量结构
用str(bp)可以查看这个列表的内容,其中最核心的是$stats元素:它是一个5行的矩阵,每一列对应一个年份的箱线图统计量,行的顺序固定为:
- 第1行:最小值
- 第2行:第一四分位数(Q1)
- 第3行:中位数
- 第4行:第三四分位数(Q3)
- 第5行:最大值
提取中位数
直接取$stats的第三行即可:
# 提取每个年份的中位数 median_values <- bp$stats[3, ] # 把年份和中位数对应起来,整理成易读的数据框 median_df <- data.frame( Year = bp$names, Median_PM2.5 = median_values ) print(median_df)
提取其他统计量
按照同样的逻辑,你可以拿到其他数值:
- Q1:
bp$stats[2, ] - Q3:
bp$stats[4, ] - 极值(最小/最大值):
bp$stats[c(1,5), ]
方法2:不画图直接计算分组统计量
如果你其实不需要生成箱线图,只是想按年份计算PM2.5的统计值,还有更高效的方法:
用基础R的aggregate()函数
# 按年份分组计算中位数、Q1、Q3 summary_stats <- aggregate(PM2.5~year, data=subset(dat, hour==12), function(x) c( Median = median(x, na.rm=TRUE), Q1 = quantile(x, 0.25, na.rm=TRUE), Q3 = quantile(x, 0.75, na.rm=TRUE) )) # 将结果展开为更易读的数据框 summary_stats <- do.call(data.frame, summary_stats) print(summary_stats)
用dplyr包(更直观的语法)
如果你熟悉tidyverse系列工具,dplyr的分组汇总语法会更清晰:
# 先加载dplyr包(如果没安装先运行install.packages("dplyr")) library(dplyr) # 筛选小时为12的数据,按年份分组计算统计量 dat_subset <- subset(dat, hour==12) summary_stats <- dat_subset %>% group_by(year) %>% summarise( Median = median(PM2.5, na.rm=TRUE), Q1 = quantile(PM2.5, 0.25, na.rm=TRUE), Q3 = quantile(PM2.5, 0.75, na.rm=TRUE), Min = min(PM2.5, na.rm=TRUE), Max = max(PM2.5, na.rm=TRUE) ) print(summary_stats)
这里的na.rm=TRUE很重要,它会忽略数据中的缺失值,避免统计结果返回NA。
内容的提问来源于stack exchange,提问作者Kai Whelan




