목록과 행렬의 예가 포함된 R의 For 루프
⚡ 스마트 요약
R의 for 루프는 시퀀스의 모든 요소(벡터, 리스트, 행렬 등)에 대해 코드 블록을 한 번씩 실행합니다. 이 가이드에서는 각 유형을 살펴보고 벡터화된 코드가 더 나은 선택인 경우를 보여줍니다.

A for 루프 이 함수는 시퀀스의 각 요소에 대해 코드 블록을 한 번씩 반복합니다. 시퀀스는 벡터, 리스트, 데이터 프레임, 행렬 또는 R이 순회할 수 있는 다른 모든 객체가 될 수 있습니다. R은 대소문자를 구분하므로 이 키워드는 항상 소문자로 작성해야 합니다. 을 통한본문이 두 줄 이상에 걸쳐 있을 때는 중괄호를 사용해야 합니다.
R에서의 for 루프 구문
for (i in vector) { Exp }
여기
R 벡터의 모든 변수를 반복하고 exp 내부에 작성된 계산을 수행합니다.

몇 가지 예를 살펴보겠습니다.
R의 For 루프 예 1: 벡터의 모든 요소를 반복하고 현재 값을 인쇄합니다.
# Create fruit vector fruit <- c('Apple', 'Orange', 'Passion fruit', 'Banana') # Create the for statement for ( i in fruit){ print(i) }
출력:
## [1] "Apple" ## [1] "Orange" ## [1] "Passion fruit" ## [1] "Banana"
R의 For 루프 예 21부터 4까지의 모든 정수를 제곱하여 그 결과를 리스트에 저장합니다.
# Create an empty list list <- c() # Create a for statement to populate the list for (i in seq(1, 4, by=1)) { list[[i]] <- i*i } print(list)
출력:
## [1] 1 4 9 16
for 루프는 머신 러닝 작업에서 유용합니다. 정규화 매개변수를 조정한다는 것은 많은 후보 값을 테스트하고 그중 가장 적합한 값을 선택하는 것을 의미합니다.ping 손실 함수를 최소화하는 해를 찾고, for 루프는 해당 범위를 탐색하는 가장 간단한 방법입니다.
for 루프에서 break와 next를 사용하는 방법
두 개의 키워드가 for 루프의 정상적인 실행 순서를 방해합니다.
- 하다 루프를 즉시 종료하고 나머지 요소를 모두 건너뜁니다.
- 다음 것 현재 요소만 버리고 다음 요소로 넘어갑니다.
fruit <- c('Apple', 'Orange', 'Passion fruit', 'Banana') # break: stop at the first match for (i in fruit) { if (i == 'Passion fruit') { print('Found it, stopping here') break } print(i) } # next: skip one element and carry on for (i in fruit) { if (i == 'Orange') next print(i) }
중첩 루프에서 `break`와 `next`는 해당 루프를 포함하는 가장 안쪽 루프에서만 작동합니다. 행렬 예제에서 두 루프를 모두 유지하려면 플래그 변수를 설정하고 바깥쪽 루프에서도 이 변수를 테스트해야 합니다.
인덱스에는 seq_along() 함수를 사용하세요. `for (i in 1:length(x))`는 언뜻 보기에는 문제가 없어 보이지만, 빈 객체의 경우 `1:0`이 `1, 0` 시퀀스를 생성하여 루프가 두 번 실행되기 때문에 오류가 발생합니다. `seq_along(x)`는 빈 시퀀스를 반환하므로 루프가 올바르게 건너뛰어집니다.
for (i in seq_along(fruit)) { cat(i, fruit[i], '\n') }
리스트를 순회하는 for 루프
화장실ping 리스트를 사용하는 방식은 화장실과 완전히 똑같습니다.ping 벡터와 유사하지만, 각 요소가 서로 다른 유형을 가질 수 있다는 점이 다릅니다.
# Create a list with three vectors fruit <- list(Basket = c('Apple', 'Orange', 'Passion fruit', 'Banana'), Money = c(10, 12, 15), purchase = FALSE) for (p in fruit) { print(p) }
출력:
## [1] "Apple" "Orange" "Passion fruit" "Banana" ## [1] 10 12 15 ## [1] FALSE
행렬에 대한 for 루프
행렬은 행과 열의 두 차원을 가지므로 모든 셀을 순회하려면 두 개의 중첩된 for 루프가 필요합니다. 바깥쪽 루프는 행을, 안쪽 루프는 열을 순회해야 합니다.
# Create a matrix mat <- matrix(data = seq(10, 20, by=1), nrow = 6, ncol =2) # Create the loop with r and c to iterate over the matrix for (r in 1:nrow(mat)) for (c in 1:ncol(mat)) print(paste("Row", r, "and column",c, "have values of", mat[r,c]))
출력:
## [1] "Row 1 and column 1 have values of 10" ## [1] "Row 1 and column 2 have values of 16" ## [1] "Row 2 and column 1 have values of 11" ## [1] "Row 2 and column 2 have values of 17" ## [1] "Row 3 and column 1 have values of 12" ## [1] "Row 3 and column 2 have values of 18" ## [1] "Row 4 and column 1 have values of 13" ## [1] "Row 4 and column 2 have values of 19" ## [1] "Row 5 and column 1 have values of 14" ## [1] "Row 5 and column 2 have values of 20" ## [1] "Row 6 and column 1 have values of 15" ## [1] "Row 6 and column 2 have values of 10"
R에서 데이터 프레임을 순회하는 for 루프
데이터프레임은 열들의 리스트이므로, 일반적인 for 루프는 행이 아닌 열을 순회합니다. 이것이 바로 여러분이 원하는 바입니다.
df <- data.frame(a = 1:5, b = 6:10, c = 11:15) # Loop over the columns for (col in names(df)) { cat(col, 'has mean', mean(df[[col]]), '\n') }
이중 괄호에 유의하세요. df[[col]] extracts는 열을 벡터로 반환하는 반면, df[col]은 mean()이 처리할 수 없는 단일 열 데이터 프레임을 반환합니다.
화장실ping 행에 걸쳐. 행 단위 반복도 가능하지만 R이 매번 실행할 때마다 행을 복사하기 때문에 속도가 느립니다.
for (r in seq_len(nrow(df))) { cat('Row', r, 'sums to', sum(df[r, ]), '\n') }
수천 행을 초과하는 경우에는 rowSums(df), apply(df, 1, sum) 또는 dplyr을 사용하는 것이 좋습니다. group_by() 및 summarise() 파이프라인은 모두 복사 없이 동일한 작업을 수행합니다.
R에서 for 루프와 벡터화의 차이점
R은 벡터화된 언어입니다. 대부분의 연산자와 함수는 컴파일된 C 코드에서 이미 전체 벡터를 한 번에 처리합니다. 벡터화된 연산을 요소별로 반복하는 명시적인 루프는 코드가 더 길고 속도도 느립니다.
# Loop version squares <- c() for (i in 1:4) { squares[i] <- i * i } # Vectorized version, same result squares <- (1:4)^2
| 태스크 | 고리 | 벡터화된 등가물 |
|---|---|---|
| 요소별 산술 연산 | 각 요소에 대해 | x * 2, x + y, x^2 |
| 각 열에 함수를 적용합니다. | 이름(df)에 대해 | sapply(df, 평균) |
| 행별로 함수를 적용합니다. | seq_len(nrow(df)) 이상에 대해 | apply(df, 1, sum) |
| 결과 목록을 만드세요 | 리스트[[i]] <- …를 사용하여 | 랩플라이(v, f) |
| 조건부 재코딩 | if와 else를 사용하여 | 그렇지 않으면(cond, a, b) |
반복문이 여전히 올바른 해결책일 때. 각 반복이 이전 결과에 의존하는 경우, 외부 서비스를 호출하거나 파일을 작성하는 경우, 또는 작은 객체에서 속도보다 명확성이 더 중요한 경우에는 for 루프를 유지하세요.
반복문을 사용해야 한다면 미리 메모리를 할당하세요. 반복문 안에서 객체의 크기를 키우면 R은 매번 반복할 때마다 객체를 복사하게 됩니다. 먼저 객체를 원래 크기로 생성하세요.
# Slow: the vector is reallocated on every pass out <- c() for (i in 1:1000) out[i] <- i^2 # Fast: allocated once out <- numeric(1000) for (i in 1:1000) out[i] <- i^2
R 언어의 for 루프: 빠른 참조
이 튜토리얼에서 사용된 모든 구성 요소는 아래에 나열되어 있습니다.
| 목표 | Code |
|---|---|
| 벡터를 순회합니다 |
for (i in v) { print(i) } |
| 인덱스를 안전하게 순회합니다 |
for (i in seq_along(v)) { print(v[i]) } |
| 리스트를 순회합니다. |
for (p in my_list) { print(p) } |
| 데이터 프레임의 열을 순회합니다. |
for (col in names(df)) { print(mean(df[[col]])) } |
| 행렬을 순회합니다 |
for (r in 1:nrow(m)) for (c in 1:ncol(m)) print(m[r, c]) |
| 루프에서 일찍 빠져나오세요 |
if (condition) break
|
| 한 번의 반복을 건너뛰세요 |
if (condition) next
|
| 출력을 미리 할당합니다 |
out <- numeric(n) |
