使用while循环向R中的向量添加元素

时间:2013-04-20 09:41:26

标签: r while-loop

假设我的载体如下:

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
  }

3 个答案:

答案 0 :(得分: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
}

请注意你在这里循环中生成一个向量,这对于大量采样来说可能变得很慢......

答案 1 :(得分: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"),每个连续步骤中的苹果和橙子数量用{计算{1}},因为TRUE等于1(果实存在)而FALSE等于0(果实不存在)。然后我们取这些向量之间的差异,看看差异是否满足我们的条件。如果是,则该函数返回您最初想要的结果样本。如果没有,它会抛出错误,敦促您再试一次或增加N.

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

答案 2 :(得分: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后停止采样的想法。如果你用不同的种子重复实验,你会得到不同的结果。