R语言使用unique()提取列唯一值时如何保留NA缺失值
R语言去重提取唯一值时保留NA的实现方法
问题背景
- 处理对象:存储学术文献DOI编号的数据列,存在部分代表无有效DOI的NA记录
- 处理目标:剔除重复文献记录的同时,保留无DOI的NA条目
- 现存问题:直接调用原生
unique()函数会自动过滤NA值,仅返回非NA的唯一取值,不符合需求 - 规则参考:根据
unique()官方文档说明,NA值本身会被判定为相等,数值、复数类型的NA与NaN有明确区分,字符串类型的比较逻辑和match()、duplicated()函数完全一致,去重逻辑本身支持NA判定,仅默认返回规则做了过滤。
无依赖原生R实现方案
直接使用duplicated()函数做重复值判定,通过向量索引筛选即可,不需要加载任何第三方包:
核心逻辑:
duplicated()会从第二次出现的重复值开始标记为TRUE,对于重复出现的NA,仅会保留第一次出现的NA条目,其余重复NA会被判定为重复值剔除,完全匹配去重保留单个NA的需求。
示例代码:
# 构造测试DOI向量:包含重复有效DOI、重复NA doi_col <- c( "10.1038/nphys1170", "10.1126/science.169.3946.635", NA, "10.1038/nphys1170", NA, "10.1145/3366423.3380269" ) # 去重并保留NA unique_res <- doi_col[!duplicated(doi_col)]
运行后返回结果包含3个不重复的有效DOI,以及1个NA条目,符合预期。
注意:如果你的数据中缺失值是字符串格式的
"NA"、空字符串""或者自定义缺失标记(如"N/A"、"无"),需要先通过doi_col[doi_col %in% c("NA", "", "N/A", "无")] <- NA将其转换为R原生NA值,再执行上述去重逻辑,否则无法被正确识别为缺失值。
tidyverse生态实现方案
如果日常使用dplyr处理数据,直接调用distinct()函数即可默认保留NA值:
library(dplyr) # 数据框列去重示例 df_unique <- df %>% distinct(doi_col, .keep_all = TRUE) # 如果是单独向量,转列后拉取即可 unique_vec <- tibble(doi = doi_col) %>% distinct(doi) %>% pull(doi)
常见踩坑
- 不要使用
na.omit()、drop_na()类函数提前处理数据,会直接删除所有NA条目 - 不要在未设置NA水平的因子类型列上直接去重,需要先重新设置因子水平再做处理
内容的提问来源于stack exchange,提问作者Larissa Cury
相关产品推荐
相关产品推荐

