与dplyr R的笛卡尔积

Luc*_*nno 20 r cartesian-product dplyr

我正试图找到笛卡尔积的dplyr函数.我有两个简单的data.frame,没有公共变量:

x <- data.frame(x=c("a","b","c"))
y <- data.frame(y=c(1,2,3))
Run Code Online (Sandbox Code Playgroud)

我想重现一下结果

merge(x,y)

  x y
1 a 1
2 b 1
3 c 1
4 a 2
5 b 2
6 c 2
7 a 3
8 b 3
9 c 3
Run Code Online (Sandbox Code Playgroud)

我已经找到了这个(例如这里这里)没有找到任何有用的东西.

非常感谢你

Gre*_*urm 26

使用从包裹穿过tidyr:

x <- data.frame(x=c("a","b","c"))
y <- data.frame(y=c(1,2,3))

crossing(x, y)
Run Code Online (Sandbox Code Playgroud)

结果:

   x y
 1 a 1
 2 a 2
 3 a 3
 4 b 1
 5 b 2
 6 b 3
 7 c 1
 8 c 2
 9 c 3
Run Code Online (Sandbox Code Playgroud)


dsz*_*dsz 7

向所有人道歉:以下示例似乎不适用于data.frames或data.tables.

当x和y是数据库tbls(tbl_dbi/ tbl_sql)时,你现在也可以这样做:

full_join(x, y, by = character())

在2017年底添加到dplyr,并且还被转换为CROSS JOINDB世界中的一个.保存必须引入假变量的肮脏.

  • 我正在运行dplyr 0.7.6并且这给出了错误`full_join_impl中的错误(x,y,by_x,by_y,aux_x,aux_y,na_matches):必须为给定示例指定要加入的变量`.有任何想法吗? (2认同)

akr*_*run 6

如果我们需要tidyverse输出,我们可以使用expandfromtidyr

library(tidyverse)
y %>% 
   expand(y, x= x$x) %>%
   select(x,y)
# A tibble: 9 × 2
#       x     y
#  <fctr> <dbl>
#1      a     1
#2      b     1
#3      c     1
#4      a     2
#5      b     2
#6      c     2
#7      a     3
#8      b     3
#9      c     3
Run Code Online (Sandbox Code Playgroud)


and*_*yyy 5

遇到这个问题时,我倾向于这样做:

x <- data.frame(x=c("a","b","c"))
y <- data.frame(y=c(1,2,3))
x %>% mutate(temp=1) %>% 
inner_join(y %>% mutate(temp=1),by="temp") %>%
dplyr::select(-temp) 
Run Code Online (Sandbox Code Playgroud)

如果x和y是多列数据帧,但我想要将x行与y行的每个组合进行处理,那么这比我可以提出的任何expand.grid()选项更整洁.