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


R dplyr nest_join 嵌套連接


嵌套連接使 x 幾乎保持不變,隻是它添加了一個新的列表列,其中每個元素包含 y 中與 x 中相應行匹配的行。

用法

nest_join(x, y, by = NULL, copy = FALSE, keep = NULL, name = NULL, ...)

# S3 method for data.frame
nest_join(
  x,
  y,
  by = NULL,
  copy = FALSE,
  keep = NULL,
  name = NULL,
  ...,
  na_matches = c("na", "never"),
  unmatched = "drop"
)

參數

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 連接表,但這是一項潛在昂貴的操作,因此您必須選擇它。

keep

新的列表列是否應該包含連接鍵?默認情況下將保留不等式連接的連接鍵。

name

由連接創建的列表列的名稱。如果 NULL (默認值),則使用 y 的名稱。

...

傳遞給方法的其他參數。

na_matches

兩個 NA 或兩個 NaN 值應該匹配嗎?

  • "na" (默認值)將兩個 NA 或兩個 NaN 值視為相等,例如 %in%match()merge()

  • "never" 將兩個 NA 或兩個 NaN 值視為不同的值,並且永遠不會將它們匹配在一起或與任何其他值匹配。這類似於數據庫源的聯接和 base::merge(incomparables = NA)

unmatched

應如何處理會導致刪除行的不匹配鍵?

  • "drop" 從結果中刪除不匹配的鍵。

  • 如果檢測到不匹配的鍵,"error" 會引發錯誤。

unmatched 旨在防止您在連接期間意外刪除行。它僅檢查輸入中可能會刪除行的不匹配鍵。

  • 對於左連接,它檢查 y

  • 對於右連接,它檢查 x

  • 對於內部聯接,它檢查 xy 。在這種情況下,unmatched 也可以是長度為 2 的字符向量,以獨立指定 xy 的行為。

輸出:

  • x 類型相同(包括具有相同的組)。

  • x 具有完全相同的行數。

  • 包含 x 的所有列,順序相同且值相同。僅當 keep = FALSE 時,它們才會被(輕微)修改,此時 by 中列出的列將被強製為 xy 中的通用類型。

  • 在最右側獲得一個名為 {name} 的新列,這是一個包含與 y 類型相同的數據幀的列表列。

與其他連接的關係

您可以根據嵌套連接的結果重新創建許多其他連接:

方法

該函數是泛型函數,這意味著包可以為其他類提供實現(方法)。有關額外參數和行為差異,請參閱各個方法的文檔。

當前在加載的包中可以使用以下方法: dplyr ( data.frame ) 。

也可以看看

其他連接:cross_join()filter-joinsmutate-joins

例子

df1 <- tibble(x = 1:3)
df2 <- tibble(x = c(2, 3, 3), y = c("a", "b", "c"))

out <- nest_join(df1, df2)
#> Joining with `by = join_by(x)`
out
#> # A tibble: 3 × 2
#>       x df2             
#>   <dbl> <list>          
#> 1     1 <tibble [0 × 1]>
#> 2     2 <tibble [1 × 1]>
#> 3     3 <tibble [2 × 1]>
out$df2
#> [[1]]
#> # A tibble: 0 × 1
#> # ℹ 1 variable: y <chr>
#> 
#> [[2]]
#> # A tibble: 1 × 1
#>   y    
#>   <chr>
#> 1 a    
#> 
#> [[3]]
#> # A tibble: 2 × 1
#>   y    
#>   <chr>
#> 1 b    
#> 2 c    
#> 
源代碼:R/join.R

相關用法


注:本文由純淨天空篩選整理自Hadley Wickham等大神的英文原創作品 Nest join。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。