dplyr semi_join不应该返回重复项,但确实如此

时间:2015-06-12 15:58:48

标签: r dplyr

CRAN包中的dplyr文档,提及semi_join状态:"A semi join differs from an inner join because an inner join will return one row of x for each matching row of y, where a semi join will never duplicate rows of x"

但是,以下代码似乎在输出中提供了重复的x行:

x <- data.frame(x1=c(1,1,2), x2=c(2,2,2))
y <- data.frame(x2=c(1,2), x3=c(2,2))
c <- semi_join(x,y)

这段代码是否与文档相矛盾,还是我遗漏了一些明显的东西?

1 个答案:

答案 0 :(得分:3)

您的结果是我semi_join的结果 - x中的每一行都返回一次。加入不会删除x的重复行,这可能就是您对此的看法。为此,您可能会对 dplyr 中的distinct感兴趣。

为了更好地理解所有这些,在定义具有连接变量的重复值的y数据集时,比较semi_joininner_join的作用可能会有所帮助。要显示此信息,我会在2变量中添加第二个x2

y2 <- data.frame(x2=c(1, 2, 2), x3=c(2, 2, 2)) 

现在,我们可以看到inner_joinsemi_join中发生的情况。首先,我们看到inner_join重复行;即,它返回x两次的每一行。

inner_join(x, y2)
Joining by: "x2"
  x1 x2 x3
1  1  2  2
2  1  2  2
3  1  2  2
4  1  2  2
5  2  2  2
6  2  2  2

但是,正如帮助页面所述,semi_join不会重复行。在这种情况下,即使xy2变量中重复了值,也会返回x2的每一行。

semi_join(x, y2)
Joining by: "x2"
  x1 x2
1  1  2
2  1  2
3  2  2