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, mình 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 sepal_length_range
## 1 5.1 3.5 1.4 0.2 setosa medium
## 2 4.9 3.0 1.4 0.2 setosa low
## 3 4.7 3.2 1.3 0.2 setosa low
## 4 4.6 3.1 1.5 0.2 setosa low
## 5 5.0 3.6 1.4 0.2 setosa medium
## 6 5.4 3.9 1.7 0.4 setosa 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 Sepal.Length_mm
## 1 5.1 3.5 1.4 0.2 setosa 51
## 2 4.9 3.0 1.4 0.2 setosa 49
## 3 4.7 3.2 1.3 0.2 setosa 47
## 4 4.6 3.1 1.5 0.2 setosa 46
## 5 5.0 3.6 1.4 0.2 setosa 50
## 6 5.4 3.9 1.7 0.4 setosa 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
Nếu chúng ta chỉ muốn thêm những biến mà phái sinh từ biến
Sepal.Length và Sepal.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 Sepal.Length_mm
## 1 5.1 3.5 1.4 0.2 setosa 51
## 2 4.9 3.0 1.4 0.2 setosa 49
## 3 4.7 3.2 1.3 0.2 setosa 47
## 4 4.6 3.1 1.5 0.2 setosa 46
## 5 5.0 3.6 1.4 0.2 setosa 50
## 6 5.4 3.9 1.7 0.4 setosa 54
## Sepal.Width_mm
## 1 35
## 2 30
## 3 32
## 4 31
## 5 36
## 6 39
Như vậy, mình vừa chia sẻ 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().
Chúc các bạn học tập và làm việc hiệu quả!