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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:15:03