You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 12:06:07