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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 06:30:46