기존 변수 값을 새 변수 값으로 변경하기 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
, 3
을 A반
, 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
, 3
을 A반
, 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반