Nguyễn Anh Duy - Đinh Thanh Hoài

1 Chương 1

1.1 giới thiệu về package dplyr

1.1.1 nguồn gốc

Package dplyr là một phần của ngôn ngữ lập trình R và được phát triển bởi nhóm dplyr trong dự án Tidyverse. Dự ánTidyverselà một tập hợp các gói phổ biến trong R, được thiết kế để cung cấp các công cụ mạnh mẽ và linh hoạt cho việc làm việc với dữ liệu. Dplyr được phát triển bởi Hadley Wickham và nhóm của ông, người đã đóng góp rất nhiều cho sự phát triển và mở rộng của ngôn ngữ R trong lĩnh vực dữ liệu và thống kê. Hadley Wickham là một nhà phân tích dữ liệu và là tác giả của nhiều gói phổ biến khác như ggplot2, tidyr và lubridate. Với tầm quan trọng và sự phát triển liên tục, dplyr đã trở thành một công cụ quan trọng trong cộng đồng R và đã được sử dụng rộng rãi trong các dự án phân tích dữ liệu và nghiên cứu.

ý nghĩa của cái tên dplyr đưuọc giải thích với chữ cái đầu tiên là d được viết tắt từ data.frame và còn từ plyr có thể được hiểu là cái kìm. khi ghép nối 2 ý nghĩa này lại với nhau ta có thể hiểu là package này là một công cụ để thao tác với khung dữ liệu

1.2 các tính năng của package

Dplyr cung cấp một tập hợp các công cụ mạnh mẽ và dễ sử dụng để thực hiện các thao tác cơ bản như lọc (filter), sắp xếp (arrange), chọn cột (select), tổng hợp (summarize), nhóm (group), và kết hợp (join) dữ liệu. sau đây là một số tính năng của package

  • Cú pháp dễ hiểu: Dplyr sử dụng cú pháp dễ đọc và dễ nhớ, giúp người dùng thực hiện các thao tác dữ liệu một cách dễ dàng và nhanh chóng.

  • Tính nhất quán: Các hàm trong dplyr thực hiện các thao tác dữ liệu một cách nhất quán, giúp người dùng dễ dàng áp dụng các thao tác lên các loại dữ liệu khác nhau như data frame, tibble hay database table.

  • Tốc độ xử lý nhanh: Dplyr được tối ưu hóa để hoạt động nhanh chóng trên các tập dữ liệu lớn. Các hàm trong dplyr được viết bằng C++, cho phép xử lý dữ liệu nhanh hơn so với các phương pháp truyền thống.

  • Tích hợp với các gói dữ liệu phổ biến: Dplyr tương thích với các gói dữ liệu phổ biến khác như tidyr, ggplot2, lubridate và nhiều gói khác, giúp người dùng dễ dàng kết hợp và xử lý dữ liệu theo nhiều cách khác nhau.

  • Hỗ trợ đa nguồn dữ liệu: Dplyr không chỉ hỗ trợ xử lý dữ liệu trong R, mà còn có khả năng làm việc trực tiếp với các nguồn dữ liệu bên ngoài như cơ sở dữ liệu SQL, Hadoop và các nguồn dữ liệu web.

1.3 Lí do chọn chủ đề

Khi học R thì đây là một công cụ để hỗ trợ cho việc thống kê cũng như trực quan hóa dữ liệu dễ dàng và mạnh mẽ hơn so với các ứng dụng phổ biến như excel hoặc eviews và để đánh giá được có thể trực quan hóa được dữ liệu thì ta cần xử lí dữ liệu. Vì thế nên việc dữ gói dplyrlà một một trong những lựa chọn tốt nhất vì package này sẽ hỗ trợ thư viện đẻ việc xử lí được đơn giản hơn. khả năng mạnh mẽ, Tính linh hoạt, cú pháp dễ sử dụng và sự hỗ trợ từ cộng đồng là những điều mà khiến do chúng em quyết định lựa chọn gói pakage này đẻ làm chủ đề viết nhằm giúp cho việc học tập cũng như là có thể làm tài liệu tham khảo cho những ai muốn tìm hiểu thêm về dplyr

2 Chương 2

Ở chương 2 chúng ta sẽ tìm hiểu về các hàm thường được sử dụng trong package dplyr để xử lí dữ liệu có thể đến như : - select _ group_by - filter _ arrange _ mutate _ summarise cùng với nhiều hàm khác nhưng ở dây chúng em sẽ nói rõ về những hàm thường được sử dụng và được cộng động sử dụng nhiều nhất

2.1 hàm select

Hàm select chúng ta có thể chọn ra các cột dữ liệu đẻ làm việc với chúng và để gọi được hàm select thi đầu tiên chúng ta cần gọi ra thư viện dplyr và sử dụng bộ dữ liệu iris để làm mẫu. Hàm select có thể kết hợp cùng với nhiều công thức khác như : - stars_with : dùng đẻ chọn ký tự đầu _ ends_with : dùng để chọn ký tự năm ở đuôi _ contains : dùng để chọn theo một ký tự mà ta mong muốn

library(dplyr)
## Warning: package 'dplyr' was built under R version 4.2.3
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(DT)
## Warning: package 'DT' was built under R version 4.2.3
datatable(iris)

