I. Dplyr

1. hàm select

hàm select cho phép chúng ta lựa chọn các biến số quan trọng để tiến hành phân tích

library(dplyr)
## 
## 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
data("starwars")
# chọn ra các biến name, height, mass trong tập dữ liệu starwars
select(starwars, name, height, mass)
## # A tibble: 87 × 3
##    name               height  mass
##    <chr>               <int> <dbl>
##  1 Luke Skywalker        172    77
##  2 C-3PO                 167    75
##  3 R2-D2                  96    32
##  4 Darth Vader           202   136
##  5 Leia Organa           150    49
##  6 Owen Lars             178   120
##  7 Beru Whitesun lars    165    75
##  8 R5-D4                  97    32
##  9 Biggs Darklighter     183    84
## 10 Obi-Wan Kenobi        182    77
## # ℹ 77 more rows

2. Lựa chọn quan sát

hàm Filter cho phép chúng ta chọn ra các quan sát(dòng) thỏa mãn điều kiện nào đó, với trường hợp lựa chọn quan sát có nhiều điều kiện ràng buộc, có thể sử dụng tổ hợp với các toán tử &(AND) hoặc |(OR):

# lựa chọn ra các nhân vật có giới tính là female
filter(starwars, sex == "female")
## # A tibble: 16 × 14
##    name     height  mass hair_color skin_color eye_color birth_year sex   gender
##    <chr>     <int> <dbl> <chr>      <chr>      <chr>          <dbl> <chr> <chr> 
##  1 Leia Or…    150  49   brown      light      brown             19 fema… femin…
##  2 Beru Wh…    165  75   brown      light      blue              47 fema… femin…
##  3 Mon Mot…    150  NA   auburn     fair       blue              48 fema… femin…
##  4 Shmi Sk…    163  NA   black      fair       brown             72 fema… femin…
##  5 Ayla Se…    178  55   none       blue       hazel             48 fema… femin…
##  6 Adi Gal…    184  50   none       dark       blue              NA fema… femin…
##  7 Cordé       157  NA   brown      light      brown             NA fema… femin…
##  8 Luminar…    170  56.2 black      yellow     blue              58 fema… femin…
##  9 Barriss…    166  50   black      yellow     blue              40 fema… femin…
## 10 Dormé       165  NA   brown      light      brown             NA fema… femin…
## 11 Zam Wes…    168  55   blonde     fair, gre… yellow            NA fema… femin…
## 12 Taun We     213  NA   none       grey       black             NA fema… femin…
## 13 Jocasta…    167  NA   white      fair       blue              NA fema… femin…
## 14 Shaak Ti    178  57   none       red, blue… black             NA fema… femin…
## 15 Rey          NA  NA   brown      light      hazel             NA fema… femin…
## 16 Padmé A…    165  45   brown      light      brown             46 fema… femin…
## # ℹ 5 more variables: homeworld <chr>, species <chr>, films <list>,
## #   vehicles <list>, starships <list>
# lựa chọn ra các nhân vật có giới tính là female và đến từ ALderaan
filter(starwars, sex == "female" & homeworld == "Alderaan")
## # A tibble: 1 × 14
##   name      height  mass hair_color skin_color eye_color birth_year sex   gender
##   <chr>      <int> <dbl> <chr>      <chr>      <chr>          <dbl> <chr> <chr> 
## 1 Leia Org…    150    49 brown      light      brown             19 fema… femin…
## # ℹ 5 more variables: homeworld <chr>, species <chr>, films <list>,
## #   vehicles <list>, starships <list>
# lựa chọn ra các nhân vật có giới tính là female
# đến từ Alderaan,  Coruscant, Endor
filter(starwars, sex == "female", homeworld == "Alderaan" | homeworld == "Coruscant" | homeworld == "Endor")
## # A tibble: 3 × 14
##   name      height  mass hair_color skin_color eye_color birth_year sex   gender
##   <chr>      <int> <dbl> <chr>      <chr>      <chr>          <dbl> <chr> <chr> 
## 1 Leia Org…    150    49 brown      light      brown             19 fema… femin…
## 2 Adi Gall…    184    50 none       dark       blue              NA fema… femin…
## 3 Jocasta …    167    NA white      fair       blue              NA fema… femin…
## # ℹ 5 more variables: homeworld <chr>, species <chr>, films <list>,
## #   vehicles <list>, starships <list>
# một các ngắn gọn hơn sử dụng toán tử %in%
filter(starwars, sex == "female", homeworld %in% c("Alderaan", "Coruscant", "Endor"))
## # A tibble: 3 × 14
##   name      height  mass hair_color skin_color eye_color birth_year sex   gender
##   <chr>      <int> <dbl> <chr>      <chr>      <chr>          <dbl> <chr> <chr> 
## 1 Leia Org…    150    49 brown      light      brown             19 fema… femin…
## 2 Adi Gall…    184    50 none       dark       blue              NA fema… femin…
## 3 Jocasta …    167    NA white      fair       blue              NA fema… femin…
## # ℹ 5 more variables: homeworld <chr>, species <chr>, films <list>,
## #   vehicles <list>, starships <list>

