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

dplyr联接:如何进行非标准联接'col1'!=`col2`在使用数据库时?,r,database,dplyr,dbplyr,R,Database,Dplyr,Dbplyr,使用数据库时,如何在dplyr中执行非标准联接('col1'!='col2') 例子: 设置数据库: 错误:by必须是(命名的)字符向量、列表,或者对于自然联接(不建议在生产代码中使用)为NULL,不符合逻辑 当尝试使用tidyr软件包(代码如下)解决此问题时,我收到一条错误消息: library(tidyr) dbtableA %>% expand(col1,col2) %>% left_join(dbtableA, by = 'col1') %>% fil

使用数据库时,如何在dplyr中执行非标准联接
('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)
错误:正在使用方法(“展开”): 没有适用于“c”类对象的“扩展”方法(“tbl\U dbi”、“tbl\U sql”、“tbl\U lazy”、“tbl”)


有人知道在使用数据库时如何在dplyr代码中编写这个连接吗?非常感谢。

我想你没有正确理解
参数

by=c(“col1”=“col2”)
中,
=
不是和相等运算符,而是赋值运算符(R中的相等运算符是
=
)。
c(…)
中的表达式创建dplyr用于联接的命名字符向量(名称:
col1
值:
col2
)。您没有定义在连接期间进行的比较类型,比较是用dplyr硬编码的。我认为dplyr还不支持非等连接

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

另外,还可以查看有关dplyr中非等联接主题的更多讨论

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
tbl(con,"tableA")->dbtableA

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

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