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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 17:27:01