R语言如何用expand.grid/crossing实现多列全组合生成数据框
实现方案
你要的是多分组取值的全交叉组合结果,核心要注意:分组1的每行是绑定的2个字母组合,不能把两列拆成独立向量做交叉,否则会打散原有配对关系。
- 最稳妥的无依赖原生R实现,用全连接加辅助列即可,不需要额外安装第三方包:
# 按原有逻辑生成两个分组数据框 group_1 <- data.frame(t(combn(letters[1:5], 2))) group_2 <- data.frame(X1 = letters[6:9]) # 加常量辅助列做无匹配键的全连接,生成所有交叉组合 result <- merge( transform(group_1, tmp_join = 1), transform(group_2, tmp_join = 1), by = "tmp_join" )[, -1] # 移除临时辅助列
运行后得到的result就是目标结果:共40行3列,总记录数10*4=40,完全符合预期。
- 如果你习惯用tidyverse生态的函数,也可以用
tidyr::crossing直接实现,写法更简洁:
library(tidyr) result <- crossing(group_1, group_2, .name_repair = "minimal")
注意点
你最初想到的expand.grid更适合独立向量之间的元素全交叉场景,如果你直接把分组1的两列、分组2的一列拆成独立向量传入expand.grid,会把分组1原本绑定的字母配对打散,生成C(5,1)*C(4,1)*C(4,1)=80行的错误结果,这点要特别注意。
可以用下面的命令校验结果是否符合要求:
nrow(result) # 输出40即行数正确 ncol(result) # 输出3即列数正确
内容的提问来源于stack exchange,提问作者Jeff Henderson
相关产品推荐
相关产品推荐

