R语言如何在不指定列名前提下查找两个数据框的匹配公共行
R通用多数据集匹配函数实现
传入示例数据
两个待匹配的数据框结构参考如下:
df1 <- data.frame(x1 = c("d","e","f","g"), x2 = c("Aug 2017","Sep 2017","Oct 2017","Nov 2017"), x3 = c(456,678,876,987)) df2 <- data.frame(x1 = c("a","b","c","d"), x2 = c("Aug 2017","Sep 2017","Oct 2017","Nov 2017"), x3 = c(123,324,345,564))
需求与约束
- 核心逻辑:判断df1对应列的取值是否存在于df2的指定列中,匹配成功则返回df1中该取值所在的完整行,新增列将匹配行标记为
common - 约束要求:函数内部不可硬编码显式指定列名,类似
inner_join这类需要手动传入by = 'col_name'参数的方法不可直接使用 - 期望输出格式:
x1 x2 x3 x4 1 d Aug 2017 456 common
通用函数实现
函数自动适配传入的数据框,不需要手动写死列名,默认按第一列做匹配(可通过参数调整匹配列位置,也可修改为按所有同名列自动匹配):
match_common_rows <- function(df1, df2, match_col_pos = 1) { # 自动提取匹配列名,无需硬编码 match_col <- names(df1)[match_col_pos] # 筛选匹配成功的行 match_res <- df1[df1[[match_col]] %in% df2[[match_col]], ] # 新增标记列 match_res$x4 <- "common" # 重置行名(可选) rownames(match_res) <- NULL return(match_res) }
调用测试
直接传入两个数据框即可得到符合要求的结果:
match_common_rows(df1, df2)
运行输出:
x1 x2 x3 x4 1 d Aug 2017 456 common
灵活调整说明
- 如果需要按多列匹配,将函数内
match_col的赋值逻辑替换为match_col <- intersect(names(df1), names(df2)),即可自动识别两个数据框的所有共有列作为匹配键,全程不需要手动输入列名 - 如果匹配列不是第一列,调用时传入列位置参数即可,例如按第二列匹配写为
match_common_rows(df1, df2, match_col_pos = 2) - 标记列的列名如果需要调整,直接修改
match_res$x4中的x4为目标列名即可
内容的提问来源于stack exchange,提问作者Rupaa Ramesh
相关产品推荐
相关产品推荐

