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)
向所有人道歉:以下示例似乎不适用于data.frames或data.tables.
当x和y是数据库tbls(tbl_dbi/ tbl_sql)时,你现在也可以这样做:
full_join(x, y, by = character())
在2017年底添加到dplyr,并且还被转换为CROSS JOINDB世界中的一个.保存必须引入假变量的肮脏.
如果我们需要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)
遇到这个问题时,我倾向于这样做:
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()选项更整洁.