首页 > 解决方案 > 将一组整数分成两个大致相同太阳的子组

问题描述

我有一组整数,如下所示R data.frame

set.seed(1)
df <- data.frame(id = paste0("id",1:100), length = as.integer(runif(100,10000,1000000)), stringsAsFactors = F)

所以每个元素都有一个id和一个length

我想将 df 拆分为两个data.frames,其总和大致相等length

知道R实现这一目标的功能吗?

我认为这Hmisc可能cut2会这样做,但我认为这不是它的预期用途:

library(Hmisc) # cut2
ll <- split(df, cut2(df$length, g=2))
> sum(ll[[1]]$length)
[1] 14702139
> sum(ll[[2]]$length)
[1] 37564671

标签: rsplitcutpartition

解决方案


这称为 Bin 包问题。https://en.wikipedia.org/wiki/Bin_packing_problem这个链接可能会有所帮助。

使用BBmisc::binPack功能,

df$bins <- binPack(df$length, sum(df$length)/2 + 1)
tapply(df$length, df$bins, sum)

结果像

       1        2        3 
25019106 24994566    26346 

现在既然你想要两组,

dummy$bins[dummy$bins == 3] <- 2 #because labeled as 2's sum is smaller

结果是

       1        2 
25019106 25020912 

推荐阅读