【发布时间】:2021-08-10 00:54:20
【问题描述】:
我有两个要合并的数据集。它们不是完整的数据集,因此这意味着个人缺少记录。
这里是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、ageclass==focal_ageclass、year==focal_yr)
所需的输出 - 我正在尝试得到一个看起来像这样的最终数据集(对于 age==3,data1 记录只显示一次,而不是两次):
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 的 age==3 的 data2 中的 age==3 行的 data1 值(而不是仅匹配第一行),给出此(不需要)输出:
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
更新的问题: 在执行full_join 时,如何让匹配记录为所有行添加 NA? 请注意,我宁愿使用 dplyr 解决方案,因为我不在data.table 工作(就像this OP 的答案),我想保留不匹配的行(不像this other OP)。
【问题讨论】:
标签: r dplyr merge subset consolidation