기존 변수에서 새 변수 만들기 case_when()

기존 변수에서 새로운 변수를 만드는 방법으로 dplyr 패키지는 몇 가지 함수를 제공하고 있습니다. 참고로 dplyr 패키지는 tidyverse 패키지에 포함되어 있습니다.

  • mutate() 함수
  • case_when() 함수
  • recode() 함수
  • if_else() 함수

이 글에서는 case_when() 함수를 이용하는 방법을 중심으로 설명하겠습니다.

case_when() 함수의 기본 사용법은 다음과 같습니다. 새로운 변수를 만들려면 mutate() 함수와 같이 사용하여야 합니다.

library(tidyverse)
df %>% 
  mutate(새변수 = case_when(기존변수 < 30 ~ "낮음",
                            기존변수 < 60 ~ "중간",
                            TRUE ~ "높음"))

위 구문에서 TRUE는 앞의 조건들에 맞지 않는 나머지를 의미합니다.

데이터 프레임을 만들어서 이 함수를 실제로 활용하는 예제를 보여주겠습니다. 먼저 tidyverse 패키지를 로드 하겠습니다.

library(tidyverse)

다음으로 가상의 데이터 프레임을 만들겠습니다.

df <-
  data.frame(name = c("영희", "철민", "연수", "나연", "아라"),
             points = c(153, 95, 102, 111, 127),
             score = c(92, 87, 75, 89, NA))

df
##   name points score
## 1 영희    153    92
## 2 철민     95    87
## 3 연수    102    75
## 4 나연    111    89
## 5 아라    127    NA

예시 1 : 하나의 기존 변수에서 새 변수 만들기

아래 예시는 기존 score 변수의 값을 이용하여 grade라는 새 변수를 만드는 방법입니다.

df %>% 
  mutate(grade = case_when(score > 90 ~ "높음",
                           score > 80 ~ "중간",
                           TRUE ~ "낮음"))
##   name points score grade
## 1 영희    153    92  높음
## 2 철민     95    87  중간
## 3 연수    102    75  낮음
## 4 나연    111    89  중간
## 5 아라    127    NA  낮음

score 변수의 값이 90보다 크면 grade 변수의 값은 높음, score 변수의 값이 80보다 크면 grade 변수의 값은 중간, 나머지 즉 score 변수의 값이 80이하이거나 NA(결측치)인 경우에는 grade 변수의 값에 낮음이 입력이 됩니다.

만일 score 변수의 값이 NA일 경우 grade 변수의 값도 NA로 입력되기를 원한다면 아래와 같이 합니다.

df %>% 
  mutate(grade = case_when(score > 90 ~ "높음",
                           score > 80 ~ "중간",
                           is.na(score) ~ as.character(NA),
                           TRUE ~ "낮음"))
##   name points score grade
## 1 영희    153    92  높음
## 2 철민     95    87  중간
## 3 연수    102    75  낮음
## 4 나연    111    89  중간
## 5 아라    127    NA  <NA>

예시 2 : 다수의 기존 변수에서 새 변수 만들기

아래 예시는 기존 두 개의 변수(points, score)를 이용하여 quality라는 새 변수를 만드는 방법입니다.

df %>% 
  mutate(grade = case_when(score > 90 & points > 150 ~ "매우 우수",
                           score > 80 & points > 100 ~ "우수",
                           TRUE ~ "보통"))
##   name points score     grade
## 1 영희    153    92 매우 우수
## 2 철민     95    87      보통
## 3 연수    102    75      보통
## 4 나연    111    89      우수
## 5 아라    127    NA      보통