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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 10:45:05