2013-12-01 2 views
8

Привет всем, у меня есть проблема с счетчиком, который я создал в цикле for. Вот код.Увеличение счетчика в цикле for в R

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's = 2. Но когда я называю n1 и n2, он возвращает 4 для n1, что неверно. Почему это? Как я ошибаюсь? Заранее спасибо .

Я начинаю выборку a и b с вероятностью 0,5 .20 всего. В какой-то момент, о котором я не знаю заранее, количество a - число b превышает 2. Когда это произойдет, я хочу, чтобы вероятность выборки изменилась до 0,2. То, чего я пытаюсь достичь.

+1

Вам действительно нужно научиться правильно использовать ifelse. Использование его в середине цикла for-loop «просто неправильно». –

+0

Если я не использую и вместо примера использую образец, то как я могу идентифицировать в цикле, где выполняется условие n1-n2 == 2? , Как я могу разбить цикл именно в этой точке и продолжить следующую итерацию, изменяя вероятность выборки? – Manos

+0

Я не говорил, что не использую for-loop (хотя, думаю, вам уже предоставили гораздо лучшую альтернативу ниже). Я говорил, что использование 'ifelse()' с векторами длины-1 было чем-то глупым. Если вы используете цикл, то вы должны использовать 'if() {} else {}' –

ответ

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']] 

EDIT OP хочет изменить образец согласно появление a и b. Вы должны использовать if и else не 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 
} 
+0

Я использую цикл for, потому что я хочу определить, на каком этапе выполняется условие n1-n2 == 2. Вот почему я пытаюсь подсчитать a и b отдельно. Я хочу использовать их разницу в качестве условия в цикле. – Manos

+0

@Manos вы можете увидеть мое редактирование – agstudy

+0

Я хочу знать разницу между a и b на каждом шаге моего цикла, поэтому я могу разбить i, когда a's-b's = 2 – Manos

Смежные вопросы