해당 포스트에서는 'R에서 기존 변수로 조건에 맞는 새로운 변수를 생성 하는 방법' 에 대해 설명합니다.
INTRO
R에서 조건절을 사용한다면 가장 많이 사용되는 함수는 if()
, ifelse()
입니다. 두 함수는 사용자가 원하는 조건에 따라 기존 변수를 변환 또는 생성해 주는데
이런 경우를 위해 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: 여러 변수 기준 새로운 변수 생성
아래 실습은 points
와 assists
변수를 기준으로 새로운 변수를 생성하는 코드로, points
와 assists
값에 따라 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
위 출력 결과를 보면 points
와 assists
에 따라 quality
의 값이 다르게 입력된 것을 확인할 수 있습니다.
위 결과에서 6행의 경우, points
와 assists
의 값이 모두 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) 다루기 예제)