如何合并两个向量筛选后的组合数据集获取全交叉组合?
解决两个数据集的全量组合(笛卡尔积)合并问题
我明白你要的是把x_all里的每一行,都和y_all里的每一行进行配对,也就是生成两个数据集的笛卡尔积——之前用merge按index合并的方式,只会把两个数据集里相同位置的行配对,这就漏掉了大部分你想要的组合。
先回顾你的数据预处理步骤(方便对照)
首先生成原始向量并筛选出连续步长为2的长度为5的组合:
# 生成原始向量 x_1 = seq(0,49,2) y_1 = seq(-90,-51,2) # 生成所有长度为5的组合并转成数据框 library(tidyr) x_all = data.frame(t(rbind(combn(x_1, 5)))) y_all = data.frame(t(rbind(combn(y_1, 5)))) # 筛选元素步长为2的连续组合 x_all = x_all[x_all$X2 - x_all$X1 == 2 & x_all$X3 - x_all$X2 == 2 & x_all$X4 - x_all$X3 == 2 & x_all$X5 - x_all$X4 == 2, ] y_all = y_all[y_all$X2 - y_all$X1 == 2 & y_all$X3 - y_all$X2 == 2 & y_all$X4 - y_all$X3 == 2 & y_all$X5 - y_all$X4 == 2, ]
正确的全组合合并方法
这里有两种简单的实现方式,都能得到你想要的所有可能配对:
方法1:使用tidyr::crossing(推荐,代码简洁)
crossing函数专门用来生成多个数据集的笛卡尔积,直接传入两个数据集即可:
library(tidyr) x_y_all = crossing(x_all, y_all)
运行后得到的x_y_all就是你期望的格式:x_all的每一行都会和y_all的每一行组合,列名会自动加上.x和.y后缀区分,和你给出的期望输出完全一致。
方法2:使用base R的expand.grid配合cbind
如果你不想加载额外包,也可以用基础R实现:
# 先给两个数据集加一个临时的键列,值都为1 x_all$key = 1 y_all$key = 1 # 按临时键合并,得到笛卡尔积 x_y_all = merge(x_all, y_all, by = "key", all = TRUE) # 删掉临时的key列 x_y_all$key = NULL
这种方式和crossing的效果完全一样,只是多了两步处理临时键的操作。
验证结果
你可以用nrow(x_y_all)来验证:结果应该等于nrow(x_all) * nrow(y_all),这就是笛卡尔积的行数特征,说明所有组合都被包含了。
内容的提问来源于stack exchange,提问作者aaaaa
相关产品推荐
相关产品推荐

