Làm quen với R

Liên hệ:


Cài đặt R và RStudio

Tải R tại trang chủ The Comprehensive R Archive Network tại đây: https://cran.r-project.org/

Tải RStudio tại trang chủ https://www.rstudio.com/

Hoặc xem video hướng dẫn cài đặt R và RStudio cho hệ điều hành Window tại đây.

Bạn có thể sử dụng miễn phí RStudio phiên bản cloud tại địa chỉ: https://rstudio.cloud/

Video hướng dẫn sử dụng RStudio Cloud tại đây.

Khởi động RStudio và bắt đầu làm quen

Xem giới thiệu giao diện của RStudio tại đây.

R script, R Markdown và R Notebook

Thay vì tương tác với R qua console của R, ta có 3 các khác để viết lệnh:

  • Dùng R script

  • Dùng R Markdown

  • Dùng R Notebook

R script giúp soạn thảo văn bản (viết mã R) giống như chương trình soạn thảo văn bản thông thường. Bạn sử dụng để viết lệnh thoải mái hơn trong console (chỉ có 1 dòng) và có thể lưu lại để dùng sau này.

R Mardown tương tự R script, tuy nhiên nó giúp trình bày nôi dung chuyên nghiệp hơn, có thể xuất ra nhiều định dạng khác nhau (html, pdf, word) để phục vụ báo cáo, chia sẽ cho đồng nghiệp.

R Notebook tương tự như R Markdown, tuy nhiên bạn có thể chạy lệnh R ngay trên file R Notebook.

Toàn bộ chương trình sẽ sử dụng R script để hướng dẫn học viên.

(Bài này được soạn ra trên R Markdown đấy!)

Chú thích trong R script

Trước khi dùng R script, bạn cần biết rằng R là ngôn ngữ lập trình. Vì vậy sẽ rất khó để đọc hiểu lệnh, đặc biệt khi bạn không phải là dân chuyên lập trình nữa.

Vì vậy, chú thích trong mỗi đoạn script giúp bạn dễ hiểu hơn, nhớ lại những gì mình đã làm cũng như đọc script của người khác dễ hơn.

Chú thích trong R bắt đầu bằng dấu # cho từng dòng

# Đây là đoạn chú thích cho phép tính 1+1
1+1
## [1] 2

R không hỗ trợ chú thích nhiều dòng hay đoạn văn, vì vậy bạn phải dùng dấu # ở đầu mỗi dòng chú thích.

# Đây là đoạn chú thích
# cho phép tính 1+1
1+1
## [1] 2

Thư viện trong R

Thư viện là gì

Thư viện là tập hợp các câu lệnh, chương trình được viết sẵn để người dùng sử dụng lại mà không cần phải viết mã lại từ đầu.

Hiểu cách khác, thư viện chính là một nhà kho chứa các công cụ làm việc. Khi nào cần dùng đến công cụ nào thì vào nhà kho đó lấy ra.

Thư viện trong R gọi là package.

Cách tải cài đặt thư viện

Mỗi package chỉ cần cài đặt 1 lần trên mỗi máy tính bằng lệnh install.packages(‘tên_thư_viện’)

(Có thể thay thế dấu nháy đơn ’ ’ bằng dấu nháy kép ” ” đều được)

Nếu máy tính bạn đã cài các packages đó, khi chạy lại lệnh trên, R sẽ cập nhật các packages này.
Có thể cài packages trong RStudio bằng các vào Tools > Install Packages … rồi chọn tên packages cần cài đặt.

Cách sử dụng thư viện

Cách 1

Trước khi sử dụng câu lệnh nào trong package nào thì bạn phải khai báo package đó cho R biết. Lệnh library(tên_thư_viện) giúp khai báo thư viện:

# Khai báo thư viện dplyr
library(dplyr)
# Sau khi khai báo, 
# ta có thể thoải mái sử dụng các câu lệnh trong dplyr
# Ví dụ: sử dụng hàm arrange()
arrange()

# Sử dụng pipeline %>% 
1+1 %>% sum(2)

Cách 2

