R语言数据集处理:为重复ID的学生生成唯一4位字符标识符
为重复毕业记录生成唯一ID的解决方案
需求背景
原数据集中,部分学生因多次毕业(获取多个学位)存在重复ID,需要为这些重复记录生成唯一的4位字母数字组合ID(支持两位字母加两位数字的格式),确保新ID不与原有ID重复,最终合并得到完整数据集。
完整代码实现
首先加载并查看原数据:
mydata <- data.frame(id = c("R001", "R002", "R002", "R003", "R003", "R003"), year = c(2014, 2014, 2015, 2014, 2015, 2017), maledummy = c(1,0,0, 1,1,1))
步骤1:拆分非重复与重复ID记录
# 筛选非重复ID记录(保留每个ID的第一条记录) mydata1 <- mydata[!duplicated(mydata["id"]),] # 筛选重复ID记录(每个ID除第一条外的其他记录) mydata2 <- mydata[duplicated(mydata["id"]),]
步骤2:生成唯一随机ID
提供两种方案,按需选择:
方案1:4位随机字母数字组合(无固定格式)
定义生成唯一ID的函数,确保新ID不与原有ID重复:
generate_unique_ids <- function(n, existing_ids) { chars <- c(letters, 0:9) # 包含小写字母和数字 ids <- character(0) while(length(ids) < n) { new_id <- paste0(sample(chars, 4, replace = TRUE), collapse = "") # 确保新ID既不在已有ID中,也不与已生成的新ID重复 if(!new_id %in% c(existing_ids, ids)) { ids <- c(ids, new_id) } } ids } # 为mydata2生成对应数量的唯一ID new_ids <- generate_unique_ids(nrow(mydata2), mydata$id) # 替换mydata2中的ID mydata2$id <- new_ids
方案2:严格两位字母+两位数字格式
如果需要严格遵循原计划的格式,使用以下函数:
generate_letter_num_ids <- function(n, existing_ids) { # 生成所有可能的两位字母组合 letters_part <- expand.grid(letters, letters) |> apply(1, paste0, collapse = "") # 生成所有可能的两位数字组合(补零) nums_part <- sprintf("%02d", 0:99) # 组合所有可能的ID all_possible <- expand.grid(letters_part, nums_part) |> apply(1, paste0, collapse = "") # 排除已存在的ID,确保唯一性 available <- setdiff(all_possible, existing_ids) # 随机抽取n个唯一ID sample(available, n) } # 生成并替换ID new_ids <- generate_letter_num_ids(nrow(mydata2), mydata$id) mydata2$id <- new_ids
步骤3:合并数据集并查看结果
# 合并非重复与更新后的重复记录 mydatafinal <- rbind(mydata1, mydata2) # 输出最终结果 print(mydatafinal)
说明
- 两种方案都确保新生成的ID全局唯一,不会与原有ID或其他新ID重复;
- 方案2的两位字母+两位数字格式共有2626100=67600种可能,足够应对绝大多数数据集规模;
- 如果需要大写字母,只需将
letters替换为LETTERS即可。
内容的提问来源于stack exchange,提问作者Albert
相关产品推荐
相关产品推荐

