【问题标题】:Keeping entries in an R loop contingent on `sample()` call meeting criteria. Otherwise repeat根据 `sample()` 调用满足条件,将条目保留在 R 循环中。否则重复
【发布时间】:2017-05-31 23:13:07
【问题描述】:

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

【问题讨论】:

  • 我不确定我是否完全理解您的ifelse 电话,但听起来您可能会很好地使用while 循环。 `while(condition){ 重复直到条件不满足,然后回到for循环}
  • 在您的remaining =... 行中,您是否打算仅对与sam[i] 不同的球进行子集化?这似乎是有道理的,但你需要== 而不是=。在这种情况下,您的 ifelse 语句(或 while 循环)将是多余的,因为 所有 被采样的值都应该符合条件。
  • @rosscova 抱歉,我的回复延迟。第一条评论是目标。 remaining 背后的想法是在下一轮从选择池中消除已经分配给 sam 的球。

标签: r loops if-statement


【解决方案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

}

这将在绘制下一个之前从池中“撤回”每个检索到的“球”。请注意,您有时会在最后用完合适的球,因为您剩下的唯一球可能与您退出的最后一个球相匹配。因此,在某些运行中预计会有一些 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 ] )
}

所以循环将继续,直到没有两个“球”连续匹配。最后给你一个合适的向量。对于大型数据集,我不建议这样做,因为它是一种“碰碰运气”的解决方案,而且肯定会变慢。

【讨论】:

  • @Toni 对不起,错字了,我已经调整了代码,你现在可以试试吗?
  • 好的,我明白了。您根本不需要条件或循环。您是想每次从同一个球池中采样,还是在每次迭代后减少池。换句话说,是否应该先将“球”放回“袋子”中,然后再取回另一个?
  • 你想避免连续的同色球。所以如果你画了一个红球,而下一个恰好也是红的,你必须把它放回袋子里,然后再试一次,直到你画出一个不是红的球。所以2 4 3 4 4 2 1 5 6 3 1 7和两个4背靠背是被禁止的。然而,2 4 3 4 2 4 1 5 6 3 1 7 是可以的。顺便说一句,请注意我有 Bblackbrown - 我已将第二个 (brown) 更改为 b
  • @Toni 我认为这对我来说现在更清楚了。请查看答案,并注意最后一段。
  • @Toni 我添加了一种不同的方法,可能对你更有效。
猜你喜欢
  • 2018-09-09
  • 1970-01-01
  • 2018-11-09
  • 2014-05-12
  • 2023-03-22
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 2021-02-09
相关资源
最近更新 更多