0

假设我的向量如下:

fruit = c("apple", "orange")

我一次采样一个水果并将所选水果存储在向量中。

chosen=sample(fruit, size = 1, replace = TRUE)

假设我想继续采样,直到橙子的总数比苹果的总数多 2,但是我无法将所有样本合并到一个向量中。

i = 1
keepgoing = TRUE
while(keepgoing){
  i=sample(fruit, size = 1, replace = TRUE)
  i+1=sample(fruit, size = 1, replace = TRUE)
  fruitlist=rbind(i, i+1)
  if(sum(fruitlist=="orange")-sum(fruitlist=="apple")==2){
  keepgoing = FALSE}
  i = i +2
  }
4

3 回答 3

2

@Arun 的建议确实是您想要的,但是您的 while 循环示例看起来像:

keepgoing = TRUE
all_fruit = NULL
while(keepgoing) {
   next_piece_of_fruit = sample(fruit, 1, TRUE)
   all_fruit = c(all_fruit, next_piece_of_fruit)
   if (sum(all_fruit == "orange") - 
       sum(all_fruit == "apple")) == 2) keepgoing = FALSE
}

请注意,您在这里的循环内增长了一个向量,对于大量采样,这可能会变得非常缓慢......

于 2013-04-20T09:51:35.180 回答
2

由于样本单元是独立的(后面单元的概率不依赖于前面单元的概率,在这种情况下始终为 0.5),我们可以使用另一种策略。我们可以先绘制一个大(r)样本,然后在满足我们所需条件的点处将其切断,而不是增加样本:

makeSample <- function(n=20) {

    fruit <- c("apple", "orange")

    full.sample <- sample(x = fruit, size = n, replace = TRUE)
    apples  <- cumsum(full.sample == "apple")
    oranges <- cumsum(full.sample == "orange")
    diff <- oranges - apples

    exit.position <- match(2L, diff)
    if (is.na(exit.position))
        stop("The condition specified not achieved, try again or increase N")
    result <- head(full.sample, exit.position)
    return(result)
}

功能真的很简单。它绘制所需长度的大(超集)样本,默认值为 20。创建两个逻辑向量(full.sample == "orange"full.sample=="apple"),每个连续步骤中的苹果和橙子的数量用 计算cumsum(),因为 TRUE 等于 1(存在水果)和 FALSE 为 0(没有水果)。然后我们取这些向量之间的差异,看看在任何时候差异是否满足我们的条件。如果是,该函数将返回您最初想要的结果样本。如果没有,它会抛出错误,敦促您重试或增加 N。

这在更大的样本上应该更有效,并且可以很容易地调整到更复杂的条件。当 N 较小时,您可能不会得到结果,而不是循环解决方案。随着 N 的增加,您的机会接近 1。您可以包装makeSample()另一个函数,以确保您始终获得结果。

于 2013-04-20T11:04:48.627 回答
1

IMO 你需要使用rbinom. 假设orange=1apple= 0

set.seed(56)
fruit.sample <- c()
while(TRUE)
{
    fruit.sample <- c(fruit.sample, rbinom(1,1,0.5))

    if (sum(fruit.sample==1) == sum(fruit.sample==0)+2)
        break
}

fruit.sample
## [1] 0 1 0 1 0 0 0 0 1 1 1 0 1 1 1 0 1 1

基本上停止采样一次的想法Num.Oranges= Num.Apples + 2。如果你用不同的种子重复实验,你会得到不同的结果。

于 2013-04-20T11:30:52.030 回答