【问题标题】:Performing a dplyr full_join without a common variable to blend data frames在没有公共变量的情况下执行 dplyr full_join 以混合数据帧
【发布时间】:2017-06-29 19:56:26
【问题描述】:

使用 dplyr full_join() 操作,我试图执行基本的 merge() 操作的等效项,其中不存在公共变量(无法满足“by =”参数)。这将混合两个数据框并返回所有可能的组合。

但是,当前的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.

【问题讨论】:

  • 这是一种愚蠢的方法,但你可以在每一侧创建一个恒定的变量并在其上合并...df_a$dummy = 1df_b$dummy = 1,然后在dummy上合并
  • 是的,这是次优的,但到目前为止,它似乎是仅使用 dplyr 的唯一方法。
  • 实际上有一个open issue 向 dplyr 添加交叉连接功能

标签: r dplyr


【解决方案1】:

您可以从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

【讨论】:

  • 此解决方案仅在 df_adf_b 仅包含一列时才有效。
  • @jarauh tidyr::crossing()df_a 有多个列时起作用,例如:df_a <- data.frame( x=1:4, y=1:4 ); df_b <- data.frame( z=5:8 ); tidyr::crossing( df_a, df_b )
  • @bmosov01 我确认。要么我错了,要么它不适用于旧版本的 tidyr
  • 使用交叉法将两个df混合在一起,效果很好!很好的解决方案。
猜你喜欢
  • 2022-01-20
  • 1970-01-01
  • 2021-12-07
  • 2019-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-19
相关资源
最近更新 更多