使用R中的人口比率和最小/最大标准将值分配到区域

问题描述 投票:1回答:1

我有以下数据:

require("data.table")
dt1 <- data.table(ZONE = c("A34","G345","H62","D563","T63","P983","S24","J54","W953","L97","V56","R99"), POPULATION = c(40,110,80,70,90,90,130,140,80,30,80,50), MIN = c(1,0,0,1,0,1,0,1,1,0,1,1), MAX = c(10,9,2,11,12,8,5,3,2,0,8,8))

我想向这些按人口比例加权的区域分配50个帽子(假设是帽子)。但是,其中一些区域至少需要戴一顶帽子,而其他区域只能容纳很少的帽子或根本没有帽子。

是否有一种方法可以根据总体数量分配50顶帽子(以便尽可能精确地按比例分配),但是要考虑最小和最大标准,并且当某个区域无法接收任何帽子时,将帽子分配重新分配给其他区域/了吗?例如如果应根据精确的比例分配为一个区域分配20顶帽子,但只能接受10顶帽子,则应将其他10顶帽子分配给其他按其人口加权的区域。

r data.table distribution sample
1个回答
0
投票

此功能执行您描述的算法:

distribute_hats <- function(df, hats)
{
  if (hats <  sum(df$MIN)) stop("Not enough hats to go round!")
  if (hats >= sum(df$MAX)) return(df)
  df$HATS  <- df$MIN
  hats     <- hats - sum(df$MIN)
  weights  <- df$MAX - df$MIN
  while(hats)
  {
    bin <- sample(seq(nrow(df)), 1, prob = weights)
    if(df$HATS[bin] == df$MAX[bin]) next()
    df$HATS[bin] <- df$HATS[bin] + 1
    hats <- hats - 1
  }
  return(df)
}
© www.soinside.com 2019 - 2024. All rights reserved.