如何用dplyr生成变量的所有组合?支持data.table方案
Hey there! 要生成这三个数据表的全笛卡尔积(也就是所有可能的组合,3×3×3=27行),用dplyr或者data.table都能轻松实现,而且都能应对百万级的大数据量,下面给你具体的实现方案:
用dplyr实现
dplyr里专门有个cross_join()函数,就是用来生成多个数据框的全笛卡尔积的,用法非常直接:
library(dplyr) # 先构造示例数据框 DF1 <- tibble(ColA = c("A", "B", "C")) DF2 <- tibble(ColB = c(1, 2, 3)) DF3 <- tibble(ColC = c("!", "@", "%")) # 生成全组合 full_combo_df <- cross_join(DF1, DF2, DF3) # 验证行数:3*3*3=27行 nrow(full_combo_df)
这个函数会自动把所有输入数据框的行做全组合,输出结果完全符合你给出的示例格式。
用data.table实现
如果是百万级的大数据量,data.table的性能会更有优势,它有两种常用的方式实现笛卡尔积:
方法1:用CJ()函数(推荐,更高效)
CJ()是data.table专门用来生成笛卡尔积的函数,直接传入各列的取值向量即可:
library(data.table) # 构造示例data.table DT1 <- data.table(ColA = c("A", "B", "C")) DT2 <- data.table(ColB = c(1, 2, 3)) DT3 <- data.table(ColC = c("!", "@", "%")) # 生成全组合 full_combo_dt <- CJ(ColA = DT1$ColA, ColB = DT2$ColB, ColC = DT3$ColC)
方法2:用交叉连接语法
也可以通过data.table的连接语法,设置allow.cartesian=TRUE来实现全交叉连接:
full_combo_dt <- DT1[DT2, on = .(), allow.cartesian = TRUE][DT3, on = .(), allow.cartesian = TRUE]
两种方法都能得到27行的全组合结果,其中CJ()的性能更优,尤其适合处理百万级的大规模数据,内存占用和运算速度都比常规连接方式更好。
内容的提问来源于stack exchange,提问作者John Thomas
相关产品推荐
相关产品推荐

