我需要将人们随机分配到组和类别中。不幸的是,我真的不知道从哪里开始。我尝试使用下面的示例来解释我的问题。任何对此的帮助将不胜感激。
I have 207“A 型住宅”和408“B 型住宅”类别。总共有1524需要分配到 207 Home Type A 或 408 Home Type B 类别的人员。然而,这 1524 人还需要分为以下任一组:2 to 7适用于 A 型住宅或2 to 6适用于 B 型住宅。
最终结果应该是 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)
“Num.Groups”列的总和为 207 或 408,两个数据帧之间的“Num.People”总和为 1524。
我分三步尝试了这个:
- 制作房屋类型清单
- 将每个人分配到各个房屋,检查
有空间(类型 a 的 max=7,类型 b 的 max=6)
-
检查每间房子至少有 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)
正如您所看到的,每栋房子的总人数和分布情况是这样的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)