执行dplyr full_join而不使用公共变量来混合数据框

7xllpg7q  于 2023-01-15  发布在  其他
关注(0)|答案(2)|浏览(93)

使用dplyr full_join()操作,我试图执行一个基本的merge()操作,其中不存在公共变量(无法满足“by=”参数),这将混合两个 Dataframe 并返回所有可能的组合。
但是,当前的full_join()函数需要一个公共变量。我无法找到另一个dplyr函数来帮助完成此操作。如何使用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.
mftmpeh8

mftmpeh81#

您可以使用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
pod7payv

pod7payv2#

如果存在重复行,crossing不会给予与merge相同的结果。
相反,使用full_joinby = 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年1月13日,使用reprex v2.0.2

相关问题