You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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

火山引擎 最新活动