R中将文本NA替换为系统NA后summary仍显示0计数NA类别的解决方案
问题原因
你的数据中Region等列为因子类型,你用na_if仅将取值为"NA"的观测替换为了R的系统NA,但因子的水平(levels)列表中仍然保留了"NA"这个水平,即使没有观测对应这个水平,summary()统计因子时会列出所有已定义的水平,所以才会出现计数为0的"NA"分类。
解决方案
方案1:导入数据时直接处理(最优)
直接在read_csv2的参数中指定要识别为NA的字符串,从源头避免生成文本"NA"的取值和水平:
# 可根据实际情况添加其他要识别为NA的字符串,比如带空格的" NA "、空字符串""等 tmp1 <- read_csv2(file1, na = c("", "NA", "NA ", " NA")) tmp2 <- read_csv2(file2, na = c("", "NA", "NA ", " NA")) tmp <- tmp1 %>% left_join(tmp2)
方案2:已导入数据直接清理空水平(适配你当前的情况)
你已经完成了"NA"到系统NA的替换,只需要删除所有因子列中没有观测对应的空水平即可:
tmp <- droplevels(tmp)
运行后再做summary()就不会再出现计数为0的"NA"分类。
方案3:全数据集统一替换+清理
如果不确定是否还有其他带空格的文本NA值,可对全数据集做统一处理:
library(dplyr) library(forcats) tmp <- tmp %>% # 处理字符列:去首尾空格后替换"NA"为系统NA mutate(across(where(is.character), ~ trimws(.x) %>% na_if("NA"))) %>% # 处理因子列:直接删除"NA"水平,再清理所有空水平 mutate(across(where(is.factor), ~ fct_recode(.x, NULL = "NA") %>% droplevels()))
内容的提问来源于stack exchange,提问作者Romy Schipper
相关产品推荐
相关产品推荐

