You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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))

对应的表格形式:

Val1Val2Val3Val4
10A15
10B25
10C35
10D45
21A15
21B25
21C35
21D45
31A15
31B25
31C35
31D45

解决方案

其实用R基础包的merge()函数就能搞定!关键是不指定连接键(因为我们要所有组合,没有特定的匹配字段),同时设置all=TRUE:

# 生成全组合的datC
datC <- merge(datA, datB, all = TRUE)

运行这段代码后,就能直接得到我们想要的笛卡尔积结果。

补充说明

这个操作的专业术语叫做笛卡尔积连接(Cartesian join),也叫全交叉连接(full cross join)。如果一开始知道这个术语,搜索相关解决方案就会轻松很多~

内容的提问来源于stack exchange,提问作者BenedictHyland

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 03:47:44