在R中如何用left_join合并结构不同的dataframe并匹配添加列?
解决df_1和df_2的匹配合并问题
问题分析
df_1中每个Name对应一行记录,而df_2中同一个ID+Company下的Name被拆分为Name_1、Name_2等多列,需要先将df_2转换为与df_1结构匹配的长格式,再通过left_join合并目标列。
解决方案(使用tidyverse工具)
1. 加载所需包
library(tidyverse)
2. 整理df_2为匹配格式
将df_2中所有Name_开头的列转成单列Name,同时保留需要的匹配字段和目标字段:
df_2_clean <- df_2 %>% pivot_longer( cols = starts_with("Name_"), # 自动匹配所有Name_开头的列,支持扩展 names_to = NULL, # 丢弃原列名(不需要保留Name_1/Name_2标识) values_to = "Name", # 生成新的Name列 values_drop_na = TRUE # 过滤掉Name为NA的无效行 )
整理后的df_2_clean结构如下:
| ID | Company | Name | Achiev |
|---|---|---|---|
| 131 | ABC | Alex | 1234 |
| 131 | ABC | Marian | 1234 |
| 206 | DEF | Peter | 2341 |
| 206 | DEF | Maria | 2341 |
| 5 | EFD | Mila | 43 |
| 2 | SDF | Maya | 22 |
3. 合并df_1与整理后的df_2
通过ID、Company、Name三个字段进行左连接,将Achiev(及其他需要的字段)添加到df_1中:
# 若需要添加多个字段,只需在select中补充列名即可 df_combined <- df_1 %>% left_join( df_2_clean %>% select(ID, Company, Name, Achiev), by = c("ID", "Company", "Name") )
最终合并结果
| ID | Company | Name | Degree | Achiev |
|---|---|---|---|---|
| 131 | ABC | Alex | 0 | 1234 |
| 131 | ABC | Marian | 1 | 1234 |
| 206 | DEF | Peter | 1 | 2341 |
| 206 | DEF | Maria | 0 | 2341 |
| 5 | EFD | Mila | 1 | 43 |
| 2 | SDF | Maya | 0 | 22 |
扩展说明
- 若df_2中有更多
Name_开头的列(如Name_3、Name_4),starts_with("Name_")会自动匹配,无需修改代码; - 若需要添加除
Achiev外的其他字段,只需在select(ID, Company, Name, Achiev)中补充对应列名即可(如select(ID, Company, Name, Achiev, Score, Rank))。
内容的提问来源于stack exchange,提问作者Soph2010
相关产品推荐
相关产品推荐

