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

如何用dplyr::replace_na为缺失PMID替换唯一proquint值?

替换缺失PMID为唯一proquint值的正确实现

你的问题在于replace_na(PMID, ids::proquint(n = 1))只会生成单个proquint值,所有缺失的PMID都会被替换成同一个字符串。要让每个NA对应唯一的标识符,我们需要生成与缺失值数量匹配的独立proquint值,再精准替换到对应的位置。

这里有两种简洁的实现方式:

方法1:使用replace()函数

replace()可以直接定位NA的位置,并用对应数量的唯一值替换,同时注意统一数据类型(原PMID是整数,proquint是字符串,需要转成字符类型避免类型冲突):

library(dplyr)
library(ids)

# 你的原始数据
refs <- structure(list(Author = c("Aubrey", "Azrin", "Azrin", "Azrin", "Azrin", "Szapocznik"), Year = c(1998L, 1994L, 1996L, 1994L, 2001L, 2003L), PMID = c(NA, NA, 8561763L, 7993330L, NA, 23731415L )), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"))

# 处理缺失值
refs_with_uniqueID <- refs %>%
  mutate(
    # 先把PMID转为字符类型,和proquint的输出类型统一
    PMID = as.character(PMID),
    # 替换所有NA为对应数量的唯一proquint
    PMID = replace(PMID, is.na(PMID), proquint(n = sum(is.na(PMID))))
  )

# 查看结果
print(refs_with_uniqueID)

方法2:使用if_else()逐元素判断

dplyr::if_else()可以更直观地处理条件替换,同样需要保证类型一致:

refs_with_uniqueID <- refs %>%
  mutate(
    PMID = if_else(
      is.na(PMID),
      # 生成与数据行数相同的proquint,自动匹配NA位置
      proquint(n = n()),
      as.character(PMID)
    )
  )

为什么原代码不行?

proquint(n = 1)只生成1个唯一字符串,replace_na会把这个单一值重复填充到所有NA的位置,导致所有缺失的PMID都完全相同。而上面的方法会生成等于缺失值数量的独立proquint值,每个NA都能得到专属的唯一标识符。

内容的提问来源于stack exchange,提问作者user25494

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:48:17