Biến đổi dữ liệu nâng cao trong purrr

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 purrrmap, modifycompose.

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