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
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>
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
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
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
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)
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
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
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.