我想要合并两个数据帧:
set.seed(123)
df1 <- data.frame(ID=sample(letters[1:6],10,replace=TRUE))
df2 <- data.frame(
ID1 = letters[1:2],
ID2 = letters[3:4],
ID3 = letters[5:6],
V1 = c(23.32,21.24),
V2 = c(45.32,47.21)
)
合并后,我希望我的df1
包含列V1
和V2
以及ID
。我尝试过使用merge
,left_join
和inner_join
(来自dplyr
),但无法弄清楚如何使用by
参数。来自ID
的{{1}}列可能存在于df1
的三列(ID1
,ID2
和ID3
)中的任何一列中。我怎样才能做到这一点?
答案 0 :(得分:1)
您必须首先以长格式重塑,然后加入:
library(dplyr)
library(tidyr)
df2 %>%
gather(IDnr, ID, 1:3) %>%
left_join(df1, ., by = 'ID')
# alternative:
df1 %>%
left_join(., df2 %>% gather(IDnr, ID, 1:3), by = 'ID')
结果:
ID V1 V2 IDnr
1 d 21.24 47.21 ID2
2 e 23.32 45.32 ID3
3 f 21.24 47.21 ID3
4 d 21.24 47.21 ID2
5 f 21.24 47.21 ID3
6 c 23.32 45.32 ID2
7 a 23.32 45.32 ID1
8 e 23.32 45.32 ID3
9 a 23.32 45.32 ID1
10 d 21.24 47.21 ID2
答案 1 :(得分:0)
by
参数用于指定您要加入的ID列,假设它们的名称与左侧和右侧不同。右表(如果它的名称相同则会自动选择)。
但是,我有办法简化你想做的事情。首先,为什么不重塑df2
只有1个单一的ID列(假设ID在所有3列中都是唯一的)。您可以通过创建3个单独的dfs然后使用bind_rows
联合在一起来完成此操作。
现在它被重新塑造,你可以做一个正确的连接。 df1
位于联接的右侧,df1
中的所有记录都将保留,与df2
是否匹配(否则V1
和{{1} }将为NULL,即V2
)。
使用NA
提供的示例数据,结果会出乎意料,因为每个ID都会重复而不是唯一的(所以我重新定义了df1
只有唯一ID)。如果ID不是唯一的,您可以按ID对结果进行分组,并在进行连接之前进行聚合。
df1