我需要将人们随机分配到组和类别中.不幸的是,我真的不知道从哪里开始.我试图用下面的例子来解释我的问题.任何有关这方面的帮助将非常感激.
我有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.
我分三步尝试了这个:
检查每间房子至少有 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)
正如您所看到的,每栋房子的总人数和分布情况是这样的。