R:중지하는 경우 루프는 조건이 충족

0

질문

나는 작업으로 프로그래밍 언어입니다. 나는 다음과 같은 루프를 생성하는 1000 임의의 숫자와 그런 다음 이 과정을 반복 10 시간:

results <- list()

for (i in 1:10){

a = rnorm(1000,10,1)
b = rnorm(1000,10,1)


d_i = data.frame(a,b)
d_i$index = 1:nrow(d_i)
d_i$iteration = as.factor(i)

 results[[i]] <- d_i

}



results_df <- do.call(rbind.data.frame, results)

질문: 나는 이를 변경하는 루프는 대신만 생성 1000 임의의 숫자,그 계속 생성하는 무작위 숫자까지 특정 조건을 만족하,예를 들어:지 생성하는 무작위 숫자까지 d_i$a>10d_i$b>10.

를 사용하는 동안"()"문을 나가도 이렇게하려면:

results <- list()

for (i in 1:10){

 while (d_i$a > 10 & d_i$b >10) {

a = rnorm(1000,10,1)
b = rnorm(1000,10,1)


d_i = data.frame(a,b)
d_i$index = 1:nrow(d_i)
d_i$iteration = as.factor(i)

 results[[i]] <- d_i

}

}


results_df <- do.call(rbind.data.frame, results)

문제: 그러나,이를 반환한 다음과 같은 경고(10 배):

