【问题标题】:dplyr joins: How do you do a non standard join `col1`!= `col2` when working with a database?dplyr joins:使用数据库时如何进行非标准连接 `col1`!= `col2`?
【发布时间】:2017-11-25 12:06:09
【问题描述】:

当您使用数据库时,如何在 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代码:

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)

错误:在 UseMethod("expand_") 中: 没有适用于“expand_”的方法应用于“c('tbl_dbi', 'tbl_sql', 'tbl_lazy', 'tbl')”类的对象

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

【问题讨论】:

    标签: r database dplyr dbplyr


    【解决方案1】:

    我认为您没有正确理解 by 参数。

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

    by = c("col1" != "col2") 中,!= 是不等式运算符。因此,您的陈述与写by = TRUE 相同(这是荒谬的)。

    还可以查看this question,了解有关 dplyr 中非 equi 连接主题的更多讨论。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-13
      • 2022-10-23
      • 1970-01-01
      • 1970-01-01
      • 2016-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多