我有以下数据:
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顶帽子分配给其他按其人口加权的区域。
此功能执行您描述的算法:
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)
}