R语言ggplot中na.rm=TRUE无法移除缺失值的技术求助
我来帮你梳理下问题出在哪,主要是数据处理的两个小细节没做好,导致na.rm=TRUE没起到你想要的效果:
问题根源
- Acc列的类型错误:你用
fread读取数据时,因为ee和dd列存在.这个非数值字符,所以这两列被默认解析为字符型。之后你把.替换成NA,但Acc列依然是字符型——此时ggplot会把字符型的NA当作一个有效类别,na.rm=TRUE无法识别并移除这类情况。 - 数据清理顺序错误:你先生成了
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
相关产品推荐
相关产品推荐

