如何用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
相关产品推荐
相关产品推荐

