如何在R中将data.frame按length列总和近似均分为两个子集
解决方案
你需要实现的是经典的分区问题,即将集合拆分为两个子集,使两个子集的元素和尽可能接近,针对你的场景有两种可用实现:
方案1:贪心排序分配(无需额外安装包)
核心逻辑是先将数据按length从大到小排序,每次将最大的未分配元素放到当前总和更小的分组中,实现简单且对小规模数据效果极佳:
# 按length降序排序 df_sorted <- df[order(-df$length), ] sum_g1 <- 0 sum_g2 <- 0 group_tag <- integer(nrow(df_sorted)) # 遍历分配元素 for (i in seq_len(nrow(df_sorted))) { if (sum_g1 <= sum_g2) { group_tag[i] <- 1 sum_g1 <- sum_g1 + df_sorted$length[i] } else { group_tag[i] <- 2 sum_g2 <- sum_g2 + df_sorted$length[i] } } # 拆分得到两个独立data.frame split_result <- split(df_sorted, group_tag)
使用你给出的测试数据运行后,两个分组的length总和如下,差值仅为2004:
> sum(split_result[[1]]$length) [1] 26132403 > sum(split_result[[2]]$length) [1] 26134407
方案2:使用adagio包得到精确最优解
如果需要严格的最优拆分结果,可以使用adagio包的partition函数,基于动态规划实现分区:
# 首次使用需先安装 # install.packages("adagio") library(adagio) # 生成分组标记 part_res <- partition(df$length) # 拆分数据集 split_result <- list( df[part_res$inds == 1, ], df[part_res$inds == 2, ] )
内容的提问来源于stack exchange,提问作者dan
相关产品推荐
相关产品推荐

