首页 > 解决方案 > 基于一列连接两个数据集

问题描述

我有两个不均匀行的数据集(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

`

标签: rdplyr

解决方案


以及 inner_join 返回具有 50000 个变量的数据,这不起作用,因为 DF1 包含 40,000 个变量和 DF 2 90,000 个变量,因此结果应该少于 40,000 个变量。

内连接产生比 DF1 中的行更多的行(您使用变量:假设您的意思是行)的原因是因为如果 inner_join 匹配多个匹配项,它会将所有此类组合作为额外的 10k 行返回。如 join{dplyr} 中所述: 在此处输入图像描述

所以你需要做的是使用唯一的'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)

希望这可以帮助!


推荐阅读