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

R语言ggplot中na.rm=TRUE无法移除缺失值的技术求助

我来帮你梳理下问题出在哪,主要是数据处理的两个小细节没做好,导致na.rm=TRUE没起到你想要的效果:

问题根源

  1. Acc列的类型错误:你用fread读取数据时,因为ee和dd列存在.这个非数值字符,所以这两列被默认解析为字符型。之后你把.替换成NA,但Acc列依然是字符型——此时ggplot会把字符型的NA当作一个有效类别,na.rm=TRUE无法识别并移除这类情况。
  2. 数据清理顺序错误:你先生成了br_nbs,之后尝试用subset(dat, !is.na(Acc))时,br_nbs的长度和清理后的dat不匹配,导致报错;而且如果不提前移除NA行,x轴的标签依然会保留对应位置,最终出现空柱子。

修正后的代码

library("data.table")
library(conflicted)
library(tidyverse)
library(ggplot2)

# 读取数据时直接指定列类型,自动将.转为数值型NA
ee <- fread("dat.csv", select = c("br","tr","obs","ee"), colClasses = list(numeric = "ee"))
ee <- ee %>% rename(Acc = ee) %>% mutate(Method = "OLD")

dd <- fread("dat.csv", select = c("br","tr","obs","dd"), colClasses = list(numeric = "dd"))
dd <- dd %>% rename(Acc = dd) %>% mutate(Method = "NEW")

# 合并后先移除NA行,避免后续绘图出现无效项
dat <- rbind(ee, dd) %>% filter(!is.na(Acc))

# 生成br_nbs要在数据清理之后,保证长度匹配
dat <- dat %>% mutate(br_nbs = paste(br, obs, sep = "\n"))

# 绘图,此时无需额外设置na.rm=TRUE,因为已经提前清理了NA
ggplot(dat, aes(x = br_nbs, y = Acc, fill = Method))+
  geom_col(colour="black", width=1, position=position_dodge(0.7)) +
  facet_wrap(~tr, strip.position = "top", labeller = "label_value", scales = "free_x")

关键说明

  • 指定列类型:用colClasses参数让fread直接把ee和dd解析为数值型,原数据中的.会自动转为数值型NA,省去手动替换的步骤,也避免了字符型NA的问题。
  • 提前清理NA:在生成标签和绘图前用filter(!is.na(Acc))移除NA行,从根源上消除无效数据,比依赖na.rm=TRUE更可靠,也不会出现x轴残留无效标签的情况。
  • 简化代码逻辑:用dplyr管道操作替代cbind的组合写法,让代码更简洁易读,也减少了出错概率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 16:52:41