这个问题是this entry的变体,但更复杂的是条件不必仅满足一次,而是在循环的每一步中。
背景:我正在尝试对矢量进行采样:
balls = c(R = rep(1,2), G = rep(2,2), B = rep(3,2), W = rep(4,3), Y = 5, b = 6, O = 7)
以这样的方式,没有颜色(“R”,“G”,“B”,“W”,“Y”,“B”,“O”)具有重复或三次重复的球(例如“R” “或”W“)最终连续对齐(没有两个相同颜色的球并排)。这是为了验证this post in MathSE。
所以这是我想要实现的伪代码:
sam[1] = sample(balls, 1)
for (i in 2:length(balls)){
remaining = balls[- which(balls = sam[i])]
ifelse(x <- sample(remaining) != sam[i], sam[i + 1] = x, IFELSE ALL OVER AGAIN)
}
答案 0 :(得分:1)
我认为这就是你所追求的,但如果我走错了路,请纠正我。
balls = c(R = rep(1,2), G = rep(2,2), B = rep(3,2), W = rep(4,3), Y = 5, B = 6, O = 7)
sam <- vector()
sam[1] = sample(balls, 1)
for (i in 2:length(balls)){
# withdraw last drawn ball only
balls <- balls[ - which( balls == sam[i-1] )[1] ]
# see which balls would be valid for the next draw
remaining = balls[ balls != sam[i-1] ]
# get the ball
x <- sample( remaining, 1 )
# put it in the result
sam[ i ] <- x
}
这将&#34;撤回&#34;每个检索过的&#34;球&#34;在绘制下一个之前从池中。请注意,您有时会用尽适当的球来使用,因为您剩下的唯一球可能与您退出的最后一个球相匹配。因此,在某些运行中需要一些NA
值,但不是全部。
更新:对您来说可能更好的策略是立即对整个样本进行采样,并查看样本是否符合您的条件。如果没有,请重新采样,直到它:
sam <- sample( balls )
sam.lag <- c( NA, sam[ 1:length( sam ) - 1 ] )
while( sum( sam == sam.lag, na.rm = TRUE ) > 0L ) {
sam <- sample( balls )
sam.lag <- c( NA, sam[ 1:length( sam ) - 1 ] )
}
所以循环将继续,直到没有两个&#34;球&#34;连续比赛。最后给你一个合适的矢量。我不推荐这个用于大型数据集,因为它是一个运气好的&#34;解决方案,必然会变慢。