You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言tidyverse绘制分组箱线图异常:重复图与中位数错误

问题分析与修正:Cherry Blossom Run 赛事时间箱线图绘制错误

核心问题总结

你遇到的三个问题(重复图、中位数不符、NA处理失效)都来自代码里的几个关键错误,逐一拆解如下:


错误点1:ggplot未使用管道处理后的数据集

代码中管道%>%过滤完目标数据集后,ggplot却指定了未定义的run17_min作为数据源,且第二个绘图代码把数据集名写错成run_17(正确应为run17)。这导致两个图调用了同一个错误数据集,最终完全重复。

错误点2:NA值处理逻辑错误

  • filter(event == "10 Mile", na.omit(run17))写法错误:na.omit(run17)会返回整个去NA后的数据集,和前面的赛事类型过滤逻辑冲突,应该针对net_sec字段单独去NA,比如!is.na(net_sec)。
  • ggplot()里的na.rm = TRUE无效:该参数需放在geom_boxplot()中,才能让箱线图忽略NA值。

错误点3:中位数统计未正确处理NA

统计中位数的代码里,仅在5K女性组加了na.rm=TRUE且位置错误(放在filter()里无效),应该把na.rm=TRUE放在median()函数参数中,否则计算会因NA值返回NA,和箱线图的中位数结果不符。


修正后的代码

# 10 Mile 性别时间对比箱线图
run17 %>%
  filter(event == "10 Mile", !is.na(net_sec)) %>%  # 针对净时间字段去NA
  ggplot(mapping = aes(sex, net_sec/60, fill = sex)) +
  geom_boxplot(na.rm = TRUE) +  # 箱线图层面忽略NA值
  labs(x = "Gender", y = "Time (minutes)", title = "10 Mile Times by Gender")

# 5K 性别时间对比箱线图
run17 %>%
  filter(event == "5K", !is.na(net_sec)) %>%
  ggplot(mapping = aes(sex, net_sec/60, fill = sex)) +
  geom_boxplot(na.rm = TRUE) +
  labs(x = "Gender", y = "Time (minutes)", title = "5K Times by Gender")

# 中位数统计(统一处理NA值)
run17 %>% filter(event == "10 Mile", sex == "F") %>%
  summarise(med = median(net_sec/60, na.rm = TRUE))

run17 %>% filter(event == "10 Mile", sex == "M") %>%
  summarise(med = median(net_sec/60, na.rm = TRUE))

run17 %>% filter(event == "5K", sex == "F") %>%
  summarise(med = median(net_sec/60, na.rm = TRUE))

run17 %>% filter(event == "5K", sex == "M") %>%
  summarise(med = median(net_sec/60, na.rm = TRUE))

内容的提问来源于stack exchange,提问作者user22833836

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 04:52:47