合并多列上的两个数据帧

时间:2017-10-01 09:23:31

标签: r merge dplyr

我想要合并两个数据帧:

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包含列V1V2以及ID。我尝试过使用mergeleft_joininner_join(来自dplyr),但无法弄清楚如何使用by参数。来自ID的{​​{1}}列可能存在于df1的三列(ID1ID2ID3)中的任何一列中。我怎样才能做到这一点?

2 个答案:

答案 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