当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R dtplyr left_join.dtplyr_step 连接数据表


这些是 dplyr 泛型 left_join()right_join()inner_join()full_join()anti_join()semi_join() 的方法。左、右、内和反连接被转换为 [.data.table 等效的完全连接到 data.table::merge.data.table() 。在某些情况下,左连接、右连接和全连接后面会调用 data.table::setcolorder()data.table::setnames(),以确保列顺序和名称与 dplyr 约定匹配。半连接没有直接的 data.table 等效项。

用法

# S3 method for dtplyr_step
left_join(x, y, ..., by = NULL, copy = FALSE, suffix = c(".x", ".y"))

参数

x, y

一对lazy_dt()

...

传递给方法的其他参数。

by

使用 join_by() 创建的连接规范,或要连接的变量的字符向量。

如果 NULL (默认值),*_join() 将使用 xy 之间的所有共同变量执行自然连接。一条消息列出了变量,以便您可以检查它们是否正确;通过显式提供 by 来抑制该消息。

要连接 xy 之间的不同变量,请使用 join_by() 规范。例如, join_by(a == b) 将匹配 x$ay$b

要连接多个变量,请使用带有多个表达式的 join_by() 规范。例如, join_by(a == b, c == d)x$ay$b 匹配,将 x$cy$d 匹配。如果 xy 之间的列名称相同,您可以通过仅列出变量名称来缩短列名称,例如 join_by(a, c)

join_by() 还可用于执行不等式连接、滚动连接和重叠连接。有关这些类型的连接的详细信息,请参阅?join_by 中的文档。

对于简单的等式连接,您也可以指定要连接的变量名称的字符向量。例如, by = c("a", "b")x$a 连接到 y$a 并将 x$b 连接到 y$b 。如果 xy 之间的变量名称不同,请使用命名字符向量,例如 by = c("x_a" = "y_a", "x_b" = "y_b")

要执行交叉联接,生成 xy 的所有组合,请参阅 cross_join()

copy

如果 xy 不是来自同一个数据源,并且 copyTRUE ,则 y 将被复制到与 x 相同的源中。这允许您跨 src 连接表,但这是一项潜在昂贵的操作,因此您必须选择它。

suffix

如果 xy 中存在未连接的重复变量,这些后缀将添加到输出中以消除它们的歧义。应该是长度为 2 的字符向量。

例子

library(dplyr, warn.conflicts = FALSE)

band_dt <- lazy_dt(dplyr::band_members)
instrument_dt <- lazy_dt(dplyr::band_instruments)

band_dt %>% left_join(instrument_dt)
#> Joining, by = "name"
#> Source: local data table [3 x 3]
#> Call:   setcolorder(`_DT23`[`_DT22`, on = .(name), allow.cartesian = TRUE], 
#>     c(1L, 3L, 2L))
#> 
#>   name  band    plays 
#>   <chr> <chr>   <chr> 
#> 1 Mick  Stones  NA    
#> 2 John  Beatles guitar
#> 3 Paul  Beatles bass  
#> 
#> # Use as.data.table()/as.data.frame()/as_tibble() to access results
band_dt %>% right_join(instrument_dt)
#> Joining, by = "name"
#> Source: local data table [3 x 3]
#> Call:   `_DT22`[`_DT23`, on = .(name), allow.cartesian = TRUE]
#> 
#>   name  band    plays 
#>   <chr> <chr>   <chr> 
#> 1 John  Beatles guitar
#> 2 Paul  Beatles bass  
#> 3 Keith NA      guitar
#> 
#> # Use as.data.table()/as.data.frame()/as_tibble() to access results
band_dt %>% inner_join(instrument_dt)
#> Joining, by = "name"
#> Source: local data table [2 x 3]
#> Call:   `_DT22`[`_DT23`, on = .(name), nomatch = NULL, allow.cartesian = TRUE]
#> 
#>   name  band    plays 
#>   <chr> <chr>   <chr> 
#> 1 John  Beatles guitar
#> 2 Paul  Beatles bass  
#> 
#> # Use as.data.table()/as.data.frame()/as_tibble() to access results
band_dt %>% full_join(instrument_dt)
#> Joining, by = "name"
#> Source: local data table [4 x 3]
#> Call:   merge(`_DT22`, `_DT23`, all = TRUE, by.x = "name", by.y = "name", 
#>     allow.cartesian = TRUE)
#> 
#>   name  band    plays 
#>   <chr> <chr>   <chr> 
#> 1 John  Beatles guitar
#> 2 Keith NA      guitar
#> 3 Mick  Stones  NA    
#> 4 Paul  Beatles bass  
#> 
#> # Use as.data.table()/as.data.frame()/as_tibble() to access results

band_dt %>% semi_join(instrument_dt)
#> Joining, by = "name"
#> Source: local data table [2 x 2]
#> Call:   `_DT22`[unique(`_DT22`[`_DT23`, which = TRUE, nomatch = NULL, 
#>     on = .(name)])]
#> 
#>   name  band   
#>   <chr> <chr>  
#> 1 John  Beatles
#> 2 Paul  Beatles
#> 
#> # Use as.data.table()/as.data.frame()/as_tibble() to access results
band_dt %>% anti_join(instrument_dt)
#> Joining, by = "name"
#> Source: local data table [1 x 2]
#> Call:   `_DT22`[!`_DT23`, on = .(name)]
#> 
#>   name  band  
#>   <chr> <chr> 
#> 1 Mick  Stones
#> 
#> # Use as.data.table()/as.data.frame()/as_tibble() to access results
源代码:R/step-join.R

相关用法


注:本文由纯净天空筛选整理自Hadley Wickham等大神的英文原创作品 Join data tables。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。