如何用R合并无共同列名的两个数据框并实现指定匹配
问题:匹配无共同列名的数据框并生成指定格式输出
数据框定义
df1
col1 <- c("Snhg6", "Mt1") col2 <- c("Lpar6", "Nufip2") col3 <- c("Lasp1", "Pipox") col4 <- c("Bcam", "Rhot2") df1 <- data.frame(col1, col2, col3, col4)
对应结构:
# col1 col2 col3 col4 # 1 Snhg6 Lpar6 Lasp1 Bcam # 2 Mt1 Nufip2 Pipox Rhot2
df2
col10 <- c("Bcam", "Rhot2", "Lpar6" , "Snhg6") df2 <- data.frame(col10)
对应结构:
# col10 # 1 Bcam # 2 Rhot2 # 3 Lpar6 # 4 Snhg6
需求说明
需要找出df1每一列中与df2的col10匹配的项,生成如下格式的output_df:
# col1 col2 col3 col4 # Snhg6 Lpar6 NA Bcam # NA NA NA Rhot2
用户尝试的无效方法
- 使用
dplyr的full_join:
library(dplyr) output_df <- df1 %>% full_join(df2)
- 使用
tidyr的crossing:
library(tidyr) output_df <- crossing(df1,df2)
解决方案
可以通过长格式转换→匹配筛选→宽格式转换的思路实现,具体代码如下:
library(dplyr) library(tidyr) # 提取df2中的匹配值列表 match_vals <- df2$col10 output_df <- df1 %>% # 给每行添加唯一标识,确保转宽后对应原始行位置 mutate(row_id = row_number()) %>% # 将df1转为长格式,方便统一筛选 pivot_longer(cols = -row_id, names_to = "col_name", values_to = "value") %>% # 只保留在df2中存在的数值 filter(value %in% match_vals) %>% # 转回宽格式,缺失位置自动填充NA pivot_wider(names_from = col_name, values_from = value) %>% # 移除辅助的row_id列 select(-row_id)
运行后得到的结果完全符合预期:
# # A tibble: 2 × 4 # col1 col2 col3 col4 # <chr> <chr> <chr> <chr> # 1 Snhg6 Lpar6 NA Bcam # 2 NA NA NA Rhot2
关键步骤解释
mutate(row_id = row_number()):添加行号是为了记住每个匹配项来自df1的哪一行,避免转宽后位置混乱pivot_longer:把多列结构转成“列名-数值”的长格式,这样就能用统一的条件筛选所有列中的匹配项filter(value %in% match_vals):精准筛选出在df2中存在的数值pivot_wider:将筛选后的长格式数据转回原始的多列结构,没有匹配项的单元格自动填充NA
内容的提问来源于stack exchange,提问作者Apex
相关产品推荐
相关产品推荐

