技术求助:如何按主键合并含重复项的数据框且仅单次匹配关联值
解决重复id合并时仅保留首次匹配值的问题
这个需求我太懂了!默认的left_join会把匹配到的Value重复填充给每个同id的行,要实现每个id仅在第一行显示对应Value,其余行留空,用dplyr就能轻松搞定,不用换其他工具。
解决方案代码
library(dplyr) # 你的原始数据框 ds1 <- data.frame( id = c(1,1,1,2,2), V2 = c(5,6,7,5,8) ) ds2 <- data.frame( id=c(1,2), Value=c(56,98) ) # 核心操作:左连接后按id分组,仅保留每组第一行的Value ds_result <- ds1 %>% left_join(ds2, by = "id") %>% group_by(id) %>% mutate(Value = ifelse(row_number() == 1, Value, NA)) %>% ungroup() # 查看结果 print(ds_result)
输出结果
# A tibble: 5 × 3 id V2 Value <dbl> <dbl> <dbl> 1 1 5 56 2 1 6 NA 3 1 7 NA 4 2 5 98 5 2 8 NA
代码解释
- 先执行
left_join完成基础合并,得到和你之前一样的重复填充结果; group_by(id)把相同id的行归为一组;row_number()给每组内的行按原始顺序编号,用ifelse判断:只有编号为1的行保留原始Value,其余行替换为NA;ungroup()取消分组,避免后续操作受分组状态影响。
可选调整:把NA换成空白字符
如果你希望空值显示为空白而非NA,可以修改mutate语句(注意这会把Value列转为字符型):
mutate(Value = ifelse(row_number() == 1, as.character(Value), ""))
内容的提问来源于stack exchange,提问作者Artem
相关产品推荐
相关产品推荐

