[R] 기존 변수 조건에 따라 새로운 변수 생성 (feat.case_when)

create-new-variables-using-case-when-in-r

해당 포스트에서는 'R에서 기존 변수로 조건에 맞는 새로운 변수를 생성 하는 방법' 에 대해 설명합니다.

INTRO

R에서 조건절을 사용한다면 가장 많이 사용되는 함수는 if(), ifelse() 입니다. 두 함수는 사용자가 원하는 조건에 따라 기존 변수를 변환 또는 생성해 주는데 조건이 3개 이상이 된다면 함수 사용에 불편함(e.g. 함수의 반복 사용으로 인식률 저하)이 발생합니다.

이런 경우를 위해 dplyr 패키지에서는 case_when() 함수를 제공하고 있고, 아래에서는 한 개 컬럼을 기준으로 적용할 때두 개 이상 컬럼을 기준으로 적용할 때를 나누어 예시 코드와 함께 사용 방법을 설명합니다.

case_when

데이터에 기존에 있던 변수를 이용해 새로운 변수를 생성할 때에는 기본 함수인 if(), ifelse()를 사용할 수 있지만, dplyr 패키지에서 제공되는 case_when() 함수를 이용한다면 보다 편하게 작업할 수 있습니다.

기본적인 사용법은 아래와 같습니다.

아래 코드에서 TRUE 조건은 else문의 조건을 의미하며, "앞의 조건들을 제외한 나머지는 'high'로 출력하여라"라고 이해하시면 됩니다.

library(dplyr)

df %>%
  mutate(new_var = case_when(var1 < 25 ~ 'low',
                             var2 < 35 ~ 'med',
                             TRUE ~ 'high'))


아래에서는 주어진 데이터 프레임(Data Frame)을 이용하여 실습을 진행합니다.

데이터 생성

아래는 case_when() 함수 실습에 사용할 데이터 프레임(Data Frame)을 생성하는 코드입니다.

df <- data.frame(
  player = c('A', 'B', 'C', 'D', 'E', 'F'),
  position = c('R1', 'R2', 'R3', 'R4', 'R5', NA),
  points = c(102, 105, 219, 322, 232, NA),
  assists = c(405, 407, 527, 412, 211, NA)
)
df
  player position points assists
1      A       R1    102     405
2      B       R2    105     407
3      C       R3    219     527
4      D       R4    322     412
5      E       R5    232     211
6      F     <NA>     NA      NA

예제1: 한 개 변수 기준 새로운 변수 생성

아래 실습은 한 개 변수를 기준으로 새로운 변수를 생성하는 코드로, points 변수의 값에 따라 quality 변수를 새롭게 생성합니다.

df %>%
  mutate(quality = case_when(points > 300 ~ 'high',
                             points > 120 ~ 'med',
                             TRUE ~ 'low'))
  player position points assists quality
1      A       R1    102     405     low
2      B       R2    105     407     low
3      C       R3    219     527     med
4      D       R4    322     412    high
5      E       R5    232     211     med
6      F     <NA>     NA      NA     low


위 출력 결과를 보면 points 변수의 값에 따라 300 이상이면 'high', 120 이상이면 'med', 그 외의 값들(결측치 포함)은 'low'로 적용되는 것을 확인할 수 있습니다.

예제2: 여러 변수 기준 새로운 변수 생성

아래 실습은 pointsassists 변수를 기준으로 새로운 변수를 생성하는 코드로, pointsassists 값에 따라 quality 변수를 새롭게 생성합니다.

df %>%
  mutate(
    quality = case_when(
      points > 215 & assists > 400 ~ 'great',
      points > 215 & assists > 200 ~ 'good',
      TRUE ~ 'average'
    )
  )
  player position points assists quality
1      A       R1    102     405 average
2      B       R2    105     407 average
3      C       R3    219     527   great
4      D       R4    322     412   great
5      E       R5    232     211    good
6      F     <NA>     NA      NA average


위 출력 결과를 보면 pointsassists에 따라 quality의 값이 다르게 입력된 것을 확인할 수 있습니다.

위 결과에서 6행의 경우, pointsassists의 값이 모두 NA임에도 불구하고 else()문에 포함되어 'average'로 입력된 것을 볼 수 있습니다. 논리적으로는 NA는 조건을 비교할 수 없기에 에러가 발생했어야 하는 것이 맞으며, 조건을 적용하기 위한 정확한 표현 및 코드는 아래와 같이 is.na() 함수를 사용하면 됩니다.

df %>%
  mutate(
    quality = case_when(
      is.na(points) ~ 'missing',
      points > 215 & assists > 400 ~ 'great',
      points > 215 & assists > 200 ~ 'good',
      TRUE ~ 'average'
    )
  )
  player position points assists quality
1      A       R1    102     405 average
2      B       R2    105     407 average
3      C       R3    219     527   great
4      D       R4    322     412   great
5      E       R5    232     211    good
6      F     <NA>     NA      NA missing

관련 링크

[1] Create new variables from existing variables in R
[2] [R] 조건문과 반복문을 이용하여 약수 출력
[3] [R] 내 답과 정답 비교하여 점수 계산하기(벡터(vector) 다루기 예제)