tiếp theo chúng ta sẽ chọn ra 2 biến với tên là Sepal.Length và Sepal.Width

iris %>% select(Sepal.Length,Sepal.Width) %>% head
##   Sepal.Length Sepal.Width
## 1          5.1         3.5
## 2          4.9         3.0
## 3          4.7         3.2
## 4          4.6         3.1
## 5          5.0         3.6
## 6          5.4         3.9

với câu lệnh trên ta cùng với toán tử pipe ta có thể hiển thị ra 2 cột mà chúng ta muốn.Hoặc ta cũng có thể chọn những cột với có chữ đầu tiên theo ý ta muốn bằng việc sử dụng star_with như sau :

iris %>%
select(starts_with("Petal")) %>%
datatable()

Câu lệnh trên cho ta thấy được khi sử dụng star_with(“Petal”) thì *những cột có chữ đầu là Petal sẽ được chọn

iris %>%
select(ends_with("Width")) %>% datatable()

Ngược lại với stars_with thì ta sẽ có ends_with giúp ta chọn ra những cột có đuôi là Width sẽ được chọn và được in ra Đôi khi ta có thể chọn những cột theo một từ khóa nhất định chứ không phải là bắt đầu ở đuôi hay ở đầu bằng cách sử dụng select(contains()) việc sử dụng contains cho phép chọn ra cột có chứa từ khóa mà ta mong muốn

iris %>% select(contains("Petal")) %>%  datatable()

2.2 hàm group_by

Thì đây là một hàm khá quan trọng vì group_by giúp nhóm các dữ liệu lại với nhau để có thể dễ dàng xử lí theo từng nhóm. Vì vậy hàm group_by sẻ được sử dụng kết hợp với các hàm khác như summarize, mutate, filtter, … vv. Sau đây sẽ là vài ví dụ về group_by

iris %>%
  group_by(Species) %>% datatable()

ở đây khi ta chỉ group_by khong thì nó sẽ chỉ nhóm những dữu liệu thuộc nhóm Species vì vậy sau đây sẽ dùng thêm hàm summarize (hàm này giúp ta sơ lược hoặc tính toán các giá trị thống kê sẽ được dùng trong dữ liệu và sẽ được tìm hiểu kĩ hơn ở mục tiếp theo ) để giúp cho việc hiển thị được rõ hơn và giúp chúng ta hiểu thêm về hàm group_by

iris %>%
  group_by(Species) %>%
  summarise(mean(Sepal.Length), mean(Sepal.Width))
## # A tibble: 3 × 3
##   Species    `mean(Sepal.Length)` `mean(Sepal.Width)`
##   <fct>                     <dbl>               <dbl>
## 1 setosa                     5.01                3.43
## 2 versicolor                 5.94                2.77
## 3 virginica                  6.59                2.97

Trong ví dụ trên, chúng ta sử dụng lệnh group_by(Species) để nhóm các quan sát trong iris theo cột “Species”. Sau đó, chúng ta sử dụng lệnh summarise để tính giá trị trung bình của cột “Sepal.Length” và “Sepal.Width” trong mỗi nhóm.

iris %>%
  group_by(Species, Petal.Width) %>%
  summarise(mean(Sepal.Length))
## `summarise()` has grouped output by 'Species'. You can override using the
## `.groups` argument.
## # A tibble: 27 × 3
## # Groups:   Species [3]
##    Species    Petal.Width `mean(Sepal.Length)`
##    <fct>            <dbl>                <dbl>
##  1 setosa             0.1                 4.82
##  2 setosa             0.2                 4.97
##  3 setosa             0.3                 4.97
##  4 setosa             0.4                 5.3 
##  5 setosa             0.5                 5.1 
##  6 setosa             0.6                 5   
##  7 versicolor         1                   5.41
##  8 versicolor         1.1                 5.4 
##  9 versicolor         1.2                 5.78
## 10 versicolor         1.3                 5.88
## # ℹ 17 more rows

hoặc như ở đây ta có thể nhóm dữ liệu theo 2 cột đó là Species và Petal,Width để tính trung bình của Sepal.Length.

Đôi khi ta có thể nhầm lẫn về cách thức giữa group_byselect thì em xin giải thích mọt cách đơn giản là hàm group_by chỉ nhóm các dữ liệu lại còn hàm select thì sẽ họn các biến (cột) cần giữ lại hoặc loại bỏ khỏi tập dữ liệu.

2.3 hàm filter

filter được sử dụng để lọc (filter) các hàng (observations) trong tập dữ liệu dựa trên một hoặc nhiều điều kiện. VIệc sử dụng filter có thể lọc các dữ liệu theo nhiều kiểu khác nhau như là lọc theo tên, dựa theo các toán tử so sánh như ==, !=, <, >, <=, >=, hoặc là các hàm logic như & (và), | (hoặc), ! (phủ định). Tùy theo việc chúng ta muốn làm filter có thể lọc một cách đa đạng Lọc các bông hoa có độ dài cánh hoa lớn hơn 4.5 chẳng hạn

 iris %>%
  filter(Petal.Length > 4.5)
