R

Nga Hoang

2023-02-18

Cách tìm kiếm thông tin trong R

Tìm thông tin về một hàm :

?funtion_name

Tìm thông tin về một từ hoặc cụm từ :

help.search('weighted mean')

Tìm thông tin về một package :

help(package = 'package_name')

Đối tượng trong R

Tóm tắt về cấu trúc của đối tượng.
VD như data iris có sẵn trong R:

str(iris)
## '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     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

Tìm kiếm class của đối tượng:

class(iris)
## [1] "data.frame"

Sử dụng thư viện

Tải package về máy tính

R là một ngôn ngữ lập trình mạnh mẽ và linh hoạt với nhiều chức năng khác nhau, tuy nhiên, R không bao gồm tất cả các chức năng của mọi lĩnh vực. Thay vào đó, các chức năng này được cung cấp thông qua các package.
Khi tải xuống một package, bạn đang tải về tập hợp các hàm, dữ liệu, tài liệu hướng dẫn và các tài nguyên khác cần thiết để sử dụng package đó. Khi bạn muốn sử dụng một chức năng cụ thể, bạn cần chỉ định tên package và hàm tương ứng.

install.packages('package_name')

Gọi package để sử dụng:

library(package_name)

Sử dụng một hàm cụ thể thuộc một package:
Ví dụ, giả sử bạn có một data frame tên là my_data với các cột là name, age, gendersalary.

my_data <- data.frame( name = c('A','B','C'), age = c(22,20,30), gender =c('male','male','female'), salary = c(700,1000,500))
name age gender salary
A 22 male 700
B 20 male 1000
C 30 female 500

Bạn muốn chọn cột namesalary và lưu kết quả vào một biến mới có tên là my_selected_data. Bạn có thể sử dụng hàm select() như sau:

my_selected_data <- dplyr::select(my_data, name, salary)
name salary
A 700
B 1000
C 500

Hàm toán học

x <- c(1,3,5,7,7.67,7.4,21.875)
y <- c(1:7)
log(x) #Log
## [1] 0.000000 1.098612 1.609438 1.945910 2.037317 2.001480 3.085344
sum(x) #Tổng
## [1] 52.945
exp(x) #Hàm exp 
## [1] 2.718282e+00 2.008554e+01 1.484132e+02 1.096633e+03 2.143081e+03
## [6] 1.635984e+03 3.163674e+09
mean(x) #Giá trị trung bình.
## [1] 7.563571
max(x) #Giá trị lớn nhất 
## [1] 21.875
median(x) #Trung vị
## [1] 7
min(x) #Giá trị nhỏ nhất 
## [1] 1
quantile(x) #Phân vị x
##     0%    25%    50%    75%   100% 
##  1.000  4.000  7.000  7.535 21.875
round(x, 2) #Làm tròn đến n chữ số.(ở đây làm tròn 2 chữ số)
## [1]  1.00  3.00  5.00  7.00  7.67  7.40 21.88
var(x) #Phương sai
## [1] 45.94187
cor(x, y) #Hệ số tương quan
## [1] 0.8433928
sd(x) #Độ lệch chuẩn
## [1] 6.778043
m <- matrix(x, nrow = 3, ncol = 3)
library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.2 --
## v ggplot2 3.4.1      v purrr   0.3.5 
## v tibble  3.1.8      v dplyr   1.0.10
## v tidyr   1.2.1      v stringr 1.4.1 
## v readr   2.1.3      v forcats 0.5.2 
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()

tidyverse là một tập hợp các gói R được thiết kế để làm cho quá trình xử lý dữ liệu dễ dàng hơn, nhất quán hơn và trực quan hơn.

Gói tidyverse bao gồm các gói sau:

Cơ bản về dplyr

Lọc hàng với filter()

filter() cho phép bạn tập hợp con các quan sát dựa trên giá trị của chúng. Đối số đầu tiên là tên của khung dữ liệu. Các đối số thứ hai và tiếp theo là các biểu thức lọc khung dữ liệu.

flights <- nycflights13::flights

Ví dụ: chúng tôi có thể chọn tất cả các chuyến bay vào ngày 1 tháng 1 với:

filter(flights, month == 1, day == 1)
## # A tibble: 842 x 19
##     year month   day dep_time sched_de~1 dep_d~2 arr_t~3 sched~4 arr_d~5 carrier
##    <int> <int> <int>    <int>      <int>   <dbl>   <int>   <int>   <dbl> <chr>  
##  1  2013     1     1      517        515       2     830     819      11 UA     
##  2  2013     1     1      533        529       4     850     830      20 UA     
##  3  2013     1     1      542        540       2     923     850      33 AA     
##  4  2013     1     1      544        545      -1    1004    1022     -18 B6     
##  5  2013     1     1      554        600      -6     812     837     -25 DL     
##  6  2013     1     1      554        558      -4     740     728      12 UA     
##  7  2013     1     1      555        600      -5     913     854      19 B6     
##  8  2013     1     1      557        600      -3     709     723     -14 EV     
##  9  2013     1     1      557        600      -3     838     846      -8 B6     
## 10  2013     1     1      558        600      -2     753     745       8 AA     
## # ... with 832 more rows, 9 more variables: flight <int>, tailnum <chr>,
## #   origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>, hour <dbl>,
## #   minute <dbl>, time_hour <dttm>, and abbreviated variable names
## #   1: sched_dep_time, 2: dep_delay, 3: arr_time, 4: sched_arr_time,
## #   5: arr_delay