Bạn có thể không cần khai báo thư viện, thay vào đó bạn sử dụng cú pháp tên_thư_viện::tên_hàm. Ví dụ

# dplyr::arrange()

(Trong trường hợp máy tính bạn có 2 hàm có tên trùng nhau nằm trong 2 thư viện bạn khai báo, thì bạn phải dùng cách 2 này để chỉ ra cho R hiểu bạn muốn dùng hàm trong thư viện nào)

Giá trị (value)

Giá trị trong R có 2 dạng cơ bản sau:

  • Số (numeric): 1, 2, 3, 2.2, 2.4,…
  • Chuỗi ký tự (character): ‘a’, ‘C’, “cái gì”, “con gì”,… Chuỗi ký tự trong R được ngăn cách bởi ’’ hoặc ““.

(Những dạng khác sẽ chưa đề cập ở đây như NA, date, time,…)

# Giá trị số
1
## [1] 1
# Giá trị chuỗi ký tự
"1"
## [1] "1"

Lệnh gán (assignment)

Khi muốn lưu trữ 1 giá trị nào đó vào một đối tượng trong R (biến, ma trận, data frame,…), ta dùng lệnh gán. Có 3 loại lệnh gán:

  • =
  • <- và ->
  • <<- và ->>

Dấu = thường dùng cho dân lập trình. Nó có nghĩa là gán giá trị ở bên phải dấu = cho đối tượng ở bên trái dấu =.

# Lưu năm học vào biến year
year = 2022

# Sau này cần dụng lại năm học, ta chỉ cần gọi year là được
year
## [1] 2022

Nếu bạn không phải là dân lập trình, nên ưu tiên dùng 2 dấu <- và -> vì nó dễ đọc hơn. Hai dấu này lưu giá trị vào đối tượng nằm cùng chiều mũi tên.

# Lưu năm học vào biến year
# Cách 1
year <- 2022

# Cách 2
2022 -> year

# Sau này cần dụng lại năm học, ta chỉ cần gọi year là được
year
## [1] 2022

Hai dấu còn lại <<- và ->> dùng khi bạn đang ở trong môi trường cục bộ (local environment) mà muốn truy suất giá trị ở môi trường chung (global environment), ví dụ khi đang ở trong for_loop chẳng hạn. Mới dùng R thì bạn không cần biết quá nhiều về 2 dấu này.

Biến (vector, variable)

Khi bạn muốn lưu trữ tập hợp nhiều giá trị giống nhau về kiểu dữ liệu. Các bạn sẽ sử dụng biến để chứa dữ liệu. (Chúng ta sẽ gọi biến là vector khi dùng R nhé!)

Vector được tạo bởi hàm c(…), trong đó … là các giá trị cần lưu trữ.

# Thu nhập trong 3 tháng đầu tiên đi làm
thu_nhap <- c(1000, 2000, 3000)

# Tên của 4 người bạn thân nhất trong lớp
ten <- c("Trí", "Dũng", "Phú", "Vân")

# Xem lại 2 vector trên
thu_nhap
## [1] 1000 2000 3000
ten
## [1] "Trí"  "Dũng" "Phú"  "Vân"

Lưu ý: Tên của vector cũng như tên các đối tượng khác trong R, phải bắt đầu bằng chữ cái, chứa chữ cái latin, phân biệt viết hoa và viết thường, số hoặc dấu gạch dưới _.

Các ví dụ đặt tên vector sai: 1nam, năm_học, m/kg2

Ma trận (matrix)

Ma trận tương tự với vector, nhưng nó sẽ chia ra số hàng và số cột (vector chỉ sắp xếp dữ liệu theo 1 hàng ngang).

Ví dụ bạn muốn tạo 1 ma trận gồm 9 chữ cái xếp thành 3 cột và 3 hàng như sau A D G B E H C F I Ta dùng hàm matrix(data, nrow, ncol), với:

  • data: vector chứa dữ liệu
  • nrow: Số hàng
  • ncol: Số cột
