데이터 전처리를 하다 보면 특정 조건에 맞게 수치를 변경시키거나 그룹을 나누는 작업이 빈번하게 일어납니다. 예를 들어 기업 데이터에서 “매출이 양수면 1(흑자), 음수면 0(적자)으로 일괄 변경해라” 같은 경우가 대표적입니다.
이럴 때 필수적으로 꺼내 들어야 하는 무기가 바로 조건문(Conditional Statements)입니다. 오늘은 R에서 가장 핵심적으로 쓰이는 3가지 조건문인 if/else, ifelse(), 그리고 최신 데이터 전처리 트렌드에서 다중 조건을 완벽하게 처리해주는 case_when()의 실전 완벽 가이드를 정리해 드립니다.
1. 전통적이고 직관적인 if … else 구문
다른 모든 프로그래밍 언어에서도 통용되는 가장 고전적인 조건문 형태입니다. 만약 지정한 괄호 안의 조건이 참(TRUE)이면 첫 번째 중괄호 {} 블록을 실행하고, 거짓(FALSE)이면 else 뒤의 두 번째 블록을 실행합니다.
x <- 3
if (x > 4) {
y <- 1
} else {
y <- 2
}
y
> [1] 2
위 코드에서는 x > 4의 검사 결과가 거짓(3 > 4는 거짓)이므로 자연스럽게 else 구문으로 넘어가게 되어, 최종적으로 y에 2가 할당된 것을 알 수 있습니다.
2. 벡터화의 마법: 한 방에 처리하는 ifelse() 함수
사실 실무 R 코딩에서는 위와 같이 공간을 낭비하며 길게 쓰는 if...else 구문보다 내장된 ifelse() 삼항 함수를 압도적으로 많이 사용합니다. 이 함수를 쓰면 직관적인 파라미터 세 개(조건식, 참일 때, 거짓일 때)로 모든 분기를 한 줄에 끝낼 수 있습니다.
# 1번 예제를 한 줄로 줄이는 방법
y <- ifelse(x > 4, 1, 2)
y
> [1] 2
💡 실전 꿀팁: ifelse()가 막강한 이유
ifelse()의 진짜 파괴적인 매력은 하나의 단일 변수가 아닌, 수만 개로 묶여 있는 벡터(Vector)나 데이터프레임 열(Column) 전체에 한 번에 적용이 가능하다는 점입니다.
x_vec <- c(1, -2, 3, -4, 5)
ifelse(x_vec > 0, "양수", "음수")
> [1] "양수" "음수" "양수" "음수" "양수"
이렇게 데이터가 수십만 개여도 for 반복문을 쓸 필요 없이 ifelse 단 한 방이면 모든 인덱스를 순회하며 결과를 분기시킬 수 있어, 실무 데이터 랭글링에서 독보적으로 쓰이는 함수입니다.
3. 분기 조건이 3개 이상일 땐? 무조건 case_when()
현업에선 이분법이 잘 통하지 않습니다. 조건이 “A이면 이것, B이면 저것, C이면 요것…” 이렇게 늘어날 경우 ifelse()안에 다시 ifelse()를 중첩(Nested)시켜 써야 하고, 코드는 금세 지옥으로 변합니다. 이럴 때는 현대 R 생태계를 점령한 dplyr (혹은 tidyverse) 패키지의 case_when()을 전격 기용합니다.
library(dplyr)
x_vec <- c(1, -2, 3, -4, 5)
result <- case_when(
x_vec > 0 ~ "양수", # 0보다 크면 양수
x_vec == 0 ~ "0", # 0 이면 0
x_vec < 0 ~ "음수", # 0보다 작으면 음수
.default = as.character(x_vec) # 어떤 조건도 맞지 않을 때의 기본 방어값
)
result
> [1] "양수" "음수" "양수" "음수" "양수"
구조를 읽는 순간 직관적으로 어떤 조건을 뜻하는지 바로 눈에 들어옵니다. 좌측엔 조건을, ~ (물결 기호, 틸드) 우측엔 반환값을 순서대로 정리하기만 하면 끝입니다. 최신 R 버전에서는 TRUE ~ 값 대신 .default = 값 옵션을 명시적으로 지원하여 안전성을 더 높였습니다.
요약하자면, 단일 로직 분기에는 if...else를 쓰고, 거대한 표 데이터의 2가지 카테고리 분리에는 ifelse(), 복잡한 다중 카테고리 태깅 작업엔 case_when() 구문을 활용하시면 코드가 놀랍도록 간결해지니 꼭 숙지하시기 바랍니다!
당신이 좋아할 만한 콘텐츠
by Google Adsense