假设我的载体如下:
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
}
答案 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
= 1
和apple
= 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
后停止采样的想法。如果你用不同的种子重复实验,你会得到不同的结果。