tidyverse 中的非等值加入

b_s*_*ial 12 join r dplyr dtplyr dbplyr

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

Maë*_*aël 15

1.1.0由于通过函数可以使用非等值连接join_by。要创建非等值连接,您可以使用、<>>=<=辅助函数betweenwithinoverlapsnearest

library(dplyr)

#Example from https://github.com/tidyverse/dplyr/pull/5910.

set.seed(123)
dates <- as.Date("2019-01-01") + 0:4
needles <- tibble(dates = dates, x = sample(length(dates)))

set.seed(123)
lower <- as.Date("2019-01-01") + sample(6, 5, replace = TRUE)
upper <- lower + sample(2, 5, replace = TRUE)
haystack <- tibble(lower = lower, upper = upper, y = sample(length(lower)))

needles
#> # A tibble: 5 x 2
#>   dates          x
#>   <date>     <int>
#> 1 2019-01-01     3
#> 2 2019-01-02     2
#> 3 2019-01-03     5
#> 4 2019-01-04     4
#> 5 2019-01-05     1
haystack
#> # A tibble: 5 x 3
#>   lower      upper          y
#>   <date>     <date>     <int>
#> 1 2019-01-04 2019-01-06     1
#> 2 2019-01-07 2019-01-08     2
#> 3 2019-01-04 2019-01-05     3
#> 4 2019-01-03 2019-01-05     4
#> 5 2019-01-03 2019-01-05     5

# Non-equi join
# For each row in `needles`, find locations in `haystack` matching the condition
left_join(needles, haystack, by = join_by(dates >= lower, dates <= upper))
#> # A tibble: 12 x 5
#>    dates          x lower      upper          y
#>    <date>     <int> <date>     <date>     <int>
#>  1 2019-01-01     3 NA         NA            NA
#>  2 2019-01-02     2 NA         NA            NA
#>  3 2019-01-03     5 2019-01-03 2019-01-05     4
#>  4 2019-01-03     5 2019-01-03 2019-01-05     5
#>  5 2019-01-04     4 2019-01-04 2019-01-06     1
#>  6 2019-01-04     4 2019-01-04 2019-01-05     3
#>  7 2019-01-04     4 2019-01-03 2019-01-05     4
#>  8 2019-01-04     4 2019-01-03 2019-01-05     5
#>  9 2019-01-05     1 2019-01-04 2019-01-06     1
#> 10 2019-01-05     1 2019-01-04 2019-01-05     3
#> 11 2019-01-05     1 2019-01-03 2019-01-05     4
#> 12 2019-01-05     1 2019-01-03 2019-01-05     5
Run Code Online (Sandbox Code Playgroud)


Jar*_*ski 5

dbplyr自 1.4.0 版本以来,出现了一个新选项: sql_on。引用基里尔 M\xc3\xbcller

\n
\n

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

\n
\n
library(dplyr)\nlibrary(dbplyr)\ntbl1 <- memdb_frame(a = 1:3, b = 4:2)\ntbl2 <- memdb_frame(c = 1:3, b = 2:0)\nleft_join(tbl1, tbl2, sql_on = "LHS.b < RHS.c")\n
Run Code Online (Sandbox Code Playgroud)\n