我有两个行不均匀的数据集(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
答案 0 :(得分:0)
inner_join也会返回具有50000个变量的数据 无法使用,因为DF1包含40,000个变量和DF 2 90,000 变量,因此结果应少于40,000个变量。
内部联接比DF1中产生更多行(使用变量:假设是行)的原因是,如果inner_join匹配多个匹配项,则它将所有此类组合返回为额外的1万行。如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)
希望这会有所帮助!