保持R循环中的条目取决于`sample()`调用满足条件。否则重复

时间:2017-01-17 01:48:17

标签: r loops if-statement

这个问题是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)
}

1 个答案:

答案 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;解决方案,必然会变慢。