3. Tạo biến số mới

hàm mutate cho phép tạo ra các biến số mới từ các phép toán trên các biến số có sẵn:

# chuyển biến số height từ cm sang đơn vị inch
# chuyển biến số mass từ kilograms sang pounds
newdata <- mutate(starwars, height = height * 0.394,
                  mass = mass * 2.205)
head(select(newdata, height, mass))
## # A tibble: 6 × 2
##   height  mass
##    <dbl> <dbl>
## 1   67.8 170. 
## 2   65.8 165. 
## 3   37.8  70.6
## 4   79.6 300. 
## 5   59.1 108. 
## 6   70.1 265.

Hàm ifelse có thể được sử dụng để tạo ra thêm dữ liệu mới. Định dạng của hàm này là ifelse(test, return if TRUE, return if FALSE)

newdata <- mutate(starwars, heightcat = ifelse(height > 180, "tall",  "short"))
head(select(newdata, heightcat))
## # A tibble: 6 × 1
##   heightcat
##   <chr>    
## 1 short    
## 2 short    
## 3 short    
## 4 tall     
## 5 short    
## 6 short
# nếu chiều cao nhỏ hơn 75 cm hoặc lớn hơn 200 thì để trống
# ngược lại giữ nguyên
newdata <- mutate(starwars, height = ifelse(height > 200 | height < 75, NA, height))
head(select(newdata,height))
## # A tibble: 6 × 1
##   height
##    <int>
## 1    172
## 2    167
## 3     96
## 4     NA
## 5    150
## 6    178

4. Thống kê dữ liệu

hàm summarize cho phép sử dụng để tính toán các tham số thống kê với các biến số. Nó thường được sử dụng với hàm group_by để tính toán thống kê theo các nhóm.

# tính chiều cao trung bình và cân nặng trung bình
# tham số na.rm = TRUE cho phép loại bỏ các giá trị trống khi tính toán
summarize(starwars, mean_ht = mean(height, na.rm=TRUE), 
          mean_mass = mean(mass, na.rm=TRUE))
## # A tibble: 1 × 2
##   mean_ht mean_mass
##     <dbl>     <dbl>
## 1    174.      97.3

sử dụng hàm group_by kết hợp với hàm summarize

# tính toán giá trị trung bình của height và mass theo gender
newdata <- starwars%>%group_by(gender) %>%
  summarize(mean_ht = mean(height, na.rm=TRUE),
            mean_mass = mean(mass, na.rm=TRUE))
newdata
## # A tibble: 3 × 3
##   gender    mean_ht mean_mass
##   <chr>       <dbl>     <dbl>
## 1 feminine     165.      54.7
## 2 masculine    177.     106. 
## 3 <NA>         181.      48

II. Tidyr

1. Định hình dữ liệu

Nhiều dạng biểu đồ trong phân tích dữ liệu cần định dạng dữ liệu ở dạng wide(rộng) hoặc long(dài).

library(tidyr)
# tạo dữ liệu dạng wide format
id <- 1:3
name <- c("Bill", "Bob", "Marry")
sex <- c("Male", "Male", "Female")
age <- c(22,15,18)
income <- c(55000,75000,90000)
wide_data <- data.frame(id,name,sex,age,income)
wide_data
##   id  name    sex age income
## 1  1  Bill   Male  22  55000
## 2  2   Bob   Male  15  75000
## 3  3 Marry Female  18  90000
# chyển dữ liệu sang dạng long_format
long_data <- gather(wide_data, key = "Variable", value = "Value", sex:income)
long_data
##   id  name Variable  Value
## 1  1  Bill      sex   Male
## 2  2   Bob      sex   Male
## 3  3 Marry      sex Female
## 4  1  Bill      age     22
## 5  2   Bob      age     15
## 6  3 Marry      age     18
## 7  1  Bill   income  55000
## 8  2   Bob   income  75000
## 9  3 Marry   income  90000
# chuyển dữ liệu từ dạng lòn_format sang wide_format
spread(long_data, Variable, Value)
##   id  name age income    sex
## 1  1  Bill  22  55000   Male
## 2  2   Bob  15  75000   Male
## 3  3 Marry  18  90000 Female

