基于一列联接两个数据集

时间:2019-01-16 20:24:30

标签: r dplyr

我有两个行不均匀的数据集(DF1,DF2),并且我试图使用两个数据集中都存在的唯一ID列合并这两个数据集。我的条件是,我只希望DF1和DF2中都存在具有匹配ID的行,这意味着,如果DF2中有ID,而DF1中没有,则将其删除,反之亦然。同样,我希望DF1和DF2中的所有相应列都在新的DF3中。

我试图做一个semi_join,但是它只包含DF1而不是DF2的列。同样,inner_join返回的数据具有50000个变量,该变量不起作用,因为DF1包含40,000个变量,而DF 2包含90,000个变量,因此结果应小于40,000个变量。

test <- semi_join(x = DF1, y = DF2, by = "ID")  
test2 <- inner_join(x = DF1, y = DF2, by = "ID")  

给出了DF 1和2,而DF3是我想要的结果。

DF1
ID                  Name                     Date
1 98251           MacDonald, Nich 100000    2013/07/21      
2 98252           John, B~ 100000           2013/06/10    
3 98253           Larry, B~ 100000          2013/04/13

DF2
ID                  Name                     Action
1 98252           Bond, Nich 100000         Eat     
2 98253           John, B~ 100000           Eat   
3 98256           Larry, B~ 100000          Eat            


DF3
ID                  Name                     Date                Action    
2 98252           John, B~ 100000           2013/06/10             Eat
3 98253           Larry, B~ 100000          2013/04/13             Eat

1 个答案:

答案 0 :(得分:0)

  

inner_join也会返回具有50000个变量的数据   无法使用,因为DF1包含40,000个变量和DF 2 90,000   变量,因此结果应少于40,000个变量。

内部联接比DF1中产生更多行(使用变量:假设是行)的原因是,如果inner_join匹配多个匹配项,则它将所有此类组合返回为额外的1万行。如join {dplyr}中所述: enter image description here

因此,您需要做的是通过'ID'使用唯一:

test2 <- unique(inner_join(x = DF1, y = DF2, by = "ID"),by = "ID")

您最终将在test2中获得40k行。但是,如果有多个匹配项,我们正在做的是删除ID以后的所有第二个匹配项。如果要以相反的顺序删除:请改用:

test2 <- unique(inner_join(x = DF1, y = DF2, by = "ID"),by = "ID",fromLast= TRUE)

希望这会有所帮助!