如何用R的dplyr合并Data Frame并提取参考数据框的唯一列组合
问题描述
现有两个数据框:
- 参考数据框
ref包含var1、var2列,数据如下:
| var1 | var2 |
|---|---|
| a | e |
| b | z |
| c | f |
| d | h |
- 全域数据框
univ包含sym1、sym2列,数据如下:
| sym1 | sym2 |
|---|---|
| e | a |
| b | f |
| b | z |
| f | c |
| n | s |
| n | k |
| k | l |
需求:合并两个数据框,从univ的所有配对中提取仅在ref中存在的组合(顺序相反的配对视为同一组合,如a-e与e-a算匹配),最终输出指定结构的结果(无对应配对的行显示NA)。请用R语言的dplyr包实现。
数据生成代码
library(tidyverse) var1 = c("a","b","c","d") var2 = c("e","z","f","h") ref = tibble(var1,var2);ref sym1 = c("e","b","b","f","n","n","k") sym2 = c("a","f","z","c","s","k","l") univ = tibble(sym1,sym2);univ
实现思路与代码
核心逻辑是先将参考数据和全域数据的配对统一处理为无序标识(消除顺序影响),再通过标识匹配筛选目标行,最后关联回原始数据结构。
步骤1:预处理参考数据框
给ref生成无序配对的唯一标识,同时保留原始列:
ref_processed <- ref %>% mutate( # 排序后拼接成字符串,作为无序配对的唯一ID pair_id = pmap_chr(list(var1, var2), ~str_c(sort(c(..1, ..2)), collapse = "-")) )
步骤2:预处理全域数据框
对univ执行相同的无序标识生成操作:
univ_processed <- univ %>% mutate( pair_id = pmap_chr(list(sym1, sym2), ~str_c(sort(c(..1, ..2)), collapse = "-")) )
步骤3:关联筛选并输出结果
通过pair_id关联两个数据框,保留univ的所有行,无匹配的行自动填充NA:
result <- univ_processed %>% left_join(ref_processed, by = "pair_id") %>% # 保留指定输出结构的列 select(sym1, sym2, var1, var2)
最终结果
运行后result的输出如下:
| sym1 | sym2 | var1 | var2 |
|---|---|---|---|
| e | a | a | e |
| b | f | NA | NA |
| b | z | b | z |
| f | c | c | f |
| n | s | NA | NA |
| n | k | NA | NA |
| k | l | NA | NA |
补充说明
- 若只需保留
univ中存在匹配的行,将left_join替换为inner_join即可。 - 用
sort()+str_c()生成无序标识,能确保顺序相反的配对得到相同ID,完美匹配需求。
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