##    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
## 1           7.0         3.2          4.7         1.4 versicolor
## 2           6.9         3.1          4.9         1.5 versicolor
## 3           6.5         2.8          4.6         1.5 versicolor
## 4           6.3         3.3          4.7         1.6 versicolor
## 5           6.6         2.9          4.6         1.3 versicolor
## 6           6.1         2.9          4.7         1.4 versicolor
## 7           5.9         3.2          4.8         1.8 versicolor
## 8           6.3         2.5          4.9         1.5 versicolor
## 9           6.1         2.8          4.7         1.2 versicolor
## 10          6.8         2.8          4.8         1.4 versicolor
## 11          6.7         3.0          5.0         1.7 versicolor
## 12          6.0         2.7          5.1         1.6 versicolor
## 13          6.7         3.1          4.7         1.5 versicolor
## 14          6.1         3.0          4.6         1.4 versicolor
## 15          6.3         3.3          6.0         2.5  virginica
## 16          5.8         2.7          5.1         1.9  virginica
## 17          7.1         3.0          5.9         2.1  virginica
## 18          6.3         2.9          5.6         1.8  virginica
## 19          6.5         3.0          5.8         2.2  virginica
## 20          7.6         3.0          6.6         2.1  virginica
## 21          7.3         2.9          6.3         1.8  virginica
## 22          6.7         2.5          5.8         1.8  virginica
## 23          7.2         3.6          6.1         2.5  virginica
## 24          6.5         3.2          5.1         2.0  virginica
## 25          6.4         2.7          5.3         1.9  virginica
## 26          6.8         3.0          5.5         2.1  virginica
## 27          5.7         2.5          5.0         2.0  virginica
## 28          5.8         2.8          5.1         2.4  virginica
## 29          6.4         3.2          5.3         2.3  virginica
## 30          6.5         3.0          5.5         1.8  virginica
## 31          7.7         3.8          6.7         2.2  virginica
## 32          7.7         2.6          6.9         2.3  virginica
## 33          6.0         2.2          5.0         1.5  virginica
## 34          6.9         3.2          5.7         2.3  virginica
## 35          5.6         2.8          4.9         2.0  virginica
## 36          7.7         2.8          6.7         2.0  virginica
## 37          6.3         2.7          4.9         1.8  virginica
## 38          6.7         3.3          5.7         2.1  virginica
## 39          7.2         3.2          6.0         1.8  virginica
## 40          6.2         2.8          4.8         1.8  virginica
## 41          6.1         3.0          4.9         1.8  virginica
## 42          6.4         2.8          5.6         2.1  virginica
## 43          7.2         3.0          5.8         1.6  virginica
## 44          7.4         2.8          6.1         1.9  virginica
## 45          7.9         3.8          6.4         2.0  virginica
## 46          6.4         2.8          5.6         2.2  virginica
## 47          6.3         2.8          5.1         1.5  virginica
## 48          6.1         2.6          5.6         1.4  virginica
## 49          7.7         3.0          6.1         2.3  virginica
## 50          6.3         3.4          5.6         2.4  virginica
## 51          6.4         3.1          5.5         1.8  virginica
## 52          6.0         3.0          4.8         1.8  virginica
## 53          6.9         3.1          5.4         2.1  virginica
## 54          6.7         3.1          5.6         2.4  virginica
## 55          6.9         3.1          5.1         2.3  virginica
## 56          5.8         2.7          5.1         1.9  virginica
## 57          6.8         3.2          5.9         2.3  virginica
## 58          6.7         3.3          5.7         2.5  virginica
## 59          6.7         3.0          5.2         2.3  virginica
## 60          6.3         2.5          5.0         1.9  virginica
## 61          6.5         3.0          5.2         2.0  virginica
## 62          6.2         3.4          5.4         2.3  virginica
## 63          5.9         3.0          5.1         1.8  virginica

Lọc các bông hoa có độ rộng đài hoa nhỏ hơn 3 và loại bỏ các loài Iris-setosa:

iris %>%
  filter(Sepal.Width < 3, Species != "Iris-setosa")
