多列ID匹配两个data.frame:关联生成匹配标题列
解决方案
可以用tidyverse工具包实现需求,核心思路是先将两个数据集的ID列转换为便于匹配的集合形式,再逐行匹配并汇总标题:
步骤1:加载依赖包
library(tidyverse)
步骤2:预处理DF2,提取每行的有效ID集合
把DF2每行的ID列(ID1_2、ID2_2、ID3_2)整理成无NA的ID集合,保留对应的Title:
df2_processed <- DF2 %>% rowwise() %>% mutate(ids = list(na.omit(c(ID1_2, ID2_2, ID3_2)))) %>% ungroup() %>% select(ids, Title)
步骤3:预处理DF1,提取每行的有效ID集合
同样处理DF1,生成每行的ID集合:
df1_processed <- DF1 %>% rowwise() %>% mutate(ids = list(na.omit(c(ID1, ID2, ID3)))) %>% ungroup()
步骤4:匹配标题并汇总
对DF1的每行ID集合,找到DF2中所有ID集合有交集的Title,用逗号拼接;如果没有匹配结果则设为NA:
DF3 <- df1_processed %>% rowwise() %>% mutate( Match_titles = if (length(ids) == 0) { NA_character_ } else { df2_processed %>% filter(map_lgl(ids, ~ any(.x %in% ids))) %>% pull(Title) %>% paste(collapse = ", ") } ) %>% ungroup() %>% select(-ids)
验证结果
运行上述代码后,输出的DF3与示例一致:
> DF3 # A tibble: 3 × 4 ID1 ID2 ID3 Match_titles <dbl> <dbl> <dbl> <chr> 1 1 4 9 Journal Z, Journal Y 2 2 5 NA Journal X, Journal X 3 3 NA NA NA
说明
- 该方法通过
rowwise()逐行处理数据,适合中小型数据集;如果是超大型数据集,可考虑用向量化操作或data.table优化性能。 - 匹配逻辑是只要DF1某行的任意一个ID出现在DF2某行的ID集合中,就将对应的Title纳入结果,符合需求中“每个ID对应多个标题、每个标题关联多个ID”的场景。
内容的提问来源于stack exchange,提问作者T. C. Nobel
相关产品推荐
相关产品推荐