du_lieu = c('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I')
tao_ma_tran <- matrix(du_lieu, nrow = 3, ncol = 3)
tao_ma_tran
##      [,1] [,2] [,3]
## [1,] "A"  "D"  "G" 
## [2,] "B"  "E"  "H" 
## [3,] "C"  "F"  "I"

Nếu bạn hứng thú với pipeline (%>%) thì câu lệnh trên có thể viết lại như sau

c('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I') %>% 
  matrix(nrow = 3, ncol = 3)
##      [,1] [,2] [,3]
## [1,] "A"  "D"  "G" 
## [2,] "B"  "E"  "H" 
## [3,] "C"  "F"  "I"

Tập số liệu (data frame)

Tương tự matrix, data frame cũng có hàng và cột.

Data frame chính là kiểu dữ liệu quen thuộc nhất với chúng ta. Tương tự một trang tính trong Excel chẳng hạn, mỗi cột của data frame chính là một biến, mỗi hàng là một trường hợp quan sát (case, observation).

Các biến trong data frame phải có cùng số lượng giá trị.

Tạo data frame

Ví dụ ta có 3 biến sau

# Tên bệnh nhân
ten <- c("Lê Văn A", "Nguyễn Thị B", "Phạm Văn C")

# Tuổi
tuoi <- c(36, 38, 40)

# Nghề nghiệp 
nghe_nghiep <- c('Bác sỹ', 'Kỹ sư', 'Nhà đầu tư')

Để tạo data frame từ 3 biến trên, ta dùng lệnh data.frame()

tap_du_lieu = data.frame(ten, tuoi, nghe_nghiep)
tap_du_lieu
##            ten tuoi nghe_nghiep
## 1     Lê Văn A   36      Bác sỹ
## 2 Nguyễn Thị B   38       Kỹ sư
## 3   Phạm Văn C   40  Nhà đầu tư

Tên của biến trong data frame

Tên của biến trong data frame được đặt thoải mái hơn tên của đối tượng trong R (ví dụ ta có thể đặt tên bằng tiếng Việt có dấu). Tuy vậy, các bạn vẫn nên đặt tên theo quy định để câu lệnh nhìn chuyên nghiệp và dễ đọc hơn.

Xem lại tên của biến bằng hàm names(dataframe):

names(tap_du_lieu)
## [1] "ten"         "tuoi"        "nghe_nghiep"

Đổi toàn bộ tên của data frame bằng tên khác mà bạn muốn:

# Đổi tên biến trong data frame tap_du_lieu
names(tap_du_lieu) <-  c('Tên', 'Tuổi', 'Nghề nghiệp')

# Xem lại kết quả
tap_du_lieu
##            Tên Tuổi Nghề nghiệp
## 1     Lê Văn A   36      Bác sỹ
## 2 Nguyễn Thị B   38       Kỹ sư
## 3   Phạm Văn C   40  Nhà đầu tư

Bạn có thể tự động đổi tên biến theo chuẩn quy định bằng hàm clean_names() trong package janitor

# Tự động đổi tên theo quy chuẩn
tap_du_lieu %>% janitor::clean_names()
##            ten tuoi nghe_nghiep
## 1     Lê Văn A   36      Bác sỹ
## 2 Nguyễn Thị B   38       Kỹ sư
## 3   Phạm Văn C   40  Nhà đầu tư
# Lưu kết quả vào data fram khác, tạm gọi là df
tap_du_lieu %>% janitor::clean_names() -> df

Thao tác với dữ liệu trong data frame

Vì hiện nay, cấu trúc dữ liệu trong R “cổ điển”, tạm gọi là R classic, đang dẩn được thay thế bởi tidyverse. Về cơ bản, cấu trúc dữ liệu của R classic mang thiên hướng lập trình nhiều, do đó làm khó khăn cho các nhà nghiên cứu khi sử dụng R. Tidyverse được tạo ra, là tổng hợp nhiều packages, giúp giảm thiên hướng lập trình của ngôn ngữ R khiến cho các nhà nghiên cứu, nhà khoa học dữ liệu dễ dàng cấu trúc và sử dụng dữ liệu hơn. Bạn có thể tìm hiểu thêm vể tidyverse tại đây.

