【问题标题】:Non-equi join in tidyversetidyverse 中的非 equi 连接
【发布时间】:2021-05-28 01:26:43
【问题描述】:

我想知道是否有人知道dplyr 扩展包(dbplyrdtplyr)是否允许在通常的 dplyr 工作流程中进行非 equi 连接?我很少需要data.table,但是快速非等连接是我总是需要setDT,然后执行连接,然后用as_tibble() 切换回来的唯一时刻。我在 github 上浏览了包中的问题,但没有发现这是计划中的还是已经实现的。

【问题讨论】:

标签: r join dplyr dbplyr dtplyr


【解决方案1】:

对于 dbplyr:虽然 SQL 支持非 equi 连接,但我还没有找到等效的 dplyr 方法。我通常的工作与@Waldi 发布的 r-bloggers 链接非常相​​似,用于加入相等条件,然后过滤不等条件。

例如:

output = join(df1, df2, by = c("df1_id" = "df2_id")) %>%
  filter(df1_date <= df2_date)

这转换为类似于以下的 SQL:

SELECT *
FROM df1
JOIN df2
ON df1_id = df2_id
WHERE df1_date <= df2_date

这与以下没有什么不同:

SELECT *
FROM df1
JOIN df2
ON df1_id = df2_id
AND df1_date <= df2_date

【讨论】:

    【解决方案2】:

    我喜欢 dplyr 的简单性。但是,我需要在工作中基于 >、

    我看到您正在使用相同的方法。如果您的数据量适中,我认为这是最好的。 dplyr 中的模糊连接和过滤方法都花费了太多时间。

    【讨论】:

      【解决方案3】:

      自 1.4.0 版以来,dbplyr 中为此提供了一个新选项:sql_on。引用Kirill Müller

      dplyr 有 #2240,但这需要一段时间。对于数据库,我们已经有一个解决方法 [ie.通用 SQL 连接]。

      library(dplyr)
      library(dbplyr)
      tbl1 <- memdb_frame(a = 1:3, b = 4:2)
      tbl2 <- memdb_frame(c = 1:3, b = 2:0)
      left_join(tbl1, tbl2, sql_on = "LHS.b < RHS.c")
      

      【讨论】:

        猜你喜欢
        • 2020-09-30
        • 1970-01-01
        • 2017-11-01
        • 2019-11-12
        • 1970-01-01
        • 2017-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多