在R中合并两个不同大小的DataFrame以生成包含所有组合的长格式DataFrame
如何在R中生成两个DataFrame的全组合(笛卡尔积)长格式数据
我之前碰到过一个头疼的问题:想把两个不同大小的DataFrame(datA和datB)合并成包含所有可能行组合的长格式数据,但因为不知道这个操作的专业术语,搜了好半天都没找到正确的方法。现在把解决方案整理出来,希望能帮到和我一样曾经困惑的小伙伴!
示例输入数据
先看一下我们的两个源DataFrame:
datA <- data.frame("Val1" = c(1, 2, 3), "Val2" = c(0,1,1)) datB <- data.frame("Val3" = c("A","B","C","D"), "Val4" = c(15,25,35,45))
期望的输出结果
我们想要生成的datC是两个DataFrame的所有行组合(也就是笛卡尔积),具体格式如下:
datC <- data.frame("Val1" = c(1,1,1,1,2,2,2,2,3,3,3,3), "Val2" = c(0,0,0,0,1,1,1,1,1,1,1,1), "Val3" = c("A","B","C","D","A","B","C","D","A","B","C","D"), "Val4" = c(15,25,35,45,15,25,35,45,15,25,35,45))
对应的表格形式:
| Val1 | Val2 | Val3 | Val4 |
|---|---|---|---|
| 1 | 0 | A | 15 |
| 1 | 0 | B | 25 |
| 1 | 0 | C | 35 |
| 1 | 0 | D | 45 |
| 2 | 1 | A | 15 |
| 2 | 1 | B | 25 |
| 2 | 1 | C | 35 |
| 2 | 1 | D | 45 |
| 3 | 1 | A | 15 |
| 3 | 1 | B | 25 |
| 3 | 1 | C | 35 |
| 3 | 1 | D | 45 |
解决方案
其实用R基础包的merge()函数就能搞定!关键是不指定连接键(因为我们要所有组合,没有特定的匹配字段),同时设置all=TRUE:
# 生成全组合的datC datC <- merge(datA, datB, all = TRUE)
运行这段代码后,就能直接得到我们想要的笛卡尔积结果。
补充说明
这个操作的专业术语叫做笛卡尔积连接(Cartesian join),也叫全交叉连接(full cross join)。如果一开始知道这个术语,搜索相关解决方案就会轻松很多~
内容的提问来源于stack exchange,提问作者BenedictHyland
相关产品推荐
相关产品推荐

