我很确定我会因为缺乏查询语言等知识而在这里感到尴尬。希望这是一个简单的查询。
如果我在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
是必需的,因为数据源没有公共变量
我了解...但是我不知道如何到达我要去的地方。
有人可以帮忙吗? 谢谢 艾伦
答案 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)