##    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
## 1           4.4         2.9          1.4         0.2     setosa
## 2           4.5         2.3          1.3         0.3     setosa
## 3           5.5         2.3          4.0         1.3 versicolor
## 4           6.5         2.8          4.6         1.5 versicolor
## 5           5.7         2.8          4.5         1.3 versicolor
## 6           4.9         2.4          3.3         1.0 versicolor
## 7           6.6         2.9          4.6         1.3 versicolor
## 8           5.2         2.7          3.9         1.4 versicolor
## 9           5.0         2.0          3.5         1.0 versicolor
## 10          6.0         2.2          4.0         1.0 versicolor
## 11          6.1         2.9          4.7         1.4 versicolor
## 12          5.6         2.9          3.6         1.3 versicolor
## 13          5.8         2.7          4.1         1.0 versicolor
## 14          6.2         2.2          4.5         1.5 versicolor
## 15          5.6         2.5          3.9         1.1 versicolor
## 16          6.1         2.8          4.0         1.3 versicolor
## 17          6.3         2.5          4.9         1.5 versicolor
## 18          6.1         2.8          4.7         1.2 versicolor
## 19          6.4         2.9          4.3         1.3 versicolor
## 20          6.8         2.8          4.8         1.4 versicolor
## 21          6.0         2.9          4.5         1.5 versicolor
## 22          5.7         2.6          3.5         1.0 versicolor
## 23          5.5         2.4          3.8         1.1 versicolor
## 24          5.5         2.4          3.7         1.0 versicolor
## 25          5.8         2.7          3.9         1.2 versicolor
## 26          6.0         2.7          5.1         1.6 versicolor
## 27          6.3         2.3          4.4         1.3 versicolor
## 28          5.5         2.5          4.0         1.3 versicolor
## 29          5.5         2.6          4.4         1.2 versicolor
## 30          5.8         2.6          4.0         1.2 versicolor
## 31          5.0         2.3          3.3         1.0 versicolor
## 32          5.6         2.7          4.2         1.3 versicolor
## 33          5.7         2.9          4.2         1.3 versicolor
## 34          6.2         2.9          4.3         1.3 versicolor
## 35          5.1         2.5          3.0         1.1 versicolor
## 36          5.7         2.8          4.1         1.3 versicolor
## 37          5.8         2.7          5.1         1.9  virginica
## 38          6.3         2.9          5.6         1.8  virginica
## 39          4.9         2.5          4.5         1.7  virginica
## 40          7.3         2.9          6.3         1.8  virginica
## 41          6.7         2.5          5.8         1.8  virginica
## 42          6.4         2.7          5.3         1.9  virginica
## 43          5.7         2.5          5.0         2.0  virginica
## 44          5.8         2.8          5.1         2.4  virginica
## 45          7.7         2.6          6.9         2.3  virginica
## 46          6.0         2.2          5.0         1.5  virginica
## 47          5.6         2.8          4.9         2.0  virginica
## 48          7.7         2.8          6.7         2.0  virginica
## 49          6.3         2.7          4.9         1.8  virginica
## 50          6.2         2.8          4.8         1.8  virginica
## 51          6.4         2.8          5.6         2.1  virginica
## 52          7.4         2.8          6.1         1.9  virginica
## 53          6.4         2.8          5.6         2.2  virginica
## 54          6.3         2.8          5.1         1.5  virginica
## 55          6.1         2.6          5.6         1.4  virginica
## 56          5.8         2.7          5.1         1.9  virginica
## 57          6.3         2.5          5.0         1.9  virginica

Lọc các bông hoa có độ dài đài hoa (Sepal.Length) lớn hơn 6 và độ rộng cánh hoa (Petal.Width) lớn hơn 1, và chỉ giữ lại các cột “Species” và “Petal.Length”:

iris %>%
  filter(Sepal.Length > 6, Petal.Width > 1) %>%
  select(Species, Petal.Length)
##       Species Petal.Length
## 1  versicolor          4.7
## 2  versicolor          4.5
## 3  versicolor          4.9
## 4  versicolor          4.6
## 5  versicolor          4.7
## 6  versicolor          4.6
## 7  versicolor          4.7
## 8  versicolor          4.4
## 9  versicolor          4.5
## 10 versicolor          4.0
## 11 versicolor          4.9
## 12 versicolor          4.7
## 13 versicolor          4.3
## 14 versicolor          4.4
## 15 versicolor          4.8
## 16 versicolor          5.0
## 17 versicolor          4.7
## 18 versicolor          4.4
## 19 versicolor          4.6
## 20 versicolor          4.3
## 21  virginica          6.0
## 22  virginica          5.9
## 23  virginica          5.6
## 24  virginica          5.8
## 25  virginica          6.6
## 26  virginica          6.3
## 27  virginica          5.8
## 28  virginica          6.1
## 29  virginica          5.1
## 30  virginica          5.3
## 31  virginica          5.5
## 32  virginica          5.3
## 33  virginica          5.5
## 34  virginica          6.7
## 35  virginica          6.9
## 36  virginica          5.7
## 37  virginica          6.7
## 38  virginica          4.9
## 39  virginica          5.7
## 40  virginica          6.0
## 41  virginica          4.8
## 42  virginica          4.9
## 43  virginica          5.6
## 44  virginica          5.8
## 45  virginica          6.1
## 46  virginica          6.4
## 47  virginica          5.6
## 48  virginica          5.1
## 49  virginica          5.6
## 50  virginica          6.1
## 51  virginica          5.6
## 52  virginica          5.5
## 53  virginica          5.4
## 54  virginica          5.6
## 55  virginica          5.1
## 56  virginica          5.9
## 57  virginica          5.7
## 58  virginica          5.2
## 59  virginica          5.0
## 60  virginica          5.2
## 61  virginica          5.4

2.4 Hàm mutate

  • 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. Chúng ta có thể 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.
  • Ta sẽ ví dụ với 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).
install.packages("dplyr")
## Warning: package 'dplyr' is in use and will not be installed
library(dplyr)
library(knitr)
## Warning: package 'knitr' was built under R version 4.2.3
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  
##                 
##                 
## 
  • Để tạo thêm một biến mới trong tập dữ liệu 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 dữ liệu sau khi thêm biến mới
head(data)
##   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
  • Đôi khi trong việc phân tích dữ liệu ta cũng cần thêm không phải một mà là nhiều biến cùng một lúc để thuận tiện cho việc phân tích của chúng ta. Khi muốn thêm một lúc nhiều biến thì ta 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ì điều kiện chỉ có thể áp dụng với những biến số
