我已经想了好几个小时了,最后我的头都白了.我的最终目标是建立一个26行4列的数据框架,其中包含的值为1-6,以半随机的方式分布,满足某些条件。
条件如下:
每个数字只能在同一列的row.
。
我最初的想法是先采样第一行,然后创建一个for循环,一个接一个地添加其他行,从而改变根据前面的示例绘制数字的概率。在添加此示例行之前,我可以检查第二个条件是否满足,如果不是重采样的话。
我最终意识到这是如此的嵌套,以至于我不能把我的头绕在它周围……我假设我需要一个while循环,但我没有经验。在前两个条件未满足的情况下,根据先前出现的可能性进行重采样。但是,问题是每一列都根据先前的外观为每个值获取了自己的概率,所以我不能只对一行进行示例。但是,如果我根据前面的表象分别对每一列进行采样,则很可能在一行中得到相同的值.
因此,这是我想要的为FALSE的条件(我尝试使用一个函数,如果语句为TRUE,它只会重复一遍):
temp[1] == table[i-1,1] || temp[1] == table[i-1,2] || temp[2] == table[i-1,1] || temp[2] == table[i-1,2]
temp[3]== table[i-1,3]
temp[4]== table[i-1,4]下面是我如何计算抽样概率的方法(我意识到,如果还没有出现值,就会出现一个问题,因为这意味着除以0)。
probAB <- rep(1,6) /table(table[,c(1,2)])
probC <- rep(1,6) /table(table[,3])
probD <- rep(1,6) /table(table[,4])我你想知道它应该是什么:这是一个不重复的杂务,在6人之间,2人承担1项家务,而其他2项家务仅由一人完成。为实现这一目标,我愿意听取其他建议。^^
发布于 2020-11-15 18:18:35
我们可以使用拒绝抽样。只需为每一行生成一个示例,如果符合条件,则接受它并转到下一行;否则,重复。
nr <- 26
nc <- 4
k <- 6
set.seed(123)
is_ok <- function(x, y) all(x != y) && x[1] != y[2] && x[2] != y[1]
tab <- matrix(NA, nr, nc)
tab[1, ] <- sample(k, nc)
for(i in 2:nr) repeat if (is_ok(tab[i, ] <- sample(k, nc), tab[i-1, ])) breakhttps://stackoverflow.com/questions/64848004
复制相似问题