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)
这段代码是否与文档相矛盾,还是我遗漏了一些明显的东西?
答案 0 :(得分:3)
您的结果是我semi_join
的结果 - x
中的每一行都返回一次。加入不会删除x
的重复行,这可能就是您对此的看法。为此,您可能会对 dplyr 中的distinct
感兴趣。
为了更好地理解所有这些,在定义具有连接变量的重复值的y数据集时,比较semi_join
与inner_join
的作用可能会有所帮助。要显示此信息,我会在2
变量中添加第二个x2
。
y2 <- data.frame(x2=c(1, 2, 2), x3=c(2, 2, 2))
现在,我们可以看到inner_join
与semi_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
不会重复行。在这种情况下,即使x
在y2
变量中重复了值,也会返回x2
的每一行。
semi_join(x, y2)
Joining by: "x2"
x1 x2
1 1 2
2 1 2
3 2 2