如何将筛选未匹配行的左连接SQL语句转换为正确的dplyr写法
问题解决:SQL左连接过滤未匹配记录的dplyr实现
你原有代码存在两个问题:
- 语法错误:
left_join的参数括号未闭合,by = c('id1' = 'id2')后面缺了一个右括号 - 逻辑错误:dplyr左连接后,未匹配到的右表字段取值为
NA而非R语言原生的NULL,所以过滤应该用is.na()而非is.null()
修正后的原逻辑写法
data <- table1 %>% left_join(table2, by = c('id1' = 'id2')) %>% # 补全右括号 filter(is.na(id2)) # 替换is.null为is.na
更简洁的等价写法
你的需求本质是取仅在table1中存在、在table2中不存在的记录,dplyr专门提供了anti_join实现该逻辑,性能更高代码更简洁,和你给出的SQL功能完全等价:
data <- table1 %>% anti_join(table2, by = c('id1' = 'id2'))
注意:
anti_join默认仅返回左表(table1)的字段,如果你的业务需要保留右表所有字段的空值结果,可以使用第一种修正后的左连接+过滤写法。
内容的提问来源于stack exchange,提问作者Davit
相关产品推荐
相关产品推荐

