如何在R的ggplot2中移除数据框NA,消除柱状图中的NA分类柱
解决starwars数据集可视化中出现NA分组柱子的问题
问题原因
你的柱状图出现NA分类柱子,是因为starwars数据集的sex列本身存在NA值,group_by(sex)会把NA单独作为一个分组,最终汇总结果里就会有NA对应的行,反映到图表上就是多余的NA柱子。
两种可行解决方法
方法一:分组前过滤sex为NA的行
在数据汇总前先剔除sex列是NA的行,同时保留sex为"none"的分组:
library(dplyr) library(ggplot2) library(ggthemes) # 加载theme_economist()所在的包 genderHeights <- starwars |> filter(!is.na(sex)) |> # 仅移除sex为NA的行 group_by(sex) |> summarize( avg_height = mean(height, na.rm = TRUE) # 这里的na.rm是处理height列的NA ) ggplot(genderHeights, aes(x = sex, y = avg_height)) + geom_col() + labs(x = '性别', y = '平均身高(cm)', title = '星球大战角色按性别划分的平均身高', subtitle = '性别会影响身高吗?', caption = '数据来源:starwars数据集') + theme_economist()
方法二:分组后移除NA分组
如果已经完成了分组汇总,直接在结果里过滤掉sex为NA的行即可:
genderHeights <- starwars |> group_by(sex) |> summarize( avg_height = mean(height, na.rm = TRUE) ) |> filter(!is.na(sex)) # 过滤NA分组 # 绘图代码和方法一一致 ggplot(genderHeights, aes(x = sex, y = avg_height)) + geom_col() + labs(x = '性别', y = '平均身高(cm)', title = '星球大战角色按性别划分的平均身高', subtitle = '性别会影响身高吗?', caption = '数据来源:starwars数据集') + theme_economist()
为什么之前的方法没起效?
na.rm=TRUE只作用于height列,用来计算均值时忽略身高的NA,和sex列的NA无关,所以没法去掉NA分组;complete.cases()会移除所有包含NA的行(比如身高为NA但性别有效的行也会被删掉),不符合你保留有效性别分组的需求;drop_na()默认会移除所有含NA的行,同样会误删部分有效数据,因此没解决问题。
内容的提问来源于stack exchange,提问作者Thomas L
相关产品推荐
相关产品推荐

