如何用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
相关产品推荐
相关产品推荐

