在R语言中找出与另一数据框行部分匹配的行
我来帮你搞定这个匹配问题!要找出df2中那些和df1行满足「至少一半列值完全相同」的行,我们可以用R的dplyr和purrr包来实现,步骤清晰易懂:
解决步骤
1. 先定义你的数据框
首先把你提供的两个tibble用代码复现出来,方便后续操作:
library(tibble) df1 <- tibble( x = c(4,4,3,8), y = c(5,6,6,2), z = c(8,7,7,8), w = c(9,4,10,9) ) df2 <- tibble( x = c(6,2,4,4), y = c(2,6,5,5), z = c(7,7,8,8), w = c(9,10,12,3) )
2. 核心匹配逻辑
我们需要对比每一对df1行和df2行,计算它们相同列的数量,再筛选出满足「至少一半列匹配」的组合:
library(dplyr) library(purrr) # 生成所有行对的组合(df1的行号 × df2的行号) row_pairs <- expand.grid(df1_row = 1:nrow(df1), df2_row = 1:nrow(df2)) # 计算每对行的匹配列数,并筛选符合条件的行对 matches <- row_pairs %>% mutate( # 对每一对行,统计相同列的数量 match_count = map2_dbl(df1_row, df2_row, ~ sum(df1[.x,] == df2[.y,])) ) %>% # 筛选至少一半列匹配的情况(这里4列,所以≥2) filter(match_count >= ncol(df1)/2) # 整理结果,把匹配的行内容也展示出来 result <- matches %>% # 合并df2的行内容 left_join(df2 %>% mutate(df2_row = 1:nrow(df2)), by = "df2_row") %>% # 合并df1的匹配行内容,用后缀区分两个数据框的列 left_join(df1 %>% mutate(df1_row = 1:nrow(df1)), by = "df1_row", suffix = c("_df2", "_df1")) %>% # 调整列顺序,让行号和匹配数在前,方便查看 select(df2_row, df1_row, match_count, everything()) # 查看结果 print(result)
3. 结果说明
运行上面的代码后,你会得到如下结果:
df2_row df1_row match_count x_df2 y_df2 z_df2 w_df2 x_df1 y_df1 z_df1 w_df1 1 1 4 2 6 2 7 9 8 2 8 9 2 2 3 3 2 6 7 10 3 6 7 10 3 3 1 3 4 5 8 12 4 5 8 9 4 4 1 3 4 5 8 3 4 5 8 9
- 比如
df2_row=1对应df2的第1行,和df1的第4行匹配,有2列值相同(y和w),符合要求; df2_row=2和df1的第3行有3列相同(y、z、w),完全满足条件;- df2的第3、4行都和df1的第1行有3列相同,也符合要求。
如果你的数据框列数是奇数(比如5列),可以把筛选条件改成match_count >= ceiling(ncol(df1)/2),这样就会要求至少3列匹配啦。
内容的提问来源于stack exchange,提问作者Omry Atia
相关产品推荐
相关产品推荐

