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

inner_join与semi_join的区别是什么?请基于R语言举例说明

inner_join 与 semi_join 的核心区别及示例

先明确两者最关键的差异:

  • semi_join(x, y):只返回x中在y里有匹配的行,而且不管y里对应有多少个匹配结果,x的行只会保留一次
  • inner_join(x, y):保留x中在y里有匹配键的行,但如果y里对应有多个匹配结果,x的行会被重复输出,每一个匹配对应一行

示例代码

先构造两个测试数据框:

library(dplyr)

# 用户表x
x <- tibble(
  user_id = c(1, 2, 3, 4),
  name = c("张三", "李四", "王五", "赵六")
)

# 订单表y(用户1有2个订单,用户2有1个订单,用户5是新用户)
y <- tibble(
  order_id = c(101, 102, 103),
  user_id = c(1, 1, 2),
  amount = c(100, 200, 150)
)

执行 semi_join

semi_join(x, y, by = "user_id")

结果:

# A tibble: 2 × 2
  user_id name 
    <dbl> <chr>
1       1 张三
2       2 李四

解释:只保留了x里在y有订单的用户,不管用户有几个订单,每个用户只出现一次。

执行 inner_join

inner_join(x, y, by = "user_id")

结果:

# A tibble: 3 × 4
  user_id name  order_id amount
    <dbl> <chr>    <dbl>  <dbl>
1       1 张三       101    100
2       1 张三       102    200
3       2 李四       103    150

解释:用户1在y里有2个订单,所以x里的用户1行被重复了2次,分别对应两个订单记录;用户2只有1个订单,所以只出现一次。

总结:如果只需要判断x中的行是否在y里存在匹配,不需要关联y的其他数据,用semi_join;如果需要把y的匹配数据和x合并,并且接受x行因y多匹配而重复,用inner_join。

内容的提问来源于stack exchange,提问作者Omar Bensiab

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 10:47:36