Khi chạy dòng mã đó, dplyr sẽ thực hiện thao tác lọc và trả về một khung dữ liệu mới. Các hàm dplyr không bao giờ sửa đổi đầu vào của chúng, vì vậy nếu bạn muốn lưu kết quả, bạn sẽ cần sử dụng toán tử gán <-

jan1 <- filter(flights, month == 1, day == 1)

So sánh

Để sử dụng lọc hiệu quả phải biết cách chọn các quan sát mà bạn muốn bằng cách sử dụng các toán tử so sánh. R cung cấp bộ tiêu chuẩn: >, >=, <, <=, !=(không bằng) và ==(bằng).

Toán tử logic

& là “và”
| là “hoặc”
! là “không”

Data visualization

“Biểu đồ đơn giản đã mang lại nhiều thông tin hơn cho tâm trí của nhà phân tích dữ liệu hơn bất kỳ thiết bị nào khác.” — John Tukey

Data VD

Dữ liệu tiết kiệm nhiên liệu từ 1999 đến 2008 cho 38 kiểu xe phổ biến
Data frame có 234 hàng và 11 biến:

manufacturer: tên nhà sản xuất

model: tên mẫu

displ: dung tích động cơ, tính bằng lít

year: năm sản xuất

cyl: số xi lanh

trans: loại truyền

drv: loại truyền động, trong đó f = dẫn động bánh trước, r = dẫn động bánh sau

cty: dặm thành phố trên mỗi gallon

hwy: dặm đường cao tốc trên mỗi gallon

fl: Loại nhiên liệu

class: loại xe hơi

ggplot2::mpg

Tạo một ggplot

ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy))

Đồ thị cho thấy mối quan hệ tỷ lệ nghịch giữa kích thước động cơ ( displ) và hiệu suất nhiên liệu ( hwy). Nói cách khác, những chiếc xe có động cơ lớn sẽ sử dụng nhiều nhiên liệu hơn.
Với ggplot2, bạn bắt đầu vẽ đồ thị bằng hàm ggplot(). ggplot()tạo một hệ tọa độ mà bạn có thể thêm các lớp vào. Đối số đầu tiên của ggplot() là tập dữ liệu sẽ sử dụng trong biểu đồ.
Bạn hoàn thành biểu đồ của mình bằng cách thêm một hoặc nhiều lớp vào ggplot(). Hàm geom_point() thêm một lớp điểm vào biểu đồ của bạn, tạo ra một biểu đồ phân tán. ggplot2 đi kèm với nhiều hàm geom, mỗi hàm thêm một loại lớp khác nhau vào biểu đồ.

Aesthetic mappings ( Ánh xạ thẩm mỹ)

“Giá trị lớn nhất của một bức tranh là khi nó buộc chúng ta phải chú ý đến những gì chúng ta không bao giờ muốn thấy.” — John Tukey

ggplot(data=mpg, mapping=aes(x=displ, y=hwy)) +
  geom_point() +
  geom_point(data=filter(mpg, displ > 5 & hwy > 20), colour="red", size=2.2)

Trong biểu đồ bên trên, một nhóm điểm (được tô màu đỏ) dường như nằm ngoài xu hướng tuyến tính. Những chiếc xe này có số dặm cao hơn mong đợi. Làm thế nào có thể giải thích những chiếc xe này?

Ví dụ có thể ánh xạ màu của các điểm tới biến class để hiển thị loại của từng ô tô.

ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy, color = class))

Màu sắc làm lộ ra những điểm bất thường là loại xe 2seater.
Trong ví dụ trên đã ánh xạ class tới thẩm mỹ màu sắc, nhưng ta có thể ánh xạ class tới thẩm mỹ kích thước theo cách tương tự. Trong trường hợp này, kích thước chính xác của mỗi điểm sẽ tiết lộ liên kết lớp của nó.

ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy, size = class))

#> Warning: Using size for a discrete variable is not advised.

Hoặc ta có thể đã ánh xạ class tới thẩm mỹ alpha , kiểm soát độ trong suốt của các điểm hoặc thẩm mỹ shape, kiểm soát hình dạng của các điểm.

ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy, alpha = class))

ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy, shape = class) )

