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

R语言:含重复元素的向量全组合生成方法优化咨询

生成含重复元素向量的所有不同组合的简洁方案

问题场景

需要生成含重复元素的向量的所有不同排列(组合数学中的多重排列),例如:一个装有2个红球(标记为1)和2个黑球(标记为0)的容器,取出全部4个球的所有不同顺序。

原始实现代码

用户最初的实现方式是先生成全排列再映射去重:

combin <- permutations(n = 4, r = 4, v = 1:4)
# 映射规则
# 1 -> 1 : 红球
# 2 -> 1 : 红球
# 3 -> 0 : 黑球
# 4 -> 0 : 黑球

combin <- replace(combin, combin == 2, 1)
combin <- replace(combin, combin == 3, 0)
combin <- replace(combin, combin == 4, 0)
combin <- unique(combin)
combin

更简洁的解决方案

方案1:基础R实现(无需额外包)

核心思路是直接选择红球的位置,剩余位置自动为黑球,避免生成冗余排列:

# 从4个位置中选2个放置红球(1),其余放黑球(0)
positions <- combn(4, 2)
combin <- t(apply(positions, 2, function(p) {
  vec <- rep(0, 4)
  vec[p] <- 1
  vec
}))
combin

方案2:利用gtools包的permutations函数

gtools的permutations支持通过freq参数指定元素的重复次数,直接生成所有不同排列:

library(gtools)
# v指定元素值,freq对应每个元素的出现次数
combin <- permutations(n = 2, r = 4, v = c(1, 0), freq = c(2, 2))
combin

两种方案都能直接得到目标结果,且比原始方法更高效(尤其是当元素数量或重复次数增加时,避免了大量重复排列的生成与去重操作)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 15:56:09