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

R에서의 if-else 문
An 다른 경우라면 이 문은 조건이 참일 때 하나의 코드 블록을 실행하고, 거짓일 때 다른 코드 블록을 실행합니다. R에서의 구문은 다음과 같습니다.
if (condition) { Expr1 } else { Expr2 }
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")) { } |

