R中的dplyr语法-完全连接

时间:2019-11-04 13:00:01

标签: r dataframe dplyr

我很确定我会因为缺乏查询语言等知识而在这里感到尴尬。希望这是一个简单的查询。

如果我在R中有两个数据帧,我想创建我认为为“完全连接”的表,该表是一个表,其中第一个和第二个记录的每个记录组合框架。

因此,如果我进行设置(作为一个非常简单的示例):

df_1 <- data.frame(
  Col_1 = c("Alan", "Bob")
)

df_2 <- data.frame(
  Year = c(2005, 2006, 2007, 2008)
)

我想创建一个看起来像这样的数据框:

Col_1   Col_2
=====  =====
Alan    2005
Alan    2006
Alan    2007
Alan    2008
Bob     2005
Bob     2006
Bob     2007
Bob     2008

我希望我可以使用:

df_output <- full_join(df_1, df_2)

但是我收到一条错误消息

  

错误:by是必需的,因为数据源没有公共变量

我了解...但是我不知道如何到达我要去的地方。

有人可以帮忙吗? 谢谢 艾伦

3 个答案:

答案 0 :(得分:5)

我认为您不是在找full_join,而是在提迪尔找crossing


tidyr::crossing(df_1, df_2)

给你

# A tibble: 8 x 2
  Col_1  Year
  <fct> <dbl>
1 Alan   2005
2 Alan   2006
3 Alan   2007
4 Alan   2008
5 Bob    2005
6 Bob    2006
7 Bob    2007
8 Bob    2008

答案 1 :(得分:2)

您不是要完全加入,而是要expand.grid

expand.grid(Col_1 = c("Alan", "Bob"), Year = c(2005, 2006, 2007, 2008))

  Col_1 Year
1  Alan 2005
2   Bob 2005
3  Alan 2006
4   Bob 2006
5  Alan 2007
6   Bob 2007
7  Alan 2008
8   Bob 2008

我建议设置stringsAsFactors = FALSE,即

expand.grid(Col_1 = c("Alan", "Bob"), Year = c(2005, 2006, 2007, 2008),
            stringsAsFactors = FALSE)

答案 2 :(得分:1)

要使用dplyr中的full_join,应该有一个要连接的列,因此添加这样的列,然后再将其删除。

df_1 %>%
  mutate(join = 0) %>%
  full_join(mutate(df_2, join = 0), by = "join") %>%
  select(-join)

给予:

  Col_1 Year
1  Alan 2005
2  Alan 2006
3  Alan 2007
4  Alan 2008
5   Bob 2005
6   Bob 2006
7   Bob 2007
8   Bob 2008

请注意,没有任何包或需要添加虚拟列,我们可以使用merge

merge(df_1, df_2)