Biến đổi dữ liệu nhanh với mutate

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

Trong quá trình phân tích dữ liệu sẽ có thể phát sinh việc chúng ta muốn tạo thêm những biến mới - phái sinh từ những biến sẵn có trong dữ liệu. Trong bài viết này, Ranalytics sẽ hướng dẫn các bạn cách sử dụng hàm mutate() và nhóm hàm mutate_if(), mutate_at(), mutate_all() để thêm 1 hoặc nhiều biến vào tập dữ liệu.

Sử dụng dữ liệu iris có sẵn trong R. Dữ liệu bao gồm những thông số (đơn vị: cm) về chiều dài/rộng cánh hoa và đài hoa của 3 loài hoa: setosa, versicolor, virginica (150 quan sát).

# Package sử dụng
library(dplyr)

# Summary dữ liệu
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  
##                 
##                 
## 
# 6 quan sát đầu tiên của tập dữ liệu
iris %>% 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

Để tạo thêm 1 biến mới trong tập dữ liệu, chúng ta sử dụng hàm mutate().

data <- iris %>% 
  # Thêm biến mới sepal_length_range theo điều kiện sau:
  mutate(sepal_length_range = case_when(
    Sepal.Length < 5 ~ "low",
    Sepal.Length >= 5 & Sepal.Length <= 6 ~ "medium",
    TRUE ~ "high"
  ) %>% as.factor)

# 6 quan sát đầu tiên của tập dữ liệu sau khi thêm 1 biến mới
data %>% 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
##   sepal_length_range
## 1             medium
## 2                low
## 3                low
## 4                low
## 5             medium
## 6             medium

Đến lúc này, câu hỏi đặt ra là: Làm thế nào để thêm nhiều biến cùng 1 lúc?

Câu trả lời là: Sử dùng nhóm hàm

  • mutate_all(): áp dụng đối với tất cả các biến trong tập dữ liệu

  • mutate_at(): chỉ áp dụng đối với những biến nhất định mà chúng ta chỉ định

  • mutate_if(): chỉ áp dụng đối với những biến thỏa mãn những điều kiện mà chúng ta đã đặt ra

Giả sử, chúng ta muốn thêm các biến mới về chiều dài/rộng cánh hoa và đài hoa của các loài hoa (đơn vị: mm thay vì ban đầu là cm) -> dùng hàm mutate_all()

iris %>% 
  # Bỏ biến Species vì chỉ có thể áp dụng đối với những biến số
  select(-Species) %>% 
  # Thêm những biến mới = những biến cũ nhân thêm 10 (tên biến lấy từ biến cũ thêm đuôi "_mm")
  mutate_all(funs(mm = . * 10)) %>% 
  head
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Sepal.Length_mm
## 1          5.1         3.5          1.4         0.2              51
## 2          4.9         3.0          1.4         0.2              49
## 3          4.7         3.2          1.3         0.2              47
## 4          4.6         3.1          1.5         0.2              46
## 5          5.0         3.6          1.4         0.2              50
## 6          5.4         3.9          1.7         0.4              54
##   Sepal.Width_mm Petal.Length_mm Petal.Width_mm
## 1             35              14              2
## 2             30              14              2
## 3             32              13              2
## 4             31              15              2
## 5             36              14              2
## 6             39              17              4

Trong trường hợp này, chúng ta cũng có thể dùng cách khác để chỉ áp dụng đối với những biến số (numeric) bằng việc sử dụng hàm mutate_if().

iris %>% 
  mutate_if(is.numeric,        # Lọc điều kiện: Chỉ áp dụng đối với những biến numeric
            funs(mm = . * 10)  # Các biến numeric sẽ nhân với 10 để lấy đơn vị mm
            ) %>% 
  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
##   Sepal.Length_mm Sepal.Width_mm Petal.Length_mm Petal.Width_mm
## 1              51             35              14              2
## 2              49             30              14              2
## 3              47             32              13              2
## 4              46             31              15              2
## 5              50             36              14              2
## 6              54             39              17              4

Nếu chúng ta chỉ muốn thêm những biến mà phái sinh từ biến Sepal.LengthSepal.Width thôi, thì có thể dùng hàm mutate_at()

iris %>% 
  mutate_at(c("Sepal.Length", "Sepal.Width"), # Tạo thêm những biến mới phái sinh từ những biến này
            funs(mm = . * 10)                
            ) %>% 
  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
##   Sepal.Length_mm Sepal.Width_mm
## 1              51             35
## 2              49             30
## 3              47             32
## 4              46             31
## 5              50             36
## 6              54             39

Như vậy, chúng ta đã vừa được học cách thêm nhiều biến cùng 1 lúc bằng việc sử dụng nhóm hàm mutate_if(), mutate_at(), mutate_all() trong dplyr. 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