#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