随机将人分配到不同大小的组和类别

Chr*_*ris 7 r

我需要将人们随机分配到组和类别中.不幸的是,我真的不知道从哪里开始.我试图用下面的例子来解释我的问题.任何有关这方面的帮助将非常感激.

我有207 '家庭类型A'和408 '家庭类型B'类别.总共有1524人需要被分配到207家庭类型A或408家庭类型B的类别.然而,对于家庭类型A ,1524人也需要组合在2到7组中,或者对于家庭类型B ,需要组合在2到6组中.

最终结果应该是1524人分配到207组(包含2至7人)和408组(包含2至6人).

对组的分配必须是随机的,并且可以使用所需的组大小的任意组合,因为如果不使用组类别则无关紧要(例如,如果归属类型A的207组仅包含2,3,则会没有问题.或一次4人,或另外5人和7人).

我想象一个看起来像这样的输出:

GroupSize <- c(2:7)
Num.Groups <- 0
Num.People <- 0
HouseTypeA <- data.frame(GroupSize, Num.Groups, Num.People)
GroupSize <- c(2:6)
HouseTypeB <- data.frame(GroupSize, Num.Groups, Num.People)
Run Code Online (Sandbox Code Playgroud)

将'Num.Groups'列汇总为207或408,两个数据帧之间的'Num.People'之和为1524.

Mar*_*box 2

我分三步尝试了这个:

  1. 制作房屋类型清单
  2. 将每个人分配到房屋,检查是否有空间(a 类 max=7,b 类 max=6)
  3. 检查每间房子至少有 2 人。如果没有,就从另一栋房子里抓一个人,不要让他们的人数低于 2 人。

    homeType=rep(c("a", "b"), times=c(207, 408))
    
    H <- vector(mode="list", length(homeType))
    for(i in seq(H)){
      H[[i]]$type <- homeType[i]
      H[[i]]$n <- 0
    }
    H
    
    # Place people in houses up to max number of people
    npeople <- 1524
    for(i in seq(npeople)){
      placed_in_house <- FALSE
      while(!placed_in_house){
        house_num <- sample(length(H), 1)
        if(H[[house_num]]$type == "a"){
          if(H[[house_num]]$n < 7){
            H[[house_num]]$n <- H[[house_num]]$n + 1
            placed_in_house <- TRUE
          }
        }
        if(H[[house_num]]$type == "b"){
          if(H[[house_num]]$n < 6){
            H[[house_num]]$n <- H[[house_num]]$n + 1
            placed_in_house <- TRUE
          }
        }
      }
    }
    H
    hist(unlist(lapply(H, function(x)x$n)))
    
    # move people around to get up to min number of people
    for(i in seq(H)){
      while(H[[i]]$n < 2){
        knock_on_door <- sample(length(H), 1)
        if( H[[knock_on_door]]$n > 2){
          H[[i]]$n <- H[[i]]$n + 1 # house i takes 1 person
          H[[knock_on_door]]$n <- H[[knock_on_door]]$n - 1 # house knock_on_door loses 1 person
        }
      }
    }
    H
    Ha <- H[which(lapply(H, function(x){x$type}) == "a")]
    Hb <- H[which(lapply(H, function(x){x$type}) == "b")]
    
    
    op <- par(mfcol=c(1,2))
    breaks=2:7
    hist(unlist(lapply(Ha, function(x)x$n)), breaks=breaks, col=8, xlab="people per house", main="type A") # 2:7
    hist(unlist(lapply(Hb, function(x)x$n)), breaks=breaks, col=8, xlab="people per house", main="type B") # 2:6
    par(op)
    
    sum(unlist(lapply(Ha, function(x)x$n))) + sum(unlist(lapply(Hb, function(x)x$n)))
    # [1] 1524
    
    
    Houses <- data.frame(
      Num.Groups = seq(H),
      type=unlist(lapply(H, function(x){x$type})),
      Num.People=unlist(lapply(H, function(x){x$n}))
    )
    head(Houses)
    
    Run Code Online (Sandbox Code Playgroud)

    正如您所看到的,每栋房子的总人数和分布情况是这样的。

在此输入图像描述