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
相关产品推荐
相关产品推荐

