Xử lý factor với `forcats`

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

Trong quá trình phân tích dữ liệu, chúng ta sẽ thường gặp phải những vấn đề liên quan đến việc xử lý các biến rời rạc (factor/categorical variable). Trong bài viết này, Ranalytics sẽ hướng dẫn các bạn sử dụng một số hàm cơ bản trong package forcats để xử lý các biến rời rạc.


Forcats package

Package forcats là 1 package rất hữu dụng trong việc xử lý các biến rời rạc có thuộc tính là nhóm (factor) trong R.

Biến rời rạc là biến mà chúng ta không thể hiện được dưới dạng số, mà chỉ thể hiện tính chất của thực thế, ví dụ: giới tính, tình trạng hôn nhân, nghề nghiệp…

library(dplyr)
library(ggplot2)
library(forcats)

Factor Recode

Một trong những hàm rất hữu dụng trong package forcatsfct_recode. Nó giúp chúng ta thay đổi các giá trị (levels) của 1 biến rời rạc (factor).

# Sử dụng dữ liệu airquality có sẵn trong R
data("airquality")
airquality %>% str
## 'data.frame':    153 obs. of  6 variables:
##  $ Ozone  : int  41 36 12 18 NA 28 23 19 8 NA ...
##  $ Solar.R: int  190 118 149 313 NA NA 299 99 19 194 ...
##  $ Wind   : num  7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 ...
##  $ Temp   : int  67 72 74 62 56 66 65 59 61 69 ...
##  $ Month  : int  5 5 5 5 5 5 5 5 5 5 ...
##  $ Day    : int  1 2 3 4 5 6 7 8 9 10 ...
airquality %>% summary
##      Ozone           Solar.R           Wind             Temp      
##  Min.   :  1.00   Min.   :  7.0   Min.   : 1.700   Min.   :56.00  
##  1st Qu.: 18.00   1st Qu.:115.8   1st Qu.: 7.400   1st Qu.:72.00  
##  Median : 31.50   Median :205.0   Median : 9.700   Median :79.00  
##  Mean   : 42.13   Mean   :185.9   Mean   : 9.958   Mean   :77.88  
##  3rd Qu.: 63.25   3rd Qu.:258.8   3rd Qu.:11.500   3rd Qu.:85.00  
##  Max.   :168.00   Max.   :334.0   Max.   :20.700   Max.   :97.00  
##  NA's   :37       NA's   :7                                       
##      Month            Day      
##  Min.   :5.000   Min.   : 1.0  
##  1st Qu.:6.000   1st Qu.: 8.0  
##  Median :7.000   Median :16.0  
##  Mean   :6.993   Mean   :15.8  
##  3rd Qu.:8.000   3rd Qu.:23.0  
##  Max.   :9.000   Max.   :31.0  
## 

Trong tập dữ liệu trên, biến month đang có định dạng là integer, chuyển thành định dạng factor

airquality$Month <- airquality$Month %>% 
  as.factor

airquality$Month %>% class
## [1] "factor"
levels(airquality$Month)
## [1] "5" "6" "7" "8" "9"

Thay tên các tháng sử dụng hàm fct_recode

airquality$Month <- fct_recode(airquality$Month, 
                               May = '5', 
                               June = '6', 
                               July = '7', 
                               August = '8', 
                               September = '9')

levels(airquality$Month)
## [1] "May"       "June"      "July"      "August"    "September"
library(ggplot2)
airquality %>% 
  ggplot(aes(Month, Temp)) +
  geom_boxplot(aes(fill = Month)) +
  ggtitle(label = "Daily Temperatures Aggregated by Month") +
  theme_bw()


Factor Reverse

Để đảo ngược lại thứ tự các giá trị trong 1 biến rời rạc chúng ta dùng hàm fct_rev.

airquality %>% 
  ggplot(aes(fct_rev(Month), Temp)) +
  geom_boxplot(aes(fill = Month)) +
  labs(x = "Month") +
  ggtitle(label = "Our plot now has the x-axis in reverse order") +
  theme_bw()


Factor Relevel

Một hàm rất hữu dụng khác là fct_relevel. Hàm này giúp chúng ta thay đổi bất kỳ giá trị của 1 biến rời rạc ở bất cứ vị trí nào ta mong muốn. Giả sử ta muốn vẽ biểu đồ nhiệt độ các tháng theo thứ tự: September, July, May, August, June

airquality$Month <- fct_relevel(airquality$Month, 'September', 'July', 'May', 'August', 'June')
#Kiểm tra lại thứ tự của factor
levels(airquality$Month)
## [1] "September" "July"      "May"       "August"    "June"
airquality %>% 
  ggplot(aes(Month, Temp)) +
  geom_boxplot(aes(fill = Month)) +
  ggtitle(label = "Notice how the order of the level 'Month' has changed") +
  theme_bw()


Factor Reorder

Một hàm khác thường xuyên được sử dụng để sắp xếp theo thứ tự tăng/giảm dần của 1 biến rời rạc dựa vào giá trị của 1 biến số khác là fct_reorder.

Giả sử, trong trường hợp này chúng ta muốn sắp xếp các tháng theo nhiệt độ tăng dần. Ta có thể lựa chọn .desc=T (thứ tự giảm dần) hoặc .desc=F (tăng dần)

airquality %>% 
  ggplot(aes(x = fct_reorder(Month, Temp, .desc = F), y = Temp)) +
  geom_boxplot(aes(fill = Month)) +
  labs(title = "We can make better comparison",
       subtitle = "by reordering the levels based on the temperature values!",
       x = "Month") +
  theme_bw() +
  theme(plot.title = element_text(size = 12, 
                                  face = 'bold'))


Như vậy, chúng ta đã vừa được làm quen với một số hàm cơ bản trong package forcats như thay đổi và sắp xếp thứ tự các giá trị của 1 biến rời rạc. 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