Nguyễn Anh Duy - Đinh Thanh Hoài
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
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.
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
Ở 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
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()
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_by và
select 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.
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
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.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
##
##
##
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)
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
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 ramutate_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
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
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
mutate_all(), mutate_if() hay
mutate_at()arrange()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
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()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
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
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>
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
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>
# 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
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
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
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
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")
Ở đâ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