R语言如何实现求和后等大小分桶?附分位数分桶示例代码
如何实现分组求和值相等 + 分组排序方案
你原来的代码是按分位数把数据分成了10个项目数量相等的组,但每组的总和差异可能很大。下面分别解决「分组求和接近相等」和「排序」这两个问题:
一、让分组后的求和值尽可能相等
这本质是一个装箱优化问题,我们可以用贪心算法或者专门的R包来实现,目标是让每组的总和尽量接近总求和除以组数的目标值。
方法1:使用binpack包(推荐,实现简单)
这个包专门处理这类分组装箱问题,能快速得到近似最优解:
# 先安装依赖包(首次使用时执行) install.packages("binpack") library(binpack) library(dplyr) library(ggplot2) set.seed(42) quantity <- runif(100, 0, 100) dat <- data.frame(qty = quantity) # 计算每组的目标总和:总求和 ÷ 组数 target_sum <- sum(quantity) / 10 # 用binpack函数分配分组,让每组总和尽量接近目标值 dat$group <- binpack(dat$qty, target_sum) # 统计每组的实际总和 grouped_dat <- dat %>% group_by(group) %>% summarise(total_qty = sum(qty)) # 可视化结果 ggplot(grouped_dat, aes(factor(group), total_qty)) + geom_bar(stat = "identity") + labs(x = "分组", y = "组内总数量")
方法2:手动实现贪心算法(无需额外包)
如果不想安装新包,可以手动实现贪心策略:先把数据从大到小排序,再依次把每个数值放到当前总和最小的组里:
set.seed(42) quantity <- runif(100, 0, 100) # 先把数据从大到小排序 sorted_qty <- sort(quantity, decreasing = TRUE) n_groups <- 10 # 初始化每组的总和和分组标签 group_sums <- rep(0, n_groups) groups <- integer(length(sorted_qty)) # 贪心分配每组 for (i in seq_along(sorted_qty)) { min_group <- which.min(group_sums) # 找到当前总和最小的组 groups[i] <- min_group group_sums[min_group] <- group_sums[min_group] + sorted_qty[i] } # 整理成数据框并统计总和 dat <- data.frame(qty = sorted_qty, group = groups) grouped_dat <- dat %>% group_by(group) %>% summarise(total_qty = sum(qty))
二、分组相关的排序方法
排序可以针对原始数据或分组后的结果,用dplyr的arrange函数就能轻松实现:
1. 对分组后的结果排序
如果想按组内总和的大小排序,直接在summarise后用arrange:
# 按组内总和从小到大排序 grouped_dat_sorted <- grouped_dat %>% arrange(total_qty) # 按组内总和从大到小排序 grouped_dat_sorted <- grouped_dat %>% arrange(desc(total_qty)) # 可视化排序后的结果 ggplot(grouped_dat_sorted, aes(factor(row_number()), total_qty)) + geom_bar(stat = "identity") + labs(x = "按总和排序后的分组", y = "组内总数量")
2. 对原始数据分组前排序
如果想让分组基于原始数据的大小顺序,先排序再分组:
dat <- data.frame(qty = quantity) %>% arrange(qty) %>% # 按数值从小到大排序 mutate(group = rep(1:10, each = 10)) # 分成10个数量相等的组 # 统计每组总和并按组号排序 grouped_dat <- dat %>% group_by(group) %>% summarise(total_qty = sum(qty)) %>% arrange(group)
内容的提问来源于stack exchange,提问作者EKtheSage
相关产品推荐
相关产品推荐

