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

基于count权重按比例重分配R表格中a组的var1与var2值

按权重比例重分配分组数值的实现问题

相关问题

  • 基于另一表格调整表格中的数值
  • 将多值分配给多组

数据定义

我在R中有以下两个数据框:

myt_with_counts <- data.frame(
  name = c("a", "a", "a", "b", "b", "c", "c", "c", "d", "e", "e"),
  var1 = c(120, 80, 100, 20, 30, 15, 25, 35, 40, 50, 60), 
  var2 = c(90, 60, 70, 25, 35, 20, 30, 40, 45, 55, 65),
  count = c(10, 5, 15, 8, 12, 6, 9, 3, 7, 11, 4)
)

rel_table <- data.frame(
    name = c("a", "b", "c"),
    proportion = c(0.5, 0.4, 0.1)
)

需求说明

我需要完成以下数据处理:

  • 将myt_with_counts中name为"a"的组的var1和var2数值,按照rel_table指定的比例重新分配:50%保留在a组,40%分配给b组,10%分配给c组。
  • 分配时必须以count为权重:从a组每行移除的数值,要按该行count占a组总count的比例计算;添加到b/c组每行的数值,要按该行count占对应组总count的比例计算。
  • 重分配后,var1和var2的整体总和必须保持不变。

尝试的代码

我自己写了一个redistribute函数尝试实现,但遇到了困难,代码如下:

redistribute <- function(x, val.cols, name.col, count.col, prop, from) {
   val.col <- match(val.cols, names(x))
   x.names <- x[[name.col]]
   prop.names <- prop[[1]]
   rows <- match(prop.names, x.names)
   
   from_totals <- colSums(x[x.names == from, val.col, drop=FALSE])
   from_counts <- x[x.names == from, count.col]
   total_from_counts <- sum(from_counts)
   
   for(i in seq_along(prop.names)) {
       group_name <- prop.names[i]
       group_prop <- prop[[2]][i]
       group_rows <- x.names == group_name
       
       if(group_name == from) {
           proportion_to_remove <- 1 - group_prop
           amount_to_remove <- from_totals * proportion_to_remove
           for(j in seq_along(val.col)) {
               removal_per_count <- amount_to_remove[j] / total_from_counts
               x[group_rows, val.col[j]] <- x[group_rows, val.col[j]] - from_counts * removal_per_count
           }
       } else {
           group_counts <- x[group_rows, count.col]
           total_group_counts <- sum(group_counts)
           amount_to_add <- from_totals * group_prop
           for(j in seq_along(val.col)) {
               addition_per_count <- amount_to_add[j] / total_group_counts
               x[group_rows, val.col[j]] <- x[group_rows, val.col[j]] + group_counts * addition_per_count
           }
       }
   }
   x
}

result <- redistribute(myt_with_counts, val.cols=c("var1", "var2"), name.col="name", count.col="count", prop=rel_table, from="a")

内容的提问来源于stack exchange,提问作者stats_noob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 15:17:23