在R中基于四列跨两个数据框分配唯一ID的实现方案
为R语言数据框选手分配统一唯一ID的实现方案
问题背景
现有两个R数据框:
master.treeDQ2:每行包含两位选手信息,第11列是选手1姓名、第12列是选手1所属健身房;第13列是选手2姓名、第14列是选手2所属健身房rank_table:每行仅包含一位选手的姓名(competitor列)
需基于姓名+健身房的组合分配唯一ID,满足以下要求:
- 同时出现在选手1和选手2位置的同一选手(姓名+健身房一致),ID必须相同
- 为选手2位置中未在选手1位置出现过的选手分配新ID
- 将
master.treeDQ2中生成的ID同步到rank_table的对应选手行
原代码仅能为选手1生成唯一ID,现提供完整实现方案。
完整实现代码
# 读取数据 rank_table = read.csv('https://raw.githubusercontent.com/bandcar/Examples/main/rank_table_complete2.csv') master.treeDQ2 = read.csv('https://raw.githubusercontent.com/bandcar/Examples/main/master.treeDQ.edited_draft6.csv') # 步骤1:生成全局唯一ID映射表 # 提取所有选手的姓名+健身房组合 comp1 <- master.treeDQ2[, c(11, 12)] names(comp1) <- c("name", "gym") comp2 <- master.treeDQ2[, c(13, 14)] names(comp2) <- c("name", "gym") # 合并去重后分配连续ID all_competitors <- rbind(comp1, comp2) all_unique <- unique(all_competitors) all_unique$ID <- seq(nrow(all_unique)) # 步骤2:为master.treeDQ2添加ID1和ID2列 # 匹配选手1的ID master.treeDQ2 <- merge(master.treeDQ2, all_unique, by.x = c(11, 12), by.y = c("name", "gym"), all.x = TRUE) names(master.treeDQ2)[ncol(master.treeDQ2)] <- "ID1" # 匹配选手2的ID master.treeDQ2 <- merge(master.treeDQ2, all_unique, by.x = c(13, 14), by.y = c("name", "gym"), all.x = TRUE) names(master.treeDQ2)[ncol(master.treeDQ2)] <- "ID2" # 步骤3:同步ID到rank_table # 若rank_table包含健身房列,将by参数改为c("competitor", "gym")以避免同名冲突 rank_table <- merge(rank_table, all_unique, by.x = "competitor", by.y = "name", all.x = TRUE)
代码说明
- 全局ID映射:先收集所有选手的姓名+健身房组合,去重后给每个唯一组合分配连续ID,确保同一选手ID唯一且统一,解决了跨选手位置的ID一致性问题
- master.treeDQ2赋值:通过
merge函数分别匹配选手1和选手2的组合,生成对应的ID1和ID2列,保证同一选手在不同位置ID相同 - rank_table同步:利用全局映射表将ID匹配到
rank_table中,若rank_table存在同名不同健身房的选手,需补充健身房列后再匹配,避免ID错误
期望输出示例
master.treeDQ2简化输出
comp01 gym1 ID1 comp02 gym2 ID2 A w 1 D z 4 A w 1 D z 4 B x 2 A w 1 B x 2 D z 4 B x 2 D z 4 C y 3 A w 1 C y 3 B x 2
rank_table简化输出
competitor ID C 3 D 4 D 4 A 1 B 2 B 2
内容的提问来源于stack exchange,提问作者bandcar
相关产品推荐
相关产品推荐

