代码之家  ›  专栏  ›  技术社区  ›  dan

将一组整数拆分为两个近似相同太阳的子群

  •  0
  • dan  · 技术社区  · 4 年前

    我有一组整数,如下 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一分为二 数据帧 s的和近似相等 .

    任何关于 R 功能来实现这一点?

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

    library(Hmisc) # cut2
    ll <- split(df, cut2(df$length, g=2))
    > sum(ll[[1]]$length)
    [1] 14702139
    > sum(ll[[2]]$length)
    [1] 37564671
    
    0 回复  |  直到 4 年前
        1
  •  3
  •   Kra.P    4 年前

    这叫做垃圾箱问题。 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