Р: Логические Условия Не Соблюдаются

#r #loops #while-loop #data-manipulation

Вопрос:

Я работаю с языком программирования R. Я пытаюсь построить цикл, который выполняет следующее :

  • Шаг 1: Продолжайте генерировать два случайных числа «a» и «b», пока оба «a» и «b» не станут больше 12
  • Шаг 2: Отследите, сколько случайных чисел должно было быть сгенерировано до завершения шага 1
  • Шаг 3: Повторите шаги 1 и 2 100 раз

Поскольку я не знаю, как продолжать генерировать случайные числа до тех пор, пока не будет выполнено условие, я попытался сгенерировать большое количество случайных чисел в надежде, что условие будет выполнено (вероятно, есть лучший способ написать это).:

 results lt;- list()   for (i in 1:100){    # do until break  repeat {    # repeat many random numbers  a = rnorm(10000,10,1)  b = rnorm(10000,10,1)    # does any pair meet the requirement  if (any(a gt; 12 amp; b gt; 12)) {    # put it in a data.frame  d_i = data.frame(a,b)    # end repeat  break  }  }    # select all rows until the first time the requirement is met  # it must be met, otherwise the loop would not have ended  d_i lt;- d_i[1:which(d_i$a gt; 10 amp; d_i$b gt; 10)[1], ]    # prep other variables and only keep last row (i.e. the row where the condition was met)  d_i$index = seq_len(nrow(d_i))  d_i$iteration = as.factor(i) e_i = d_i[nrow(d_i),]    results[[i]] lt;- e_i   }  results_df lt;- do.call(rbind.data.frame, results)  

Проблема: Когда я смотрю на результаты, я заметил, что цикл неправильно учитывает условие, которое должно быть выполнено, например:

 head(results_df)   a b index iteration 4 10.29053 10.56263 4 1 5 10.95308 10.32236 5 2 3 10.74808 10.50135 3 3 13 11.87705 10.75067 13 4 1 10.17850 10.58678 1 5 14 10.14741 11.07238 1 6  

Например, в каждой из этих строк — и «а», и «в» меньше 12.

Кто-нибудь знает, почему это происходит, и может ли кто-нибудь, пожалуйста, показать мне, как решить эту проблему?

Спасибо!

Комментарии:

1. Есть ли причина , по которой ваше первое условие таково gt;12 , но при вашем втором условии вы тестируете gt;10 ?

2. @ Colombo: Спасибо за ваш ответ! Я думаю, что вы, возможно, заметили ошибку в моем вопросе! Спасибо!

Ответ №1:

Как насчет этого пути? Как вы заметили while-loop , я пытался использовать его.

 res lt;- matrix(0, nrow = 0, ncol = 3)   for (j in 1:100){  a lt;- rnorm(1, 10, 1)  b lt;- rnorm(1, 10, 1)  i lt;- 1  while(a lt; 12 | b lt; 12) {  a lt;- rnorm(1, 10, 1)  b lt;- rnorm(1, 10, 1)  i lt;- i   1  }  x lt;- c(a,b,i)  res lt;- rbind(res, x) }  head(res)  [,1] [,2] [,3] x 12.14232 12.08977 399 x 12.27158 12.01319 1695 x 12.57345 12.42135 302 x 12.07494 12.64841 600 x 12.03210 12.07949 82 x 12.34006 12.00365 782  dim(res) [1] 100 3