當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。