下面有两个dataframes:
df1 <- data.frame(id = c(11,22,33,44,55),
score = c(20,22,33,22,11))
df2 <- data.frame(id1 = c(11,22,NA,NA,8),
id2 = c(98,9,33,NA,24),
id3 = c(NA,NA,66,44,88),
id4 = c(NA,NA,NA,16,17))
> df1
id score
1 11 20
2 22 22
3 33 33
4 44 22
5 55 11
> df2
id1 id2 id3 id4
1 11 98 NA NA
2 22 9 NA NA
3 NA 33 66 NA
4 NA NA 44 16
5 8 24 88 17
我需要通过df1
中的id
和df2
中的四个id合并两个数据集。我还想保留df1
中任何不匹配的id
。我怎样才能一次达到如下所示的预期输出?
df.merged <- data.frame(id = c(11,22,33,44,55),
score = c(20,22,33,22,11),
id1 = c(11,22,NA,NA, NA),
id2 = c(98,9,33,NA,NA),
id3 = c(NA,NA,66,44,NA),
id4 = c(NA,NA,NA,16,NA))
> df.merged
id score id1 id2 id3 id4
1 11 20 11 98 NA NA
2 22 22 22 9 NA NA
3 33 33 NA 33 66 NA
4 44 22 NA NA 44 16
5 55 11 NA NA NA NA
3条答案
按热度按时间hgc7kmma1#
你可以“半透视”
df2
,这样就有一个包含所有id的id
列,同时保留列id1
-id4
,然后用id
连接:6ovsh4lw2#
您可以将来自
df2
的所有id粘贴在一起,创建一个正则表达式模式,然后查看每个模式与df1
的行匹配的位置。我想有一个更简单的方法来做到这一点。对于每行
rowwise()
,将所有id粘贴为“|”(regex或operator)在中间。然后,用str_remove_all("NA\\||\\|NA")
删除额外的NA
。然后,对于每个模式,获取
df1
的哪一行与之匹配。如果没有匹配,which(...)
的长度将是0
,我们保存一个NA
。现在,我们有了一个合适的连接键,可以做一个简单的
left_join
(保留df1
的所有行):这在
df2
更复杂的情况下失效,其中一行引用多个df1
行。下面是一个更一般的方法。deikduxw3#