Hướng dẫn sử dụng case_when trong dplyr

Tác giả: Nguyễn Hải Trường | 2018-12-10

Thông thường trong quá trình phân tích dữ liệu, chúng ta sẽ gặp phải vấn đề liên quan đến chất lượng dữ liệu. Do vậy, việc trước tiên chúng ta cần phải làm đó là xử lý, làm sạch dữ liệu. Trong bài viết này, Ranalytics sẽ hướng dẫn các bạn sử dụng một trong những hàm rất phổ biến và hữu dụng trong việc xử lý dữ liệu trong R - hàm case_when().

Chúng ta sẽ sử dụng dữ liệu iris có sẵn trong R để làm ví dụ minh họa.

library(dplyr)
data("iris")
iris %>% summary
##   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
##  Median :5.800   Median :3.000   Median :4.350   Median :1.300  
##  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
##        Species  
##  setosa    :50  
##  versicolor:50  
##  virginica :50  
##                 
##                 
## 

Giả sử chúng ta muốn tạo thêm 1 biến mới (ví dụ tên là Range_Sepal_Length) dựa vào biến có sẵn Sepal.Length với những điều kiện như sau:

  • Sepal.Length < 5 (cm): low

  • 5 <= Sepal.Length <= 6 (cm): medium

  • Sepal.Length > 6 (cm): high

Như vậy, biến mới Range_Sepal_Length sẽ phải gồm 3 giá trị (low, medium, high) với những điều kiện nêu trên theo biến Sepal.Length.

Trong R, chúng ta sẽ sử dụng hàm case_when() kết hợp hàm mutate() (hàm mutate() chúng ta sử dụng khi muốn thêm trường dữ liệu mới trong R):

iris %>% 
  mutate(Range_Sepal_Length = case_when(
    Sepal.Length < 5 ~ "low",
    Sepal.Length >= 5 & Sepal.Length <= 6 ~ "medium",
    TRUE ~ "high"   # TRUE - với những trường hợp còn lại
  ) %>% as.factor) %>% 
  head
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa
##   Range_Sepal_Length
## 1             medium
## 2                low
## 3                low
## 4                low
## 5             medium
## 6             medium

Như vậy, chúng ta đã vừa thêm trường dữ liệu mới Range_Sepal_Length - phái sinh từ trường Sepal.Length.

Lưu ý!!!: Đối với những ai đang sử dụng package dplyr version cũ, có thể sẽ gặp lỗi trong câu lệnh nói trên. Để khắc phục vấn đề trên, chúng ta có thể download package dplyr version mới nhất HOẶC đơn giản hơn là thêm .$ vào trước biến để lọc điều kiện (trong trường hợp này là Sepal.Length) như sau:

iris %>% 
  mutate(Range_Sepal_Length = case_when(
    .$Sepal.Length < 5 ~ "low",
    .$Sepal.Length >= 5 & .$Sepal.Length <= 6 ~ "medium",
    TRUE ~ "high"   # TRUE - với những trường hợp còn lại
  ) %>% as.factor) %>% 
  head
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa
##   Range_Sepal_Length
## 1             medium
## 2                low
## 3                low
## 4                low
## 5             medium
## 6             medium

Như vậy, chúng ta đã vừa được làm quen với cách sử dụng hàm case_when() kết hợp mutate(). Chúc các bạn học tập và làm việc hiệu quả với Ranalytics.vn!

comments powered by Disqus