Warning messages:
1: In while (d_i$a > 10 & d_i$b > 10) { :
  the condition has length > 1 and only the first element will be used

생산 빈 테이블:

> results_df

data frame with 0 columns and 0 rows

누군가가 나를 도와 주시겠습니 이 문제를 해결?

감사합니다!

data-manipulation loops r while-loop
2021-11-23 23:09:34
3

최고의 응답

3

오류 메시지에서 원래의 게시물이 있다는 사실로 인해 d_i$ad_i$b 는 벡터와 1,000 요소 10 은 스칼라. 따라서,R 비교에서 첫 번째 요소 d_i$a 그 첫 번째 요소 d_i$b 10.

오류 메시지를 해결하려면 우리는 비교할 필요가 있는 벡터와 함께 길이 1 스칼라 10. 이 필요한 구조조정 코드를 생성하는 임의의 숫자 중 하나에서 시간입니다. 에서 설명에서 우리는 명확하지 않는지 이 동작한 것은 의도된 것입니다.

나는 단순화 문제 제거하여 10 개의 복제를 설명하는 방법을 만드는 데이터를 프레임으로 임의의 숫자를 때까지가 모두 ab 으로 보다 큰 값은 10.

첫째,우리는 설정을 만들기 위해 씨앗을 대답을 재현성,다음을 초기화 일부 개체입니다. 에 의해 설정 ab 0 리는지 확인 while() 루프에서 실행됩니다 적어도 한 번.

set.seed(950141238) # for reproducibility 
results <- list()
a <- 0 # initialize a to a number < 10
b <- 0 # initialize b to a number < 10 
i <- 1 # set a counter 

데 초기화 ab이, while() 루프가 TRUE 생 임의의 두 번호,해당 지수 값을 쓰고 그들로 데이터 구조를 results 목록입니다. 에 대한 논리 while() 루프를 나타내는 경우 a 가 작거나 같음 10 b 가 작거나 같음 10,루프 유지 반복. 그것은 정지 경우 모두 ab 은 더 큰 것보다 10.

while(a <= 10 | b <= 10){
     a <- rnorm(1,10,1) # generate 1 random number with mean of 10 and sd of 1
     b <- rnorm(1,10,1) # ditto
     results[[i]] <- data.frame(index = i,a,b)
     i <- i + 1 # increment i
}

반복 실행을 중지한 후에 번 반복으로 우리는 볼 수 있습에 의해 인쇄하는 결과 데이터를 프레임 후의 결합을 통해 개별적인 행 do.call()rbind().

df <- do.call(rbind,results)
df

...출력:

> df
  index         a         b
1     1  8.682442  8.846653
2     2  9.204682  8.501692
3     3  8.886819 10.488972
4     4 11.264142  8.952981
5     5  9.900112 10.918042
6     6  9.185120 10.625667
7     7  9.620793 10.316724
8     8 11.718397  9.256835
9     9 10.034793 11.634023
>

마지막 행이 프레임 데이터가 보다 큰 값을 모두 10 ab.

여러 도시를 건의하는 동안 반복

는 과정을 반복 10 회로에서 수행됩니다 우리는 우리가 마무리 작업에서 for() 루고,두 번째 목록 combined_results 결과를 저장하기 위해서 각각의 iteration.

set.seed(950141238) # for reproducibility 
combined_results <- list()
for(iteration in 1:10){
     results <- list()
     a <- 0 # initialize a to a number < 10
     b <- 0 # initialize b to a number < 10 
     i <- 1 # set a counter 
     while((a < 10) | (b < 10)){
          a <- rnorm(1,10,1) # generate 1 random number with mean of 10 and sd of 1
          b <- rnorm(1,10,1) # ditto
          results[[i]] <- data.frame(iteration,index = i,a,b)
          i <- i + 1 # increment i
     }
     combined_results[[iteration]] <- do.call(rbind,results)
}
df <- do.call(rbind,combined_results)
df[df$iteration < 5,] 

...및 출력을 위한 첫 번째는 4 회 반복의 외부 반복:

> df[df$iteration < 5,]
   iteration index         a         b
1          1     1  8.682442  8.846653
2          1     2  9.204682  8.501692
3          1     3  8.886819 10.488972
4          1     4 11.264142  8.952981
5          1     5  9.900112 10.918042
6          1     6  9.185120 10.625667
7          1     7  9.620793 10.316724
8          1     8 11.718397  9.256835
9          1     9 10.034793 11.634023
10         2     1 11.634331  9.746453
11         2     2  9.195410  7.665265
12         2     3 11.323344  8.279968
13         2     4  9.617224 11.792142
14         2     5  9.360307 11.166162
15         2     6  7.963320 11.325801
16         2     7  8.022093  8.568503
17         2     8 10.440788  9.026129
18         2     9 10.841408 10.033346
19         3     1 11.618665 10.179793
20         4     1 10.975061  9.503309
21         4     2 10.209288 12.409656
> 

다시는 우리는 마지막 행에서 각 반복(9,18,19,21)보다 큰 값을 모두 10 ab.

이 방법은 실패를 활용하는 벡터화에서 작업 R 는 것을 의미를 생성하는 대신 1,000 임의의 숫자를 호출할 때 rnorm()코드 기반 while() 생성일 임의의 숫자를 통화당을 rnorm(). 이 rnorm() 리소스를 많이 사용하는 기능 코드를 최소화하는 횟수 rnorm() 실행하는 것은 바람직하다.

2021-11-24 20:45:06
2

나는 희망이 이러한 의견에 도움을 따라 어떻게 작동합니다. 그것은 주로 사용 repeat 는 무한 루프입니다. 그것이 중지 할 수 있습 사용 break 키워드입니다.

results <- list()


for (i in 1:10){
  
  # do until break
  repeat {
    
    # repeat many random numbers
    a = rnorm(1000,10,1)
    b = rnorm(1000,10,1)
    
    # does any pair meet the requirement
    if (any(a > 10 & b > 10)) {
      
      # 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 <- d_i[1:which(d_i$a > 10 & d_i$b > 10)[1], ]
  
  # prep other variables
  d_i$index = seq_len(nrow(d_i))
  d_i$iteration = as.factor(i)
  
  results[[i]] <- d_i
  
}
2021-11-24 01:19:52
2

의 루프(는 동안이나),단순히 break() 후에 if 상태입니다.

out <- vector("integer", 26)
for (i in seq_along(letters)) {
  if(letters[i] == "t") break()
  out[i] <- i+1
}
out
#> [1]  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20  0  0  0  0  0  0  0

휴식 것입니다. 서 ?break:제어를 전송하는 첫 번째 문 밖에서 가장 안쪽 반복입니다.

그러나,당신의 질문에 그것은 완전히 명확하지 않습니다 왜 당신이 시도하고 있는 이러한 흐름 제어되지 않을 수도 있는 적절한 솔루션으로,벡터화 해결책이 있을 수 있습니다. 더욱 조심을 하는 불필요한 것 루프 안에서-그것은 일반적인 원인에 대한 느린 코드 실행. 여기서 우리는 몇 가지의를 위해 루프 등 d_i$iterationd_i$index고,여전히 끝까지 동일한 결과입니다. 에서 봐야 세 번째 원.

2021-11-23 23:46:14

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................