select(-Species) %>% 
# Thêm những biến mới bằng 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
## Warning: `funs()` was deprecated in dplyr 0.8.0.
## ℹ Please use a list of either functions or lambdas:
## 
## # Simple named list: list(mean = mean, median = median)
## 
## # Auto named with `tibble::lst()`: tibble::lst(mean, median)
## 
## # Using lambdas list(~ mean(., trim = .2), ~ median(., na.rm = TRUE))
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
##   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 ta cũng có thể dùng cách khác để áp dụng đối với những biến số bằng việc sử dụng hàm mutate_if()
iris %>% 
  mutate_if(is.numeric,funs(mm = . * 10)) %>% 
  head
## Warning: `funs()` was deprecated in dplyr 0.8.0.
## ℹ Please use a list of either functions or lambdas:
## 
## # Simple named list: list(mean = mean, median = median)
## 
## # Auto named with `tibble::lst()`: tibble::lst(mean, median)
## 
## # Using lambdas list(~ mean(., trim = .2), ~ median(., na.rm = TRUE))
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
##   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 ta chỉ muốn thêm những biến phát 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
## Warning: `funs()` was deprecated in dplyr 0.8.0.
## ℹ Please use a list of either functions or lambdas:
## 
## # Simple named list: list(mean = mean, median = median)
## 
## # Auto named with `tibble::lst()`: tibble::lst(mean, median)
## 
## # Using lambdas list(~ mean(., trim = .2), ~ median(., na.rm = TRUE))
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
##   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 đối với việc thêm nhiều biến cùng lúc chúng ta sẽ dựa vào nhu cầu phân tích của mỗi người mà cân nhắc nên dùngmutate_all(), mutate_if() hay mutate_at()

2.5 Hàm arrange

  • Trong phân tích đôi khi chúng ta cũng cần sắp xếp dữ liệu theo một trật tự nào để để thuận tiện cho công việc phân tích dữ liệu của chúng ta. Để làm điều này chúng ta có thể sử dụng hàm arrange()
  • Với bộ dữ liệu iris ta sắp xếp theo thứ tự tăng dần của các biến Sepal.Length, Sepal.Width, Petal.Length
iris %>% 
  arrange(Sepal.Length, Sepal.Width, Petal.Length) %>% head
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          4.3         3.0          1.1         0.1  setosa
## 2          4.4         2.9          1.4         0.2  setosa
## 3          4.4         3.0          1.3         0.2  setosa
## 4          4.4         3.2          1.3         0.2  setosa
## 5          4.5         2.3          1.3         0.3  setosa
## 6          4.6         3.1          1.5         0.2  setosa
  • Hàm arrange() có thể được kết hợp với hàm desc(): hàm hỗ trợ để thể hiện dữ liệu theo chiều giảm dần (descending) để thực hiện được việc sắp xếp dữ liệu theo ý muốn của người dùng. Hàm desc() được dùng để bổ trợ cho hàm arrange()
  • Ví dụ sắp xếp theo cột Sepal.Length tăng dần, sau đó cột Sepal.Width giảm dần và cuối cùng là cột Petal.Length tăng dần
iris %>% 
  arrange(Sepal.Length, Sepal.Width%>%desc, Petal.Length) %>% head
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          4.3         3.0          1.1         0.1  setosa
## 2          4.4         3.2          1.3         0.2  setosa
## 3          4.4         3.0          1.3         0.2  setosa
## 4          4.4         2.9          1.4         0.2  setosa
## 5          4.5         2.3          1.3         0.3  setosa
## 6          4.6         3.6          1.0         0.2  setosa
  • Ví dụ khác của arrange
    • lấy dữ liệu từ bộ dữ liệu iris thỏa mãn Sepal.Width từ 3 đến 4 sau đó dữ liệu được sắp xếp lần lượt theo cột Sepal.Width (tăng dần) và cột Petal.Length (giảm dần)
iris %>%
  filter(Sepal.Width %>% between(3, 4)) %>%
  arrange(Sepal.Width, Petal.Length %>% desc) 
