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

带约束的分组组合生成:寻求可用的R函数解决方案

解决方案:用R生成满足约束的连续分组组合

你的需求本质是将n个有序元素划分为k个非空连续分组(顺序固定、所有分组必须出现),这可以通过整数的有序分拆高效实现,R中有现成工具可直接复用。

核心方法:使用partitions包的compositions函数

compositions函数专门生成有序整数分拆——把n拆分为k个正整数的有序组合,每个组合的和为n。这完美匹配你的两个约束:

  • 每个正整数对应一个分组的元素数量,保证所有k个分组都非空(全部出现)
  • 分拆的顺序对应分组的先后顺序,确保分组连续不交错

代码示例

# 安装并加载包(首次使用需执行安装)
install.packages("partitions")
library(partitions)

# 定义参数:元素个数n,分组数k
n <- 5
k <- 3

# 生成所有有序分拆:每一列是一个分拆方案(各分组的元素数量)
split_schemes <- compositions(n, k)

# 将分拆方案转换为分组向量(如c(3,1,1)转为c(1,1,1,2,3))
aggregation_mat <- apply(split_schemes, 2, function(split) {
  rep(1:k, split)
})

# 合并到原数据
risk_disaggregated <- c("1. Very low risk","2. Low risk","3. Medium risk","4. High risk","5. Very high risk")
db_final <- cbind(risk_disaggregated, aggregation_mat)

# 查看结果
db_final

扩展到多场景

只需修改n和k的值即可适配更多场景,比如15个元素划分为5个组:

n <- 15
k <- 5
split_schemes <- compositions(n, k)
aggregation_mat <- apply(split_schemes, 2, function(split) {
  rep(1:k, split)
})

这会自动生成所有C(n-1, k-1)种合法分组方案(从n-1个元素间隔中选k-1个分割点),效率远高于手动编写。

无第三方包的替代实现(可选)

如果不想依赖外部包,也可以通过组合数生成分割点,再构造分组向量:

n <- 5
k <- 3

# 生成所有k-1个分割点的组合(从1到n-1中选k-1个)
split_points <- combn(n-1, k-1)

# 构造分组向量
aggregation_mat <- apply(split_points, 2, function(points) {
  # 计算每个分组的元素数量
  group_sizes <- diff(c(0, points, n))
  rep(1:k, group_sizes)
})

这个逻辑和compositions函数一致,但partitions包的函数经过优化,处理大n和k时性能更优。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 09:30:50