使用full_join合并数据集时重复匹配问题求解
解决方法
常规的full_join会对每个匹配的ID做全量关联,所以df_2020中ID=112的两条记录都会和df_2021里的ID=112匹配,导致两条的code_2021都显示为23。要实现仅匹配其中一条、其余留空的效果,需要给重复ID添加分组内的序号,再基于ID+序号进行关联:
步骤1:给数据集添加分组序号
用dplyr工具包对每个ID分组后添加行号,区分同ID下的不同记录:
library(dplyr) # 给df_2020添加分组序号 df_2020 <- df_2020 %>% group_by(ID) %>% mutate(row_num = row_number()) %>% ungroup() # 给df_2021添加分组序号 df_2021 <- df_2021 %>% group_by(ID) %>% mutate(row_num = row_number()) %>% ungroup()
步骤2:基于ID和分组序号执行full_join
现在按ID和row_num两个字段关联,只有同ID且同序号的记录会匹配,其余记录的code_2021自然留空:
df_2020_2021 <- full_join(df_2020, df_2021, by = c("ID", "row_num"))
步骤3:移除分组序号列(可选)
如果不需要保留row_num字段,直接删掉即可:
df_2020_2021 <- df_2020_2021 %>% select(-row_num)
执行后就能得到你期望的结果:
| ID | code_2020 | code_2021 |
|---|---|---|
| 112 | 23 | 23 |
| 112 | 22 | NA |
| 111 | 23 | 23 |
| 110 | 20 | 23 |
| 109 | NA | 23 |
内容的提问来源于stack exchange,提问作者S12
相关产品推荐
相关产品推荐