##    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
## 1           7.6         3.0          6.6         2.1  virginica
## 2           7.7         3.0          6.1         2.3  virginica
## 3           7.1         3.0          5.9         2.1  virginica
## 4           6.5         3.0          5.8         2.2  virginica
## 5           7.2         3.0          5.8         1.6  virginica
## 6           6.8         3.0          5.5         2.1  virginica
## 7           6.5         3.0          5.5         1.8  virginica
## 8           6.7         3.0          5.2         2.3  virginica
## 9           6.5         3.0          5.2         2.0  virginica
## 10          5.9         3.0          5.1         1.8  virginica
## 11          6.7         3.0          5.0         1.7 versicolor
## 12          6.1         3.0          4.9         1.8  virginica
## 13          6.0         3.0          4.8         1.8  virginica
## 14          6.1         3.0          4.6         1.4 versicolor
## 15          5.6         3.0          4.5         1.5 versicolor
## 16          5.4         3.0          4.5         1.5 versicolor
## 17          6.6         3.0          4.4         1.4 versicolor
## 18          5.9         3.0          4.2         1.5 versicolor
## 19          5.7         3.0          4.2         1.2 versicolor
## 20          5.6         3.0          4.1         1.3 versicolor
## 21          5.0         3.0          1.6         0.2     setosa
## 22          4.9         3.0          1.4         0.2     setosa
## 23          4.8         3.0          1.4         0.1     setosa
## 24          4.8         3.0          1.4         0.3     setosa
## 25          4.4         3.0          1.3         0.2     setosa
## 26          4.3         3.0          1.1         0.1     setosa
## 27          6.7         3.1          5.6         2.4  virginica
## 28          6.4         3.1          5.5         1.8  virginica
## 29          6.9         3.1          5.4         2.1  virginica
## 30          6.9         3.1          5.1         2.3  virginica
## 31          6.9         3.1          4.9         1.5 versicolor
## 32          6.7         3.1          4.7         1.5 versicolor
## 33          6.7         3.1          4.4         1.4 versicolor
## 34          4.8         3.1          1.6         0.2     setosa
## 35          4.6         3.1          1.5         0.2     setosa
## 36          4.9         3.1          1.5         0.1     setosa
## 37          4.9         3.1          1.5         0.2     setosa
## 38          7.2         3.2          6.0         1.8  virginica
## 39          6.8         3.2          5.9         2.3  virginica
## 40          6.9         3.2          5.7         2.3  virginica
## 41          6.4         3.2          5.3         2.3  virginica
## 42          6.5         3.2          5.1         2.0  virginica
## 43          5.9         3.2          4.8         1.8 versicolor
## 44          7.0         3.2          4.7         1.4 versicolor
## 45          6.4         3.2          4.5         1.5 versicolor
## 46          4.7         3.2          1.6         0.2     setosa
## 47          4.6         3.2          1.4         0.2     setosa
## 48          4.7         3.2          1.3         0.2     setosa
## 49          4.4         3.2          1.3         0.2     setosa
## 50          5.0         3.2          1.2         0.2     setosa
## 51          6.3         3.3          6.0         2.5  virginica
## 52          6.7         3.3          5.7         2.1  virginica
## 53          6.7         3.3          5.7         2.5  virginica
## 54          6.3         3.3          4.7         1.6 versicolor
## 55          5.1         3.3          1.7         0.5     setosa
## 56          5.0         3.3          1.4         0.2     setosa
## 57          6.3         3.4          5.6         2.4  virginica
## 58          6.2         3.4          5.4         2.3  virginica
## 59          6.0         3.4          4.5         1.6 versicolor
## 60          4.8         3.4          1.9         0.2     setosa
## 61          5.4         3.4          1.7         0.2     setosa
## 62          4.8         3.4          1.6         0.2     setosa
## 63          5.0         3.4          1.6         0.4     setosa
## 64          5.0         3.4          1.5         0.2     setosa
## 65          5.4         3.4          1.5         0.4     setosa
## 66          5.1         3.4          1.5         0.2     setosa
## 67          4.6         3.4          1.4         0.3     setosa
## 68          5.2         3.4          1.4         0.2     setosa
## 69          5.0         3.5          1.6         0.6     setosa
## 70          5.2         3.5          1.5         0.2     setosa
## 71          5.1         3.5          1.4         0.2     setosa
## 72          5.1         3.5          1.4         0.3     setosa
## 73          5.5         3.5          1.3         0.2     setosa
## 74          5.0         3.5          1.3         0.3     setosa
## 75          7.2         3.6          6.1         2.5  virginica
## 76          5.0         3.6          1.4         0.2     setosa
## 77          4.9         3.6          1.4         0.1     setosa
## 78          4.6         3.6          1.0         0.2     setosa
## 79          5.4         3.7          1.5         0.2     setosa
## 80          5.1         3.7          1.5         0.4     setosa
## 81          5.3         3.7          1.5         0.2     setosa
## 82          7.7         3.8          6.7         2.2  virginica
## 83          7.9         3.8          6.4         2.0  virginica
## 84          5.1         3.8          1.9         0.4     setosa
## 85          5.7         3.8          1.7         0.3     setosa
## 86          5.1         3.8          1.6         0.2     setosa
## 87          5.1         3.8          1.5         0.3     setosa
## 88          5.4         3.9          1.7         0.4     setosa
## 89          5.4         3.9          1.3         0.4     setosa
## 90          5.8         4.0          1.2         0.2     setosa

2.6 Hàm summarise

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ổng nhiều biến cùng lúc trong tập dữ liệu. Để xử lý vấn đề này chúng ta sử dụng nhóm hàm - summarise_all(): áp dụng đối với tất cả các biến trong tập dữ liệu - summarise_at(): chỉ áp dụng đối với những biến nhất định mà chúng ta chỉ định - summarise_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 xem trung bình chiều dài, rộng cánh hoa và đài hoa của từng loài hoa: setosa, versicolor, virginica -> dùng summarise_all()

iris %>%
  group_by(Species) %>%
  summarise_all(list(average = mean)) 
## # A tibble: 3 × 5
##   Species    Sepal.Length_average Sepal.Width_average Petal.Length_average
##   <fct>                     <dbl>               <dbl>                <dbl>
## 1 setosa                     5.01                3.43                 1.46
## 2 versicolor                 5.94                2.77                 4.26
## 3 virginica                  6.59                2.97                 5.55
## # ℹ 1 more variable: Petal.Width_average <dbl>
  • Nếu chúng ta chỉ muốn xem trung bình chiều dài, rộng của đài hoa của từng loài hoa ta sử dụng summarise_at()
