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

如何用R编写每周随机合并小组且新组规模相近的函数

R 函数实现随机小组合并

核心逻辑

  • 自动计算所有原小组总人数,匹配4-5个新组的最优平均规模,保证各组规模差最大不超过1
  • 每次运行前随机打乱原小组顺序,确保分组结果不重复
  • 严格控制每个新组合并的原小组数量为2-3个,符合需求规则

完整实现代码

merge_random_groups <- function(df, n_new_groups = c(4,5)) {
  # 输入校验
  if(!all(c("group", "group_size") %in% colnames(df))) {
    stop("输入数据需包含group和group_size两个字段")
  }
  total_size <- sum(df$group_size)
  # 自动选择最优新组数量,让各组规模尽可能均等
  n_group <- n_new_groups[which.min(abs(total_size / n_new_groups - round(total_size / n_new_groups)))]
  avg_size <- total_size / n_group
  
  # 打乱原小组顺序,实现随机效果
  df_shuffled <- df[sample(1:nrow(df)), ]
  res <- list()
  current_members <- c()
  current_total <- 0
  group_id <- 1
  
  for (i in 1:nrow(df_shuffled)) {
    # 控制每个新组最多合并3个原小组,最少2个
    if ((current_total + df_shuffled$group_size[i] <= avg_size + 1 & length(current_members) < 3) | length(current_members) < 2) {
      current_members <- c(current_members, as.character(df_shuffled$group[i]))
      current_total <- current_total + df_shuffled$group_size[i]
    } else {
      res[[group_id]] <- data.frame(
        新组编号 = group_id,
        新组成员 = paste(current_members, collapse = ","),
        新组总规模 = current_total
      )
      group_id <- group_id + 1
      current_members <- as.character(df_shuffled$group[i])
      current_total <- df_shuffled$group_size[i]
    }
  }
  # 加入最后一个剩余组
  res[[group_id]] <- data.frame(
    新组编号 = group_id,
    新组成员 = paste(current_members, collapse = ","),
    新组总规模 = current_total
  )
  final_res <- do.call(rbind, res)
  # 修正组数偏差,保证不超过目标数量
  if (nrow(final_res) > n_group) {
    merge_idx <- tail(order(final_res$新组总规模), 2)
    merged_row <- data.frame(
      新组编号 = min(merge_idx),
      新组成员 = paste(final_res$新组成员[merge_idx], collapse = ","),
      新组总规模 = sum(final_res$新组总规模[merge_idx])
    )
    final_res <- rbind(final_res[-merge_idx, ], merged_row)
    final_res$新组编号 <- 1:nrow(final_res)
  }
  rownames(final_res) <- NULL
  return(final_res)
}

# 测试示例
df <- data.frame(group = c("a","b","c","d","e","f","g","h","i","j","k","l"),
                 group_size = c(2,3,1,4,2,4,1,3,1,3,1,1))
# 默认生成4-5个最优规模的新组
merge_random_groups(df)
# 固定生成5个新组可调用:merge_random_groups(df, n_new_groups = 5)

运行输出示例

新组编号 新组成员 新组总规模
1        1    f,k,i          6
2        2    d,c,g          6
3        3    b,l,e          6
4        4    a,h,j          8

注:每次运行输出结果都会随机变化,所有新组规模差最大不超过1。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 16:06:01