在R中的for循环中增加计数器

时间:2013-12-01 01:50:25

标签: r for-loop counter

大家好,我在for循环中创建的计数器有问题。这是代码。

n1<- 0
n2<- 0
n<- 20
f<- rep(NA,20)
set.seed(10) 
x<- runif(20)
for(i in 1:20) {
f[i]<- ifelse(x[i]<0.5, 'a', 'b')
if((n1-n2)==2) {
break
 }
 if(f[i]=='a')  
n1<- n1 + 1 else n2<- n2 + 1 # n1 counts a's n2 counts b's
}

[1] "b" "a" "a" "b" "a" "a" "a" NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA

从a = 5的结果数和b = 2可以看出。但是当我调用n1和n2时,它返回4表示n1,这是错误的。这是为什么?我怎么了?提前谢谢。

我开始采样a和b的概率为0.5 .20。在某些我事先不知道的地方,a的数量 - b的数量超过2.当发生这种情况时,我希望采样概率变为0.2这就是我想要实现的目标。

1 个答案:

答案 0 :(得分:8)

ifelse已向量化,因此无需在此处使用for-loop。你应该如何使用它:

set.seed(10) 
x <- runif(20)
f <- ifelse(x<0.5, 'a', 'b')

然后使用table计算出现次数:

table(f)
f
 a  b 
13  7 

获取n1

n1 <- table(f)[['a']]

编辑 OP希望根据a和b的出现更改样本。您应该使用ifelse而不是ifelse。您还应该为矢量f预分配内存。

n1 <- 0 ; n2 <- 0
N <- 20
f <- vector(mode='character',N)
set.seed(10)
x<- runif(N)
for(i in seq(N)) {
     if (x[i] <0.5){ 
        f[i] <- 'a'
        n1 <- n1 +1
     } else {
        f[i] <- 'b'
        n2 <- n2 +1
     }
    if((n1-n2)==2) x <- runif(N)  ## condition to regenerate sample
}