R语言如何查找向量内所有异号数值对并剔除重复配对
R 实现向量符号不同的无重复配对
给定测试向量:
v <- c(-1, 3, 4, -5, 6, -8, 9, -10, -11, -12, 14, -15, -16, -17)
方法1:直接生成无重复组合筛选(小数据量首选)
用R内置的combn函数直接生成所有索引递增的无序两两组合,再筛选符号不同的配对即可,天然不会出现顺序相反的重复项:
# 生成所有两两无序组合,筛选符号不同的配对 pair_mat <- combn(v, 2, function(x) if (prod(x) < 0) x, simplify = TRUE) # 去除符号相同的配对对应的空值 result <- t(pair_mat[, complete.cases(t(pair_mat))])
输出的result每一行就是一个符合要求的配对,前一个元素在原向量中的位置永远早于后一个元素,不会出现反向重复,输出示例:
[,1] [,2] [1,] -1 3 [2,] -1 4 [3,] -1 6 [4,] -1 9 [5,] -1 14 [6,] 3 -5
方法2:正负索引拆分配对(大数据量高效方案)
如果向量元素很多,先生成所有组合会浪费计算资源,可以先拆分正负元素的索引,再配对筛选:
# 分别提取正数、负数的索引 pos_idx <- which(v > 0) neg_idx <- which(v < 0) # 生成所有正负索引的交叉配对 idx_pair <- expand.grid(pos_idx, neg_idx) # 对每个配对的索引按从小到大排序,保证顺序一致 idx_pair <- t(apply(idx_pair, 1, sort)) # 去重后提取对应值 idx_pair <- unique(idx_pair) result <- cbind(v[idx_pair[,1]], v[idx_pair[,2]])
两种方法得到的结果完全一致。
内容的提问来源于stack exchange,提问作者Tianjian Qin
相关产品推荐
相关产品推荐