iris %>%
  group_by(Species) %>%
  summarise_at(c("Sepal.Length", "Sepal.Width"),  list(average = mean))
## # A tibble: 3 × 3
##   Species    Sepal.Length_average Sepal.Width_average
##   <fct>                     <dbl>               <dbl>
## 1 setosa                     5.01                3.43
## 2 versicolor                 5.94                2.77
## 3 virginica                  6.59                2.97
  • Còn trong trường hợp, chúng ta muốn tổng hợp chỉ số mean của những biến số tadùng summarise_if()
iris %>%
  group_by(Species) %>%
  summarise_if(is.numeric,list(average = mean))
## # A tibble: 3 × 5
##   Species    Sepal.Length_average Sepal.Width_average Petal.Length_average
##   <fct>                     <dbl>               <dbl>                <dbl>
## 1 setosa                     5.01                3.43                 1.46
## 2 versicolor                 5.94                2.77                 4.26
## 3 virginica                  6.59                2.97                 5.55
## # ℹ 1 more variable: Petal.Width_average <dbl>

2.7 Toán tử

2.7.1 Toán tử foward pipe (%>%)

  • Toán tử “forward pipe” (còn được gọi là %>%) là một toán tử dùng để truyền dữ liệu từ một biểu thức đến một hàm khác theo hướng từ trái sang phải. Toán tử này giúp làm cho mã R trở nên dễ đọc hơn và giúp giảm bớt việc lồng nhau các hàm.
# Cài đặt và tải gói thư viện magrittr
library(magrittr)
## Warning: package 'magrittr' was built under R version 4.2.3
library(DT)
library(dplyr)

# Đọc dữ liệu airquality
data("airquality")

# Sử dụng toán tử forward pipe để thực hiện các hoạt động xử lý dữ liệu
processed_data <- airquality %>%
  filter(!is.na(Ozone)) %>%       # Loại bỏ các dòng có giá trị thiếu trong cột Ozone
  mutate(Temp_F = Temp * 9/5 + 32) %>%  # Thêm cột mới Temp_F tính theo độ F
  select(Month, Day, Temp_F, Ozone)    # Chọn các cột cần thiết

# Hiển thị dữ liệu đã xử lý
head(processed_data)
##   Month Day Temp_F Ozone
## 1     5   1  152.6    41
## 2     5   2  161.6    36
## 3     5   3  165.2    12
## 4     5   4  143.6    18
## 5     5   6  150.8    28
## 6     5   7  149.0    23

2.7.2 Toán tử T pipe (%T>%)

  • Toán tử T pipe có thể được hình dung như 1 ống nước hình chữ T, khiến cho dữ liệu đầu vào của 1 hàm A đi trước sẽ được truyền cho 2 nhánh tương ứng với quy trình B1 (là 1 hàm) và quy trình B2
rnorm(100,10,1)%T>% # Tạo tập hợp gồm 100 số ngẫu nhiên theo phân phối chuẩn với mean là 10 và sd là 1
  ts.plot(col="red")%>% # Tạo ra biểu đồ chuỗi thời gian (time series plot) của dãy số ngẫu nhiên đã tạo
  density()%>% # Tính toán mật độ xác suất của dãy số ngẫu nhiên đã tạo
  plot(col="blue","densityplot") # Tạo ra biểu đồ mật độ xác suất (density plot) cho dãy số ngẫu nhiên đã tính toán 

2.7.3 toán tử %<>%

toán tử “Assigning pipe” %<>% là một toán tử đặc biệt cho phép bạn thực hiện các thao tác trên một đối tượng và gán kết quả trở lại chính đối tượng đó, thay vì tạo một đối tượng mới như khi sử dụng toán tử %>%.

Để minh họa, chúng ta có thể sử dụng toán tử “Assigning pipe” %<>% để thực hiện một số biến đổi trên dataset “airquality”. Dataset này được tích hợp sẵn trong R và chứa các thông tin về chất lượng không khí tại thành phố New York trong mùa hè năm 1973.

Ví dụ dưới đây trình bày cách sử dụng toán tử “Assigning pipe” %<>% để thực hiện các biến đổi trên dataset “airquality”:

library(magrittr)
library(dplyr)

data("airquality")

airquality %<>% 
 filter(!is.na(Ozone)) %>%
 mutate(SumTemp = Temp + Wind)  
head(airquality)
##   Ozone Solar.R Wind Temp Month Day SumTemp
## 1    41     190  7.4   67     5   1    74.4
## 2    36     118  8.0   72     5   2    80.0
## 3    12     149 12.6   74     5   3    86.6
## 4    18     313 11.5   62     5   4    73.5
## 5    28      NA 14.9   66     5   6    80.9
## 6    23     299  8.6   65     5   7    73.6

2.7.4 toán tử %$%

toán tửu này cho phép bạn truy cập và sử dụng các biến bên trong một đối tượng dữ liệu một cách dễ dàng và ngắn gọn. Nó giúp viết mã dễ đọc hơn và tránh phải lặp lại tên đối tượng nhiều lần khi làm việc với nhiều biến trong một đối tượng dữ liệu.

