R语言使用dplyr合并数据集并整合列,避免匹配行重复填充
问题描述
现有两份存在记录缺失的数据集需要合并,具体情况如下:
数据集示例
data1(真实数据子集示例)
squirrel_id age ageclass trialdate year OFT1 MIS1 10342 1 Y 2008-05-19 2008 0.605 -4.19 10342 2 A 2009-05-31 2009 -1.85 1.14 10342 3 A 2010-05-22 2010 -2.39 2.38
data2(真实数据子集示例)
squirrel_id focal_age focal_ageclass focal_date focal_yr PC1 PC2 10342 1 Y 2008-07-14 2008 0.0932 -2.67 10342 3 A 2010-03-13 2010 -2.38 0.216 10342 3 A 2010-04-20 2010 0.0203 1.80
需求说明
- 合并两个数据集,记录不匹配时保留NA,比如
data1中age==3仅1条记录,data2中age==3有2条记录; - 整合同含义的异名列,简化数据集结构,两个数据集中列名不同但含义相同的字段包括:
age==focal_age、ageclass==focal_ageclass、trialnumber==focalseq、year==focal_yr。
期望输出
要求age==3的data1记录仅出现1次,其余匹配的data2行对应data1字段填充NA:
squirrel_id age ageclass date year OFT1 MIS1 PC1 PC2 10342 1 Y 2008-05-19 2008 0.605 -4.19 NA NA 10342 1 Y 2008-07-14 2008 NA NA 0.0932 -2.67 10342 2 A 2009-05-31 2009 -1.85 1.14 NA NA 10342 3 A 2010-05-22 2010 -2.39 2.38 NA NA 10342 3 A 2010-03-13 2010 NA NA -2.38 0.216 10342 3 A 2010-04-20 2010 NA NA 0.0203 1.80
现有问题
目前使用如下代码尝试实现:
data3<-full_join(data1, data2, by=c("squirrel_id"="squirrel_id", "year"="focal_yr", "age"="focal_age", "ageclass"="focal_ageclass"))
得到的结果不符合预期,age==3的data1记录会在两个匹配的data2行中重复填充对应值,错误输出如下:
squirrel_id age ageclass trialdate focal_date year OFT1 MIS1 PC1 PC2 10342 1 Y 2008-05-19 2008-07-14 2008 0.605 -4.19 0.0932 -2.67 10342 2 A 2009-05-31 NA 2009 -1.85 1.14 NA NA 10342 3 A 2010-05-22 2010-03-13 2010 -2.39 2.38 -2.38 0.216 10342 3 A 2010-05-22 2010-04-20 2010 -2.39 2.38 0.0203 1.80
要求仅使用dplyr方案,不使用data.table,且需保留所有不匹配行。
解决方案
直接使用full_join按多字段匹配会触发笛卡尔积映射,导致data1的单行重复匹配到data2的多行,你可以先对两个数据集做列名标准化、补充缺失字段后直接纵向堆叠,即可实现需求:
library(dplyr) # 标准化data1的列名、字段结构 data1_std <- data1 %>% rename(date = trialdate) %>% select(squirrel_id, age, ageclass, date, year, OFT1, MIS1) # 标准化data2的列名、字段结构,将同义异名字段统一 data2_std <- data2 %>% rename( age = focal_age, ageclass = focal_ageclass, date = focal_date, year = focal_yr ) %>% select(squirrel_id, age, ageclass, date, year, PC1, PC2) # 纵向合并两个标准化后的数据集,按业务逻辑排序即可 result <- bind_rows(data1_std, data2_std) %>% arrange(squirrel_id, age, date)
运行后得到的结果完全符合预期,两个数据集的所有行都会保留,对方独有的字段自动填充为NA,不会出现重复匹配的问题。
内容的提问来源于stack exchange,提问作者Blundering Ecologist
相关产品推荐
相关产品推荐

