dplyr连接:在使用数据库时,如何进行非标准连接`col1`!= `col2`?

3

当你在处理数据库时,如何使用dplyr进行非标准连接('col1' != 'col2')

示例:

设置数据库:

library(dplyr)

con <- DBI::dbConnect(RSQLite::SQLite(), ":memory:")

tableA <- data.frame(col1= c("a","b","c","d"),
                     col2 = c(1,2,3,4))

copy_to(con, tableA)

在使用数据库时,我想使用dplyr代码进行sql连接,以下是要执行的sql代码:

SQL代码:

tbl(con, sql("select a.col1, b.col2
              from 
              tableA as a
              inner join 
              tableA as b
              on a.col1 <> b.col1")) %>% 
 arrange(col1, col2)

结果:

# Source:     SQL [?? x 2]
# Database:   sqlite 3.19.3 [:memory:]
# Ordered by: col1, col2
     col1  col2
    <chr> <dbl
1     a     2
2     a     3
3     a     4
4     b     1
5     b     3
6     b     4
7     c     1
8     c     2
9     c     4
10     d     1
# ... with more rows

dplyr代码:

这是我试图重建上面SQL代码时尝试的初始dplyr代码:

tbl(con,"tableA")->dbtableA

dbtableA %>% 
  inner_join(dbtableA, by = c('col1' != 'col1')) %>% 
  select(col1, col2=col2.x) %>% 
  arrange(col1, col2)

错误: by必须是(命名的)字符向量、列表或自然连接的NULL(不建议在生产代码中使用),而不是逻辑值

尝试使用tidyr包解决此问题时,我收到了一个错误消息(如下所示):

library(tidyr)

dbtableA %>% 
  expand(col1,col2) %>% 
  left_join(dbtableA, by = 'col1') %>%
  filter(col2.x != col2.y) %>% 
  select(col1, col2 = col2.x) %>% 
  arrange(col1, col2)

错误:使用方法("expand_")时出错: 没有适用于类"c('tbl_dbi', 'tbl_sql', 'tbl_lazy', 'tbl')"的对象的'expand_'方法

当使用数据库时,有人知道如何编写dplyr代码进行此连接吗?非常感谢。

1个回答

4

我认为您对 by 参数的理解有误。

by = c("col1" = "col2") 中,= 不是等于运算符,而是赋值运算符(在 R 中,等于运算符是 ==)。c(...) 内部的表达式创建了一个命名字符向量(名称:col1,值:col2),dplyr 使用该向量进行连接。在任何地方都没有定义连接期间所进行的比较类型,比较方式已经在 dplyr 中硬编码。我不认为 dplyr 支持非等值连接(尚未支持)。

by = c("col1" != "col2") 中,!= 是不等于运算符。因此,您的语句与编写 by = TRUE 相同(这是无意义的)。

还可以查看此问题 ,了解关于 dplyr 中非等值连接的更多讨论。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接