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ệumutate_at()
: chỉ áp dụng đối với những biến nhất định mà chúng ta chỉ địnhmutate_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.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
## 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
!