기존 변수 값을 새 변수 값으로 변경하기 recode()

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

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

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

recode() 함수는 기존의 값을 새로운 값으로 변경하는 역할을 하는 함수입니다. 주로 기존 변수의 특정 값을 새로운 값으로 변경할 때 많이 사용합니다. recode() 함수의 기본 사용법은 다음과 같습니다.

recode(기존변수, 기존값1 = "새값1", 기존값2 = "새값2" )

recode() 함수의 이러한 특성때문에 mutate() 함수와 같이 사용한다면 기존 변수에서 새로운 변수를 만들 수 있습니다. 기본 사용법은 다음과 같습니다.

library(tidyverse)
df %>% 
  mutate(새변수 = recode(기존변수,
                         기존값1 = "새값1",
                         기존값2 = "새값2"))

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

library(tidyverse)

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

df <-
  data.frame(name = c("영희", "철민", "연수", "나연", "아라"),
             class = c(1, 2, 1, 3, 2),
             score = c(92, 87, 75, 89, NA))

df
##   name class score
## 1 영희     1    92
## 2 철민     2    87
## 3 연수     1    75
## 4 나연     3    89
## 5 아라     2    NA

예시 1 : 기존 변수 값을 새 변수 값으로 변경하기

아래 예시는 기존 class 변수의 값을 이용하여 class_new라는 새 변수를 만드는 방법입니다. 기존 변수의 값인 1, 2, 3A반, B반, C반으로 변경합니다.

recode()를 사용할 때 주의할 점은 값이 숫자라도 " 또는 '를 붙여주어야 한다는 점입니다. 즉 값이 2이면 "2"로 입력하여야 합니다.

df %>% 
  mutate(class_new = recode(class,
                            "1" = "A반",
                            "2" = "B반",
                            "3" = "C반"))
##   name class score class_new
## 1 영희     1    92       A반
## 2 철민     2    87       B반
## 3 연수     1    75       A반
## 4 나연     3    89       C반
## 5 아라     2    NA       B반

만일, 새 변수 이름을 기존 변수 이름과 동일하게 한다면 기존 변수의 값이 변경되는 결과로 나타납니다.

df %>% 
  mutate(class = recode(class,
                        "1" = "A반",
                        "2" = "B반",
                        "3" = "C반"))
##   name class score
## 1 영희   A반    92
## 2 철민   B반    87
## 3 연수   A반    75
## 4 나연   C반    89
## 5 아라   B반    NA

위 예시와 같이 변수의 값인 1, 2, 3A반, B반, C반으로 변경하는 방법은 recode() 함수를 이용하는 방법 외에도 case_when(), if_else(), switch() 등의 함수를 이용하는 방법이 있습니다.

recode() 함수는 변경하려는 변수 값의 종류가 적을 때 많이 사용합니다. 약간 복잡한 경우에는 case_when() 함수를 많이 사용합니다.

아래 코드는 위 예시를 case_when() 함수를 사용한 코드로 변경한 것입니다. recode() 함수와 다른 점은 숫자 값에 " 또는 '를 붙여주지 않아도 된다는 점입니다. 물론 붙여도 문제는 없습니다.

df %>% 
  mutate(class_new = case_when(class == 1 ~ "A반",
                               class == 2 ~ "B반",
                               class == 3 ~ "C반"))
##   name class score class_new
## 1 영희     1    92       A반
## 2 철민     2    87       B반
## 3 연수     1    75       A반
## 4 나연     3    89       C반
## 5 아라     2    NA       B반

예시 2 : 새 변수 값에 NA 값 할당하기

recode() 함수는 기존 변수 값에 새 변수 값을 할당하지 않으면 자동으로 NA 값을 할당합니다. 아래 예시에서는 기본 변수 값 3에 새로운 변수 값을 할당하지 않은 경우입니다.

df %>% 
  mutate(class_new = recode(class,
                            "1" = "A반",
                            "2" = "B반"))
## Warning: Unreplaced values treated as NA as `.x` is not compatible.
## Please specify replacements exhaustively or supply `.default`.
##   name class score class_new
## 1 영희     1    92       A반
## 2 철민     2    87       B반
## 3 연수     1    75       A반
## 4 나연     3    89      <NA>
## 5 아라     2    NA       B반

만일 새 변수 값을 지정하지 않을 경우, NA로 자동 할당되지 않고 특정 값으로 자동 할당되기를 원한다면 .default = "특정값" 옵션을 추가합니다.

df %>% 
  mutate(class_new = recode(class,
                            "1" = "A반",
                            "2" = "B반",
                            .default = "기타"))
##   name class score class_new
## 1 영희     1    92       A반
## 2 철민     2    87       B반
## 3 연수     1    75       A반
## 4 나연     3    89      기타
## 5 아라     2    NA       B반

예시 3 : factor 형식으로 새 변수 값 할당하기

recode_factor() 함수는 recode() 함수와 유사하나 factor 변수의 level 순서를 유지시켜 준다는 차이가 있습니다. 따라서 변수가 factor 형태이면 recode_factor()를 쓰는 것이 편리합니다.

먼저 class 변수를 factor 형식으로 변환하겠습니다.

df <-
  df %>% 
  mutate(class = factor(class)) 

df |> str()
## 'data.frame':    5 obs. of  3 variables:
##  $ name : chr  "영희" "철민" "연수" "나연" ...
##  $ class: Factor w/ 3 levels "1","2","3": 1 2 1 3 2
##  $ score: num  92 87 75 89 NA
df %>% 
  mutate(class_new = recode_factor(class,
                                   "1" = "A반",
                                   "2" = "B반",
                                   "3" = "C반"))
##   name class score class_new
## 1 영희     1    92       A반
## 2 철민     2    87       B반
## 3 연수     1    75       A반
## 4 나연     3    89       C반
## 5 아라     2    NA       B반