목록과 행렬의 예가 포함된 R의 For 루프

⚡ 스마트 요약

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

  • 🔁 핵심 구문: for (i in vector) { expression }는 각 요소를 차례로 i에 할당하고 본문을 실행합니다.
  • 📋 모든 객체: 동일한 구문을 사용하여 벡터, 리스트, 데이터 프레임 열 집합 또는 행렬의 행을 순회할 수 있습니다.
  • 🧮 중첩 루프: 행렬을 처리하려면 두 개의 루프가 필요합니다. 바깥쪽 루프는 행을, 안쪽 루프는 열을 처리합니다.
  • 🛑 흐름 제어 : break는 루프를 완전히 종료하고 next는 현재 요소만 건너뜁니다.
  • 벡터화 우선: 내장 벡터화 연산과 apply 계열 함수는 명시적인 반복문보다 빠르고 간결합니다.
  • ⚠️ 안전한 순서: 객체가 비어 있을 때 제대로 작동하지 않는 1:length(x) 대신 seq_along(x)를 사용하십시오.

R 리스트 행렬에서 for 루프

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

R에서의 for 루프 구문

for (i in vector) {
    Exp
}

여기

R 벡터의 모든 변수를 반복하고 exp 내부에 작성된 계산을 수행합니다.

R의 For 루프
R의 For 루프

몇 가지 예를 살펴보겠습니다.

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)

자주 묻는 질문

x가 비어 있을 때, 1:length(x)는 1, 0의 시퀀스를 반환하므로 루프가 존재하지 않는 요소에 대해 두 번 실행됩니다. seq_along(x)는 빈 시퀀스를 반환하므로 루프가 올바르게 건너뛰어집니다.

반복문 자체는 문제가 아닙니다. 문제는 반복문 안에서 객체의 크기를 늘리는 방식인데, R은 매번 전체 객체를 복사하기 때문입니다. 결과값을 미리 할당하거나 벡터화된 함수를 사용하면 이러한 문제는 대부분 해결됩니다.

열. 데이터 프레임은 열의 목록이므로 각 반복마다 전체 열 하나가 반환됩니다. 행을 순회해야 하는 경우 seq_len(nrow(df))를 명시적으로 사용하세요.

for 루프는 하이퍼파라미터 스윕, 교차 검증 폴드 및 학습 에포크를 실행합니다. 이러한 각각의 요소에는 반복 횟수가 정해져 있으며, 이것이 바로 for 구문이 설계된 목적입니다.

예. AI 어시스턴트는 대부분의 요소별 반복문을 벡터화된 반복문이나 apply 계열 반복문으로 변환할 수 있습니다. 원래 코드를 대체하기 전에 identical() 함수를 사용하여 두 버전의 출력 결과를 비교해 보세요.

이 게시물을 요약하면 다음과 같습니다.