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


R dplyr filter-joins 过滤连接


过滤连接根据 y 中是否存在匹配来过滤 x 中的行:

  • semi_join() 返回 x 中与 y 匹配的所有行。

  • anti_join() 返回 x 中没有与 y 匹配的所有行。

用法

semi_join(x, y, by = NULL, copy = FALSE, ...)

# S3 method for data.frame
semi_join(x, y, by = NULL, copy = FALSE, ..., na_matches = c("na", "never"))

anti_join(x, y, by = NULL, copy = FALSE, ...)

# S3 method for data.frame
anti_join(x, y, by = NULL, copy = FALSE, ..., na_matches = c("na", "never"))

参数

x, y

一对数据帧、数据帧扩展(例如 tibble)或惰性数据帧(例如来自 dbplyr 或 dtplyr)。有关更多详细信息,请参阅下面的方法。

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 连接表,但这是一项潜在昂贵的操作,因此您必须选择它。

...

传递给方法的其他参数。

na_matches

两个 NA 或两个 NaN 值应该匹配吗?

  • "na" (默认值)将两个 NA 或两个 NaN 值视为相等,例如 %in%match()merge()

  • "never" 将两个 NA 或两个 NaN 值视为不同的值,并且永远不会将它们匹配在一起或与任何其他值匹配。这类似于数据库源的联接和 base::merge(incomparables = NA)

x 类型相同的对象。输出具有以下属性:

  • 行是输入的子集,但以相同的顺序出现。

  • 列未修改。

  • DataFrame 属性被保留。

  • 组取自x。团体数量可能会减少。

方法

这些函数是泛型函数,这意味着包可以为其他类提供实现(方法)。有关额外参数和行为差异,请参阅各个方法的文档。

当前加载的包中可用的方法:

  • semi_join():dbplyr(tbl_lazy)、dplyr(data.frame)。

  • anti_join():dbplyr(tbl_lazy)、dplyr(data.frame)。

也可以看看

其他连接:cross_join()mutate-joinsnest_join()

例子

# "Filtering" joins keep cases from the LHS
band_members %>% semi_join(band_instruments)
#> Joining with `by = join_by(name)`
#> # A tibble: 2 × 2
#>   name  band   
#>   <chr> <chr>  
#> 1 John  Beatles
#> 2 Paul  Beatles
band_members %>% anti_join(band_instruments)
#> Joining with `by = join_by(name)`
#> # A tibble: 1 × 2
#>   name  band  
#>   <chr> <chr> 
#> 1 Mick  Stones

# To suppress the message about joining variables, supply `by`
band_members %>% semi_join(band_instruments, by = join_by(name))
#> # A tibble: 2 × 2
#>   name  band   
#>   <chr> <chr>  
#> 1 John  Beatles
#> 2 Paul  Beatles
# This is good practice in production code
源代码:R/join.R

相关用法


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