Package dplyr được dùng ở trên, là 1 trong số packages của tidyverse.

Bài này sẽ hướng dẫn bạn cả R classicR tidyverse. Các bạn có thể chọn cách nào phù hợp với mình nhất để sử dụng. Ad thì phối hợp cả 2 trong thực tế làm việc.

Gọi biến trong data frame

R classic

# Cách 1: gọi 1 biến bằng dấu $
## data_frame$tên_biến
df$nghe_nghiep
## [1] "Bác sỹ"     "Kỹ sư"      "Nhà đầu tư"
# Cách 2: gọi 1 biến biến bằng dấu [[]]
## data_frame[[số_thứ_tự_của_biến]]
df[[3]]
## [1] "Bác sỹ"     "Kỹ sư"      "Nhà đầu tư"
# Cách 3: gọi 1 hoặc nhiều biến bằng [, ]
## data_frame[, số_thứ_tự_của_biến]
df[, 3]
## [1] "Bác sỹ"     "Kỹ sư"      "Nhà đầu tư"
## gọi nhiểu biến
df[, c(2,3)]
##   tuoi nghe_nghiep
## 1   36      Bác sỹ
## 2   38       Kỹ sư
## 3   40  Nhà đầu tư

data_frame[, ] hiểu đầy đủ là data_frame[rows, cols]. Trong đó rows là số hàng, cols là số cột. Bỏ trống giá trị nào tức là lấy toàn bộ. Ở ví dụ của ta đã bỏ trống giá trị rows, có nghĩa là lấy toàn bộ các hàng.

R tidyverse

# Dùng hàm select trong package dplyr
## Nhớ khai báo thư viện dplyr hoặc tidyverse trước khi làm nhé
df %>% select(nghe_nghiep)
##   nghe_nghiep
## 1      Bác sỹ
## 2       Kỹ sư
## 3  Nhà đầu tư
## Chọn nhiều biến
df %>% select(tuoi, nghe_nghiep)
##   tuoi nghe_nghiep
## 1   36      Bác sỹ
## 2   38       Kỹ sư
## 3   40  Nhà đầu tư

Tạo thêm/Xoá bỏ biến trong data frame

R classic

# Tạo biến mới là tuổi sau 2 năm của mỗi người
df$tuoi_sau_2_nam = df$tuoi + 2

# Xem kết quả
df
##            ten tuoi nghe_nghiep tuoi_sau_2_nam
## 1     Lê Văn A   36      Bác sỹ             38
## 2 Nguyễn Thị B   38       Kỹ sư             40
## 3   Phạm Văn C   40  Nhà đầu tư             42
# Xoá biến tuổi ban đầu
df[, -2] # Tương tự cách chọn biến, nhưng nếu đặt dấu trừ bên trước tức là bỏ biến đó
##            ten nghe_nghiep tuoi_sau_2_nam
## 1     Lê Văn A      Bác sỹ             38
## 2 Nguyễn Thị B       Kỹ sư             40
## 3   Phạm Văn C  Nhà đầu tư             42

R tidyverse

# Tạo biến mới là tuổi sau 2 năm của mỗi người bằng mutate()
df <- df %>% 
  mutate(tuoi_sau_2_nam = tuoi + 2)
df
##            ten tuoi nghe_nghiep tuoi_sau_2_nam
## 1     Lê Văn A   36      Bác sỹ             38
## 2 Nguyễn Thị B   38       Kỹ sư             40
## 3   Phạm Văn C   40  Nhà đầu tư             42
# Xoá biến tuổi ban đầu bằng select()
df %>% select(-tuoi)  # Cũng dùng dấu trừ để loại bỏ biến đi
##            ten nghe_nghiep tuoi_sau_2_nam
## 1     Lê Văn A      Bác sỹ             38
## 2 Nguyễn Thị B       Kỹ sư             40
## 3   Phạm Văn C  Nhà đầu tư             42

Gọi trường hợp quan sát

R classic

