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
相关产品推荐
相关产品推荐

