semi_join是否具有结合性?基于定义的疑问与验证
关于dplyr中semi_join的交换性验证
根据semi_join的定义,我原本认为它具有结合性,但不确定自己的理解是否准确。以下是用于验证的R语言dplyr代码:
library(dplyr) set.seed(100) x1 <- tibble( id = floor(runif(100, 10, 1000)) ) set.seed(20) x2 <- tibble( id = floor(runif(100, 10, 1000)) ) x1 |> semi_join(x2) |> arrange(id) x2 |> semi_join(x1) |> arrange(id)
运行上述代码后会发现,两个表达式的输出结果完全一致:它们都会返回两个表中共同存在的id值,排序后内容完全相同。
这里需要厘清一个概念:你代码验证的其实是semi_join的交换性(即当连接键为同一列时,A semi_join B 和 B semi_join A 的结果内容等价),而非结合性(结合性指的是(A semi_join B) semi_join C 与 A semi_join (B semi_join C) 的等价性)。
不过无论是交换性还是结合性,对于基于键交集的semi_join来说都是成立的:
- 交换性:两个表的键的交集是双向的,因此交换半连接的前后表,最终得到的键集合一致,结果内容等价。
- 结合性:连续三次半连接本质上是取三个表键的交集,交集运算的结合性决定了半连接的结合性,顺序不影响最终结果。
内容的提问来源于stack exchange,提问作者Moses
相关产品推荐
相关产品推荐

