You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 03:17:12