# Xem các thông tin của người  đầu tiên
df[1, ]
##        ten tuoi nghe_nghiep tuoi_sau_2_nam
## 1 Lê Văn A   36      Bác sỹ             38
# Xoá người này ra khỏi data frame
df[-1, ]
##            ten tuoi nghe_nghiep tuoi_sau_2_nam
## 2 Nguyễn Thị B   38       Kỹ sư             40
## 3   Phạm Văn C   40  Nhà đầu tư             42

R tidyverse

# Sử dụng slice() trong dplyr để chọn người đầu tiên
df %>% slice(1)
##        ten tuoi nghe_nghiep tuoi_sau_2_nam
## 1 Lê Văn A   36      Bác sỹ             38
# Xoá người này ra khỏi data frame
df %>% slice(-1)
##            ten tuoi nghe_nghiep tuoi_sau_2_nam
## 1 Nguyễn Thị B   38       Kỹ sư             40
## 2   Phạm Văn C   40  Nhà đầu tư             42

Danh sách (list)

Tương tự với vector, list cũng chứa tập hợp nhiều đối tượng. Tuy nhiên các đố tượng này không cần giống nhau về kiểu dữ liệu.

# Ta có 3 đối tượng khác nhau về kiểu dữ liệu
a = c(1, 2, 3)
b = 'R stats'
c = data.frame(df)

# Chúng ta có thề lưu 3 đối tượng này vào 1 list như sau
my_list <- list(a, b, c)

# Xem lại list này
my_list
## [[1]]
## [1] 1 2 3
## 
## [[2]]
## [1] "R stats"
## 
## [[3]]
##            ten tuoi nghe_nghiep tuoi_sau_2_nam
## 1     Lê Văn A   36      Bác sỹ             38
## 2 Nguyễn Thị B   38       Kỹ sư             40
## 3   Phạm Văn C   40  Nhà đầu tư             42
# Lấy giá trị ở trong list
## Cách 1, dùng [số_thứ_tự_của_đối_tượng_trong_list]
my_list[3] # Cách này, kết quả thu được vẫn có kiểu dữ liệu là list
## [[1]]
##            ten tuoi nghe_nghiep tuoi_sau_2_nam
## 1     Lê Văn A   36      Bác sỹ             38
## 2 Nguyễn Thị B   38       Kỹ sư             40
## 3   Phạm Văn C   40  Nhà đầu tư             42
## Cách 2, bỏ kiểu dữ liệu list, lấy lại kiểu dữ liệu ban đầu của đối tượng
my_list[[3]]
##            ten tuoi nghe_nghiep tuoi_sau_2_nam
## 1     Lê Văn A   36      Bác sỹ             38
## 2 Nguyễn Thị B   38       Kỹ sư             40
## 3   Phạm Văn C   40  Nhà đầu tư             42

Boolean expression

Đây là các phép toán chúng ta đã biết trong toán học:

Toán học Trong R
> >
>=
< <
<=
= ==
&
Hoặc |
Khác !=
Không !
Nằm trong (thuộc) %in%

Kết quả của boolean expression trả về 1 trong 2 giá trị là TRUE (T) hoặc FALSE (F)

Ví dụ

1 > 2
2 <= 3
"a" == "A"
1 < 2 & 2 <3
1 > 2 | 2 >3
1 != 2
!(1==2)
4 %in% c(2, 1, 3, 4, 5)

Làm gì khi quên mất cách dùng của câu lệnh

# Dùng cú pháp ?hàm_muốn_dùng
# Ví dụ
?data.frame

Vài lệnh cơ bản làm quen (Hello world!)

# Xin chào
print("Xin chào mọi người!")

# Xem thư mục hiện tại mà R đang chạy
getwd()

# Mởi file số liệu csv
read.csv(file.choose())

# Lưu data frame thành file số liệu csv
write.csv(tap_du_lieu, file = "file_so_lieu_dau_tien_cua_toi.csv")

Mở file số liệu trên RStudio

Xem video hướng dẫn mở file số liệu bằng RStudio tại đây. Video này sẽ hướng dẫn mọi người theo cách hạn chế tối đa viết code, hy vọng sẽ giúp ích được mọi người.