R의 IF, ELSE, ELSE IF 문

⚡ 스마트 요약

R의 if-else 문과 else-if 문은 논리 조건에 따라 어떤 코드 블록이 실행될지 선택합니다. 이 가이드에서는 두 갈래 분기, 여러 갈래 분기, 벡터화된 ifelse() 함수, 그리고 정확한 일치를 위한 switch() 함수를 다룹니다.

  • 🔀 핵심 구문: if (condition) { } else { }는 테스트가 TRUE일 때 한 분기를 실행하고 FALSE일 때 다른 분기를 실행합니다.
  • 🔗 여러 지점: R에서는 else if를 두 개의 단어로 나누어 씁니다. elif 키워드는 없습니다. Python.
  • ⚠️ 경계 관리: 크거나 같음과 작거나 같음 조건을 사용하여 분기 사이의 의도치 않은 간극으로 값이 누락되지 않도록 하십시오.
  • 벡터화된 형태: ifelse(test, yes, no)는 전체 벡터를 한 번에 평가하는데, if는 그렇게 할 수 없습니다.
  • 🗂️ 정확한 일치: switch() 함수는 긴 등식 비교 과정을 단일 조회로 대체합니다.
  • 🧮 Opera선택 사항: 단일 앰퍼샌드는 요소별로 작동하고, 이중 앰퍼샌드는 if 문 안에 하나의 TRUE 또는 FALSE만 적용됩니다.

R 언어에서의 if Else Else If 문

R에서의 if-else 문

An 다른 경우라면 이 문은 조건이 참일 때 하나의 코드 블록을 실행하고, 거짓일 때 다른 코드 블록을 실행합니다. R에서의 구문은 다음과 같습니다.

if (condition) {
    Expr1 
} else {
    Expr2
}

If Else 문

quantity라는 변수의 값이 20보다 큰지 확인합니다. 20보다 크면 "많이 판매하셨네요!"를 출력하고, 그렇지 않으면 "오늘은 충분하지 않습니다."를 출력합니다.

# Create vector quantity
quantity <-  25
# Set the if-else statement
if (quantity > 20) {
    print('You sold a lot!')
} else {
    print('Not enough for today')  
}

출력:

## [1] "You sold a lot!"

주의 사항들여쓰기는 R이 코드를 실행하는 방식에 영향을 주지 않지만, 일관된 들여쓰기는 긴 조건문을 읽기 쉽게 유지하는 데 중요합니다. 또한 닫는 중괄호와 else 키워드는 반드시 같은 줄에 있어야 합니다. 그렇지 않으면 R은 if 블록을 완료된 것으로 간주하고 오류를 발생시킵니다.

R에서의 else if 문

체인 추가 테스트 그렇지 않으면R에는 elif 키워드가 없습니다. PythonR에서는 두 단어를 각각 따로 쓰고, 필요한 만큼 분기를 추가할 수 있습니다. 구문은 다음과 같습니다.

if (condition1) { 
    expr1
    } else if (condition2) {
    expr2
    } else if  (condition3) {
    expr3
    } else {
    expr4
}

세 가지 결과를 원한다고 가정해 보겠습니다. 20 미만이면 "오늘은 부족해요", 20에서 30 사이이면 "평범한 하루", 30 이상이면 "정말 멋진 하루였어요!"를 출력합니다.

수량을 변경해 볼 수 있습니다.

# Create the variable quantity
quantity <-  10
# Create multiple condition statement
if (quantity < 20) {
      print('Not enough for today')
} else if (quantity >= 20 & quantity <= 30) {
     print('Average day')
} else {
      print('What a great day!')
}

출력:

## [1] "Not enough for today"

예 2 :

부가가치세율은 제품 카테고리별로 다릅니다. 각각 다른 세율이 적용되는 세 가지 카테고리를 생각해 보세요.

카테고리 제품 VAT
A 책, 잡지, 신문 등.. 8%
B 야채, 고기, 음료 등.. 10%
C 티셔츠, 청바지, 바지 등.. 20%

else if 문은 고객이 구매한 상품에 대해 올바른 세율을 적용합니다.

category <- 'A'
price <- 10
if (category =='A'){
  cat('A vat rate of 8% is applied.','The total price is',price *1.08)  
} else if (category =='B'){
    cat('A vat rate of 10% is applied.','The total price is',price *1.10)  
} else {
    cat('A vat rate of 20% is applied.','The total price is',price *1.20)  
}

출력:

## A vat rate of 8% is applied. The total price is 10.8

R에서 ifelse() 함수를 벡터화한 방법

if 문은 정확히 하나의 값만 처리합니다. 벡터를 전달하면 R 4.2 이상 버전에서는 오류가 발생하는데, 이는 조건이 TRUE 또는 FALSE 단일 값이어야 하기 때문입니다. ifelse() 함수는 모든 요소를 ​​한 번에 검사하고 동일한 길이의 벡터를 반환함으로써 이 문제를 해결합니다.

quantities <- c(10, 25, 40, 18)

# if cannot do this
result <- ifelse(quantities > 20, 'You sold a lot!', 'Not enough for today')
result

출력:

## [1] "Not enough for today" "You sold a lot!"      "You sold a lot!"      
## [4] "Not enough for today"

세 개의 인수는 테스트, 테스트가 참일 때 반환되는 값, 그리고 테스트가 거짓일 때 반환되는 값입니다. 이 세 가지 값은 모두 동일한 길이로 재사용됩니다.

ifelse()를 중첩하면 벡터 전체에 걸쳐 else if 체인이 생성됩니다.

ifelse(quantities < 20, 'Not enough for today',
    ifelse(quantities <= 30, 'Average day', 'What a great day!'))

