R语言含重复值的Inner_join:按分数阈值匹配合并tibble
解决按姓名匹配且分数差限制的数据框合并问题
问题分析
直接用inner_join()按person字段连接时,会对每个同名的观测做笛卡尔积匹配,所以Joe的2条test_1记录和2条test_2记录会生成4条组合。我们需要在匹配后添加分数差的过滤规则,只保留test_1与test_2差值绝对值≤5的行。
解决方案代码
library(dplyr) # 原始数据 df1 <- tibble(person=c("Joe", "John", "Albert", "Joe", "John"), test_1=c(90, 91, 92,93, 94 )) df2 <- tibble(person=c("Joe", "John", "Albert", "Joe"), test_2=c(94, 70, 93,50)) # 连接后过滤分数差符合条件的行 df3 <- inner_join(df1, df2, by = "person") %>% filter(abs(test_1 - test_2) <= 5) # 输出结果 print(df3)
运行结果
# A tibble: 3 × 3 person test_1 test_2 <chr> <dbl> <dbl> 1 Joe 90 94 2 Albert 92 93 3 Joe 93 94
完全符合你期望的df4结构。
补充说明
如果后续有一对一匹配的需求(比如每个test_1记录仅匹配最接近的test_2记录),可以结合group_by()和slice_min()等函数实现,但当前场景下,上述过滤方法已满足需求。
内容的提问来源于stack exchange,提问作者James Rider
相关产品推荐
相关产品推荐