III, Xử lý dữ liệu trống

3 phương pháp cơ bản để xử lý dữ liệu trống:

1, trích trọn đặc trưng (feature selection) 2, xóa dữ liệu trống tồn tại theo biến (listwise deletion) 3, cải tiến dữ liệu(imputation)

1. Trích trọn đặc trưng

Phương pháp này chúng ta sẽ xóa đi các biến số chứa quá nhiều dữ liệu trống.

library(ggplot2)
data("msleep")
# kiểm tra tỉ lệ dữ liệu trống trogn từng biến số
pctmisss <- colSums(is.na(msleep))/nrow(msleep)
round(pctmisss,2)
##         name        genus         vore        order conservation  sleep_total 
##         0.00         0.00         0.08         0.00         0.35         0.00 
##    sleep_rem  sleep_cycle        awake      brainwt       bodywt 
##         0.27         0.61         0.00         0.33         0.00

chúng ta thấy biến sleep_cycle chứa tới 61% giá trị trống, điều này cho phép xóa cột biến này đi để không làm ảnh hưởng tới việc phân tích dữ liệu

2. Xóa dữ liệu trống theo biến

Phương pháp này cho phép loại bỏ các dữ liệu trống ở các dòng trong các biến số có dữ liệu trống mà chúng ta quan tâm

newdata <- select(msleep, genus, vore, conservation)
pctmisss <- colSums(is.na(msleep))/nrow(msleep)
round(pctmisss,2)
##         name        genus         vore        order conservation  sleep_total 
##         0.00         0.00         0.08         0.00         0.35         0.00 
##    sleep_rem  sleep_cycle        awake      brainwt       bodywt 
##         0.27         0.61         0.00         0.33         0.00
# số lượng quan sát ban đầu
dim(newdata)
## [1] 83  3
# xóa các dòng chứa dữ liệu trống
newdata <- na.omit(newdata)
# số lượng quan sát sau khi loại bỏ các dòng chứa dữ liệu trống
dim(newdata)
## [1] 52  3

3. Cải tiến dữ liệu trống

Phương pháp này không xóa bỏ đi các dữ liệu trống mà thay thế các giá tị trống bằng một giá trị được cho là phù hợp (reasonable). chúng ta sẽ sử dụng hàm kNN trong gói VIM để thay thế các giá trị trống.

# cải tiến dữ liệu trống sử dụng kNN, k =5
# sử dụng 5 láng giềng gần nhất
library(VIM)
## Loading required package: colorspace
## Loading required package: grid
## The legacy packages maptools, rgdal, and rgeos, underpinning the sp package,
## which was just loaded, will retire in October 2023.
## Please refer to R-spatial evolution reports for details, especially
## https://r-spatial.org/r/2023/05/15/evolution4.html.
## It may be desirable to make the sf package available;
## package maintainers should consider adding sf to Suggests:.
## The sp package is now running under evolution status 2
##      (status 2 uses the sf package in place of rgdal)
## VIM is ready to use.
## Suggestions and bug-reports can be submitted at: https://github.com/statistikat/VIM/issues
## 
## Attaching package: 'VIM'
## The following object is masked from 'package:datasets':
## 
##     sleep
newdata <- kNN(msleep, k = 5)
newdata <- colSums(is.na(newdata)) / nrow(newdata)
newdata
##             name            genus             vore            order 
##                0                0                0                0 
##     conservation      sleep_total        sleep_rem      sleep_cycle 
##                0                0                0                0 
##            awake          brainwt           bodywt         name_imp 
##                0                0                0                0 
##        genus_imp         vore_imp        order_imp conservation_imp 
##                0                0                0                0 
##  sleep_total_imp    sleep_rem_imp  sleep_cycle_imp        awake_imp 
##                0                0                0                0 
##      brainwt_imp       bodywt_imp 
##                0                0

hàm kNN sẽ tìm ra 5 giá trị có độ tương đồng cao nhất(các giá trị này không trống).

-) Nếu giá trị trống là dạng số (numeric) thì giá trị trung bình của 5 trường hợp sẽ được thay thế vào đó. N

-) Nếu giá trị trống là giá trị của biến phân loại, giá trị xuất hiện nhiều nhất trong 5 giá trị đầy đủ sẽ được thay thế vào giá trị trống.