Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R循环中保留条目取决于'sample()'调用满足条件。否则重复_R_Loops_If Statement - Fatal编程技术网

在R循环中保留条目取决于'sample()'调用满足条件。否则重复

在R循环中保留条目取决于'sample()'调用满足条件。否则重复,r,loops,if-statement,R,Loops,If Statement,这个问题是循环的一个变体,但更复杂的是,条件不必只满足一次,而是在循环的每一个步骤中满足 上下文:我正在尝试对向量进行采样: 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)连续对齐,没有两个相同颜色的球并排排列。这是为了验证 下面是我想要实现的伪代码: sam[1] = sample(

这个问题是循环的一个变体,但更复杂的是,条件不必只满足一次,而是在循环的每一个步骤中满足

上下文:我正在尝试对向量进行采样:

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)连续对齐,没有两个相同颜色的球并排排列。这是为了验证

下面是我想要实现的伪代码:

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)
}
我想这就是你想要的,但如果我走错了方向,请纠正我

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

}

因此,循环将继续,直到没有两个球连续比赛。最后给你一个合适的向量。我不建议对大型数据集使用此方法,因为这是一种运气好的解决方案,而且速度肯定会变慢。

我不确定我是否完全理解您在那里的ifelse调用,但听起来您可以使用while循环`而条件{重复直到条件不满足,然后在剩余的=。。。行,你只想把球子集化的意图和sam[i]不一样吗?这似乎有道理,但您需要==而不是=。在这种情况下,您的ifelse语句或while循环将是多余的,因为所有被采样的值都应该符合条件。@rosscova很抱歉我的回答延迟了。第一条评论是关于目标的。剩下的想法是在下一轮的选择中,将已经分配给山姆的球从选择池中剔除。@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是可以的。顺便说一句,注意我用B表示黑色和棕色——我把第二个棕色改成了B。@Toni我想这对我来说更清楚了。请看答案,并注意最后一段。@Toni我添加了一种可能更适合您的不同方法。
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 ] )
}