library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.2.3
## Warning: package 'ggplot2' was built under R version 4.2.3
## Warning: package 'tibble' was built under R version 4.2.3
## Warning: package 'tidyr' was built under R version 4.2.3
## Warning: package 'readr' was built under R version 4.2.3
## Warning: package 'purrr' was built under R version 4.2.3
## Warning: package 'stringr' was built under R version 4.2.3
## Warning: package 'forcats' was built under R version 4.2.3
## Warning: package 'lubridate' was built under R version 4.2.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.0     ✔ readr     2.1.4
## ✔ ggplot2   3.4.2     ✔ stringr   1.5.0
## ✔ lubridate 1.9.2     ✔ tibble    3.2.1
## ✔ purrr     1.0.1     ✔ tidyr     1.3.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ tidyr::extract()   masks magrittr::extract()
## ✖ dplyr::filter()    masks stats::filter()
## ✖ dplyr::lag()       masks stats::lag()
## ✖ purrr::set_names() masks magrittr::set_names()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(magrittr)
df <- data.frame(x = c(1, 2, 3, 4, 5),
                 y = c(10, 20, 30, 40, 50))

# Sử dụng exposition pipe-operator %$% để tính tổng cột x và cột y
result <- df %$% {
  sum_x <- sum(x)
  sum_y <- sum(y)
  total_sum <- sum_x + sum_y
  return(total_sum)
}

print(result)
## [1] 165

3 Chương 3: Ứng dụng của package dplyr

3.1 data ChickWeight

data("ChickWeight")
library(dplyr)
library(DT)
average_weight <- ChickWeight %>%
  group_by(Diet) %>%
  summarise(AvgWeight = mean(weight))

print(average_weight)
## # A tibble: 4 × 2
##   Diet  AvgWeight
##   <fct>     <dbl>
## 1 1          103.
## 2 2          123.
## 3 3          143.
## 4 4          135.
library(ggplot2)
ggplot(average_weight, aes(x = factor(Diet), y = AvgWeight)) +
  geom_col(fill = "skyblue") +
  labs(title = "Trung bình cân nặng theo chế độ dinh dưỡng",
       x = "Chế độ dinh dưỡng",
       y = "Trung bình cân nặng")

3.2 data diamond

Ở đây chúng ta sẽ dùng data diamonds thuộc package ggplot2 để phân tích

library(dplyr)
library(DT)
library(ggplot2)
datatable(diamonds)
## Warning in instance$preRenderHook(instance): It seems your data is too big for
## client-side DataTables. You may consider server-side processing:
## https://rstudio.github.io/DT/server.html

bằng cách dùng hàm summarize ta sẽ tính ra các chỉ số thống kê về giá của kim cương

diamonds  %>% summarize(mean = mean(price),
                         sd = sd(price),
                         min = min(price),
                         max= max(price),
                         n = n())
## # A tibble: 1 × 5
##    mean    sd   min   max     n
##   <dbl> <dbl> <int> <int> <int>
## 1 3933. 3989.   326 18823 53940

hoặc ta có thể tính các thống kê theo màu sắc ta muốn bằng group_by

diamonds %>% group_by(color) %>% 
          summarize(mean_price = mean(price),
            sd_price = sd(price),
            min_price = min(price),
            max_price = max(price),
            n_rows = n()) %>% head(10)
## # A tibble: 7 × 6
##   color mean_price sd_price min_price max_price n_rows
##   <ord>      <dbl>    <dbl>     <int>     <int>  <int>
## 1 D          3170.    3357.       357     18693   6775
## 2 E          3077.    3344.       326     18731   9797
## 3 F          3725.    3785.       342     18791   9542
## 4 G          3999.    4051.       354     18818  11292
## 5 H          4487.    4216.       337     18803   8304
## 6 I          5092.    4722.       334     18823   5422
## 7 J          5324.    4438.       335     18710   2808

hoặc theo màu sắc và vết cắt

diamonds%>%group_by(color, cut) %>% 
  summarize(mean_price = mean(price),
            sd_price = sd(price),
            min_price = min(price),
            max_price = max(price),
            n_rows = n()) %>% head(10)
## `summarise()` has grouped output by 'color'. You can override using the
## `.groups` argument.
## # A tibble: 10 × 7
## # Groups:   color [2]
##    color cut       mean_price sd_price min_price max_price n_rows
##    <ord> <ord>          <dbl>    <dbl>     <int>     <int>  <int>
##  1 D     Fair           4291.    3286.       536     16386    163
##  2 D     Good           3405.    3175.       361     18468    662
##  3 D     Very Good      3470.    3524.       357     18542   1513
##  4 D     Premium        3631.    3712.       367     18575   1603
##  5 D     Ideal          2629.    3001.       367     18693   2834
##  6 E     Fair           3682.    2977.       337     15584    224
##  7 E     Good           3424.    3331.       327     18236    933
##  8 E     Very Good      3215.    3408.       352     18731   2400
##  9 E     Premium        3539.    3795.       326     18477   2337
## 10 E     Ideal          2598.    2956.       326     18729   3903