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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 18:05:02