如何在R中合并两个data.frame,保留全部数据并匹配对应字段
解决方案
你需要使用**全外连接(full join)**来实现需求——dplyr::inner_join仅保留两表匹配的行,right_join仅保留右表所有行,都不符合你要保留所有行的要求。full_join可以保留两个数据框的所有行,同时按V1和V3字段匹配,缺失数据自动用NA填充。
代码实现
library(dplyr) # 原始数据框定义 df1 = structure(list(V1 = c("ASP28", "ASP28", "ASP28", "HSD29", "HSD29", "GLN30"), V3 = c("GLN103", "ASP105", "PRO107", "GLN103", "PRO107", "PRO107"), V5 = c(0.008, 0.484, 0.058, 0.008, 3.208, 4.616)), row.names = c(1L, 4L, 5L, 6L, 7L, 8L), class = "data.frame") df2 = structure(list(V1 = c("ASP28", "ASP28", "ASP28", "ASP28", "ASP28", "HSD29"), V3 = c("ASP28", "GLN103", "ALA46", "HSD47", "THR350", "ASP28"), V5 = c(0.883, 0.158, 0.508, 0.025, 0.125, 1.391)), row.names = c(2L, 3L, 4L, 5L, 6L, 8L), class = "data.frame") # 执行全外连接 merged_result <- full_join(df1, df2, by = c("V1", "V3")) # 输出结果 print(merged_result)
输出结果
运行代码后得到的结果与你提供的示例完全一致:
V1 V3 V5.x V5.y 1 ASP28 GLN103 0.008 0.158 2 ASP28 ASP105 0.484 NA 3 ASP28 PRO107 0.058 NA 4 HSD29 GLN103 0.008 NA 5 HSD29 PRO107 3.208 NA 6 GLN30 PRO107 4.616 NA 7 ASP28 ASP28 NA 0.883 8 ASP28 ALA46 NA 0.508 9 ASP28 HSD47 NA 0.025 10 ASP28 THR350 NA 0.125 11 HSD29 ASP28 NA 1.391
关键说明
full_join()会保留两个数据框中所有V1和V3的组合- 仅在
df1中存在的行,V5.y字段填充NA;仅在df2中存在的行,V5.x字段填充NA - 两表中
V1和V3都匹配的行,会将各自的V5值分别存入V5.x(来自df1)和V5.y(来自df2)
内容的提问来源于stack exchange,提问作者PersianK
相关产品推荐
相关产品推荐