Một cách khác, đặc biệt hữu ích cho các biến phân loại, là chia biểu đồ thành các biểu đồ con mà mỗi biểu đồ hiển thị một tập hợp con của dữ liệu.

ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy)) + 
  facet_wrap(~ class, nrow = 2)

Đối tượng hình học

Hai hình này giống nhau như thế nào?

ggplot(data=mpg) +
geom_point(mapping=aes(x=displ, y=hwy))

ggplot(data=mpg) +
geom_smooth(mapping=aes(x=displ, y=hwy))

Cả hai biểu đồ đều chứa cùng một biến x, cùng một biến y và cả hai đều mô tả cùng một dữ liệu. Mỗi biểu đồ sử dụng một đối tượng trực quan khác nhau để thể hiện dữ liệu.

Mọi hàm geom trong ggplot2 đều có một mapping đối số. Tuy nhiên, không phải thẩm mỹ nào cũng phù hợp với mọi geom. Bạn có thể đặt kiểu đường của một đường.

ggplot(data = mpg) + 
  geom_smooth(mapping = aes(x = displ, y = hwy, linetype = drv))

Ở đây geom_smooth() chia ô tô thành ba dòng dựa trên giá trị drv(mô tả hệ thống truyền động của ô tô). Một dòng mô tả tất cả các điểm có giá trị 4, một dòng mô tả tất cả các điểm có giá trị f và một dòng mô tả tất cả các điểm có giá trị r.
Để hiển thị nhiều geom trong cùng một biểu đồ, có thể thêm nhiều hàm geom vào ggplot():

ggplot(data = mpg) + 
    geom_point(mapping = aes(x = displ, y = hwy, color = drv)) +
    geom_smooth(mapping = aes(x = displ, y = hwy, linetype = drv))

Tuy nhiên, điều này cho thấy một số trùng lặp, nếu muốn thay đổi trục y để hiển thị cty thay vì hwy cần thay đổi biến ở hai nơi và có thể quên cập nhật một biến.
Có thể tránh kiểu lặp lại này bằng cách chuyển bộ ánh xạ tới ggplot(). ggplot2 sẽ coi những ánh xạ này là ánh xạ toàn cầu áp dụng cho mỗi geom trong biểu đồ.

ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) + 
  geom_point(mapping = aes(color = class)) + 
  geom_smooth()

Biến đổi thống kê

Tập dữ liệu diamonds chứa thông tin về ~54.000 viên kim cương, bao gồm price, carat, colorclarity của từng viên kim cương.

ggplot2::diamonds

Biểu đồ sau hiển thị tổng số viên kim cương trong tập dữ liệu diamonds, được nhóm theo cut. Biểu đồ cho thấy rằng có nhiều viên kim cương có vết cắt chất lượng cao hơn so với những viên kim cương có chất lượng thấp.

ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut,fill = cut))

Điều gì sẽ xảy ra nếu điền một biến khác vào ánh xạ thẩm mỹ , chẳng hạn như clarity. Các thanh được tự động xếp chồng lên nhau. Mỗi hình chữ nhật màu đại diện cho sự kết hợp của cutclarity.

ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut, fill = clarity))

position = "dodge" : đặt các đối tượng chồng chéo trực tiếp cạnh nhau. Điều này làm cho việc so sánh các giá trị riêng lẻ trở nên dễ dàng hơn.

ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut, fill = clarity), position = "dodge")

## Hệ tọa độ

coord_flip() chuyển đổi các trục x và y. Điều này rất hữu ích nếu muốn các ô vuông nằm ngang. Nó cũng hữu ích cho các labels dài: thật khó để làm cho chúng khớp với nhau mà không chồng lên nhau trên trục x.

ggplot(data = mpg, mapping = aes(x = class, y = hwy)) + 
  geom_boxplot()

ggplot(data = mpg, mapping = aes(x = class, y = hwy)) + 
  geom_boxplot() +
  coord_flip()

coord_quickmap() đặt tỷ lệ khung hình chính xác cho bản đồ. Điều này rất quan trọng nếu vẽ biểu đồ dữ liệu không gian bằng ggplot2

nz <- map_data("nz")

ggplot(nz, aes(long, lat, group = group)) +
  geom_polygon(fill = "white", colour = "black")

ggplot(nz, aes(long, lat, group = group)) +
  geom_polygon(fill = "white", colour = "black") +
  coord_quickmap()

coord_polar() sử dụng tọa độ cực. Tọa độ cực tiết lộ mối liên hệ giữa biểu đồ thanh và biểu đồ Coxcomb.

bar <- ggplot(data = diamonds) + 
  geom_bar(
    mapping = aes(x = cut, fill = cut), 
    show.legend = FALSE,
    width = 1
  ) + 
  theme(aspect.ratio = 1) +
  labs(x = NULL, y = NULL)

bar + coord_flip()

bar + coord_polar()