알아두면 유용한 두 가지 제한 사항이 있습니다. ifelse()는 요인 수준이나 날짜 클래스와 같은 속성을 결과에서 제외하고, 모든 요소에 대해 두 분기를 모두 평가하므로 한 분기에서 비용이 많이 드는 경우 비효율적입니다. dplyr의 대안은 다음과 같습니다. case_when() 중첩 구조를 완전히 피하고 타입을 그대로 유지합니다.

library(dplyr)
case_when(
    quantities < 20  ~ 'Not enough for today',
    quantities <= 30 ~ 'Average day',
    TRUE             ~ 'What a great day!'
)

R 언어의 switch() 문

모든 분기에서 동일한 변수의 같음을 검사할 때, 긴 else if 문은 읽기 어려워집니다. switch() 함수는 이를 단일 조회로 대체합니다.

category <- 'A'
price <- 10

vat <- switch(category,
    'A' = 1.08,
    'B' = 1.10,
    'C' = 1.20,
    1.20)          # the unnamed last value is the default

cat('The total price is', price * vat)

그것의 행동을 지배하는 세 가지 규칙이 있습니다.

  • 문자 인수를 사용하면 switch() 함수는 이름과 정확히 일치하는 항목을 찾습니다. 부분 일치나 패턴 일치는 지원하지 않습니다.
  • 이름이 지정되지 않은 마지막 요소는 기본값으로 사용됩니다. 이 요소가 없으면 일치하지 않는 값이 보이지 않게 NULL을 반환하게 되는데, 이는 흔히 발생하는 숨겨진 버그의 원인입니다.
  • 정수 인수를 사용하면 switch()는 위치를 기준으로 선택합니다. switch(2, “a”, “b”, “c”)는 “b”를 반환합니다.

고정된 값 집합과 정확히 일치하는 조건을 찾으려면 switch() 함수를 사용하고, switch() 함수로는 표현할 수 없는 범위 및 복합 조건에는 else if 문을 사용하세요. 조건을 시퀀스에 반복적으로 적용하려면 else if 문과 함께 사용하세요. for 루프 또는 while 루프.

논리 OperaR 조건의 tors

조건을 구성하는 연산자들은 서로 다르게 동작하며, 그 차이는 중요합니다.

Opera바위 산 의미 에 사용
& 요소별로 그리고 ifelse(), filter(), 전체 벡터
&& 단일값 AND, 단락 만약 ()이고 () 동안
| 요소별 또는 ifelse(), filter(), 전체 벡터
|| 단일값 OR, 단락 만약 ()이고 () 동안
! 아니오, 테스트 결과를 무효화합니다. 어딘가에
%안에% 이 집합에 값이 있습니까? 긴 OR 체인을 대체합니다.

단락이 중요한 이유. 이중 형식은 답이 결정되는 즉시 종료되므로, 왼쪽 항에서 이미 결과가 결정된 경우 오른쪽 항은 절대 평가되지 않습니다. 따라서 가드 절을 작성하는 것이 안전합니다.

# Safe: length() is checked before x[1] is touched
if (length(x) > 0 && x[1] > 10) print('ok')

여러 값과 비교. 여러 개의 동등성 비교 연산자를 연결하는 대신 %in% 연산자를 사용하는 것이 더 간결하고 오타 발생 가능성도 낮습니다.

if (category %in% c('A', 'B')) {
    print('Reduced VAT rate applies')
}

마지막으로 한 가지 더 말씀드리자면, 등호(=) 하나만으로는 값을 할당할 뿐 비교하지 않습니다. 항상 조건문 안에 ==를 사용하세요.

R에서의 조건문: 빠른 참조

이 튜토리얼에서 사용된 모든 구성 요소는 아래에 나열되어 있습니다.

목표 Code
두 개의 지점
if (cond) { a } else { b }
여러 지점
if (c1) { a } else if (c2) { b } else { c }
벡터화된 조건
ifelse(test, yes, no)
벡터의 다중 분기
case_when(c1 ~ a, c2 ~ b, TRUE ~ c)
정확한 일치 검색
switch(x, "A" = 1, "B" = 2, 0)
멤버십 테스트
if (x %in% c("A", "B")) { }

자주 묻는 질문

`if` 문은 TRUE 또는 FALSE 단일 값을 처리하며, 실행할 코드 블록을 제어합니다. `ifelse()`는 벡터화된 함수로, 벡터의 모든 요소를 ​​검사하고 그 결과를 벡터로 반환합니다.

if 및 while 문 내부에서 조건이 하나의 값이어야 하고 단락 평가가 우변을 보호하는 경우 이중 형식을 사용하십시오. 전체 벡터에 대한 요소별 테스트에는 단일 형식을 사용하십시오.

R 4.2 버전부터 if 조건문은 정확히 하나의 TRUE 또는 FALSE만 가져야 합니다. 이제 더 긴 벡터는 경고가 아닌 오류를 발생시킵니다. 의도한 바에 따라 ifelse(), any() 또는 all() 함수를 사용하십시오.

조건에 따라 기능 설계 규칙 및 조기 종료가 결정됩니다.ping 훈련 중 검사 및 모델 출력에 대한 임계값 결정에 사용됩니다. case_when()과 같은 벡터화된 형태는 전체 데이터 세트에 적용할 수 있기 때문에 선호됩니다.

네. AI 비서는 경계값이 모든 분기를 통과하거나 비교에 등호가 하나만 사용되는 등의 오류를 찾아낼 수 있습니다. 수정된 체인을 경계값에 대해 직접 테스트해 보세요.

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