簡體   English   中英

在沒有公共變量的情況下執行 dplyr full_join 以混合數據幀

[英]Performing a dplyr full_join without a common variable to blend data frames

使用 dplyr full_join()操作,我試圖執行與基本merge()操作等效的操作,其中不存在公共變量(無法滿足“by=”參數)。 這將混合兩個數據框並返回所有可能的組合。

但是,當前的full_join() function 需要一個公共變量。 我找不到另一個 dplyr function 可以幫助解決這個問題。 如何使用特定於 dplyr 庫的函數執行此操作?

df_a = data.frame(department=c(1,2,3,4))
df_b = data.frame(period=c(2014,2015,2016,2017))

#This works as desired
big_df = merge(df_a,df_b)

#I'd like to perform the following in a much bigger operation:
big_df = dplyr::full_join(df_a,df_b)

#Error: No common variables. Please specify `by` param.

你可以使用tidyr crossing

crossing(df_a,df_b)

   department period
1           1   2014
2           1   2015
3           1   2016
4           1   2017
5           2   2014
6           2   2015
7           2   2016
8           2   2017
9           3   2014
10          3   2015
11          3   2016
12          3   2017
13          4   2014
14          4   2015
15          4   2016
16          4   2017

如果有重復的行, crossing不會給出與merge相同的結果。

而是使用full_join with by = character()來執行交叉連接,生成df_adf_b的所有組合。

library("tidyverse") # version 1.3.2

# Add duplicate rows for illustration.
df_a <- tibble(department = c(1, 2, 3, 3))
df_b <- tibble(period = c(2014, 2015, 2016, 2017))

merge不會刪除重復數據。

df_a_merge_b <- merge(df_a, df_b)
df_a_merge_b
#>    department period
#> 1           1   2014
#> 2           2   2014
#> 3           3   2014
#> 4           3   2014
#> 5           1   2015
#> 6           2   2015
#> 7           3   2015
#> 8           3   2015
#> 9           1   2016
#> 10          2   2016
#> 11          3   2016
#> 12          3   2016
#> 13          1   2017
#> 14          2   2017
#> 15          3   2017
#> 16          3   2017

crossing刪除重復的行。

df_a_crossing_b <- crossing(df_a, df_b)
df_a_crossing_b
#> # A tibble: 12 × 2
#>    department period
#>         <dbl>  <dbl>
#>  1          1   2014
#>  2          1   2015
#>  3          1   2016
#>  4          1   2017
#>  5          2   2014
#>  6          2   2015
#>  7          2   2016
#>  8          2   2017
#>  9          3   2014
#> 10          3   2015
#> 11          3   2016
#> 12          3   2017

full_join也不刪除重復項。

df_a_full_join_b <- full_join(df_a, df_b, by = character())
df_a_full_join_b
#> # A tibble: 16 × 2
#>    department period
#>         <dbl>  <dbl>
#>  1          1   2014
#>  2          1   2015
#>  3          1   2016
#>  4          1   2017
#>  5          2   2014
#>  6          2   2015
#>  7          2   2016
#>  8          2   2017
#>  9          3   2014
#> 10          3   2015
#> 11          3   2016
#> 12          3   2017
#> 13          3   2014
#> 14          3   2015
#> 15          3   2016
#> 16          3   2017

packageVersion("tidyverse")
#> [1] '1.3.2'

創建於 2023-01-13,使用reprex v2.0.2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM