基于已有ID列生成唯一ID:用dplyr填充不重复NA值
用dplyr填充ID列的NA为唯一且不重复的值
给定数据框:
test <- data.frame(ID = c(1,2,3,4,NA, NA, 6, 8, 9))
需要将NA替换为不在现有ID中的唯一值,每个NA对应的值不能重复。以下是两种符合要求的dplyr解决方案:
方案1:从现有ID最大值后生成连续值填充
这种方法简单直接,生成的填充值都大于现有ID的最大值,完全避免与现有值重复:
library(dplyr) # 计算NA数量和现有ID的最大值 na_count <- sum(is.na(test$ID)) max_existing_id <- max(test$ID, na.rm = TRUE) # 生成填充序列并替换NA test_filled <- test %>% mutate(ID = replace(ID, is.na(ID), seq(max_existing_id + 1, max_existing_id + na_count)))
执行后结果示例:
> test_filled ID 1 1 2 2 3 3 4 4 5 10 6 11 7 6 8 8 9 9
方案2:优先填充现有ID的空缺值
如果希望优先填补现有ID之间的空缺(比如示例中的5),再补充后续值,可以用以下方法:
library(dplyr) library(tidyr) # 获取现有非NA的ID集合 existing_ids <- test %>% drop_na(ID) %>% pull(ID) # 计算需要填充的NA数量 na_count <- sum(is.na(test$ID)) # 生成包含现有ID和足够补位的序列,筛选出不在现有ID中的值,取前na_count个 fill_values <- setdiff( seq(min(existing_ids), max(existing_ids) + na_count), existing_ids )[1:na_count] # 替换NA test_filled <- test %>% mutate(ID = replace(ID, is.na(ID), fill_values))
执行后结果示例:
> test_filled ID 1 1 2 2 3 3 4 4 5 5 6 10 7 6 8 8 9 9
内容的提问来源于stack exchange,提问作者Sulz
相关产品推荐
相关产品推荐

