Tác giả: Hoàng Đức Anh | 2019-05-05
Bài viết này tiếp nối series về ứng dụng của purrr
trong phân tích dữ liệu. Ở phần trước, chúng ta đã học về cách sử dụng map
. Trong bài viết này, Ranalytics
sẽ hướng dẫn các bạn sử dụng thêm 3 ứng dụng thường dùng của purrr
:
- Thay đổi biến với
modify
- Tạo các hàm khi sử dụng cùng map
- Tạo các chuỗi hàm với
compose
Sửa đổi giá trị với modify
Tương tự như map
, modify
cho áp dụng hàm vào một nhóm các list. Tuy nhiên, khác với map
, modify
cho ra kết quả với cấu trúc dữ liệu ban đâu.
library(tidyverse)
# map đổi cấu trúc của dataframe
iris %>%
map_if(is.factor, as.character) %>%
str
## List of 5
## $ Sepal.Length: num [1:150] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
## $ Sepal.Width : num [1:150] 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
## $ Petal.Length: num [1:150] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
## $ Petal.Width : num [1:150] 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
## $ Species : chr [1:150] "setosa" "setosa" "setosa" "setosa" ...
# modify giữ nguyên cấu trúc
iris %>%
modify_if(is.factor, as.character) %>%
str
## 'data.frame': 150 obs. of 5 variables:
## $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
## $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
## $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
## $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
## $ Species : chr "setosa" "setosa" "setosa" "setosa" ...
Tạo hàm nhanh với as_mapper
as_mapper
cho phép tạo hàm nhanh, đặc biệt hữu ích khi ta chỉ muốn tạo và sử dụng một hàm trong một vài trường hợp đặc biệt.
Công thức tổng quát
# Với một tham số
as_mapper(~f(.x))
# Với hai tham số
as_mapper(f(.x, .y))
Xem các ví dụ sau:
# Cộng 10 vào mỗi giá trị
map_dbl(1:3, ~ .x+10)
## [1] 11 12 13
# Cộng hai vector với nhau
map2_dbl(1:3, 5:7, ~.x + .y)
## [1] 6 8 10
# Cách viết khác
map2_dbl(1:3, 5:7, as_mapper(~.x + .y))
## [1] 6 8 10
Xây dựng chuỗi các hàm liên tiếp với compose
Hàm compose
cho phép kết hợp nhiều hàm với nhau với hàm ở bên phải là input đầu vào cho hàm bên trái. Cấu trúc như sau.
compose(f_2, f_1)
# Tương đương với
argument %>% f_2 %>% f_1
Xem ví dụ sau:
library(tidyverse)
library(broom)
lm(Sepal.Length ~ Sepal.Width, data = iris) %>%
tidy
## # A tibble: 2 x 5
## term estimate std.error statistic p.value
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 (Intercept) 6.53 0.479 13.6 6.47e-28
## 2 Sepal.Width -0.223 0.155 -1.44 1.52e- 1
Cách viết trên có thể thay thế như sau
tidy_lm <- compose(tidy, lm)
tidy_lm(Sepal.Length ~ Sepal.Width, data = iris)
## # A tibble: 2 x 5
## term estimate std.error statistic p.value
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 (Intercept) 6.53 0.479 13.6 6.47e-28
## 2 Sepal.Width -0.223 0.155 -1.44 1.52e- 1
Ta có thể thêm các nhóm hàm khác đi cùng với compose
như filter
my_func <- compose(
as_mapper(~filter(.x, p.value < 0.05)),
tidy,
lm)
my_func(Sepal.Length ~ Sepal.Width, data = iris)
## # A tibble: 1 x 5
## term estimate std.error statistic p.value
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 (Intercept) 6.53 0.479 13.6 6.47e-28
Như vậy, với bài viết này, chúng ta đã sử dụng được các hàm thường dùng nhất của purrr
là map
, modify
và compose
.
Chúc các bạn học tập và làm việc hiệu quả với Ranalytics.vn
!