# Thực hành thao tác thường gặp trên dữ liệu với package tidyverse
#BS. Lê Ngọc Khả Nhi
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 3.3.2
## Loading tidyverse: ggplot2
## Loading tidyverse: tibble
## Loading tidyverse: tidyr
## Loading tidyverse: readr
## Loading tidyverse: purrr
## Loading tidyverse: dplyr
## Warning: package 'ggplot2' was built under R version 3.3.2
## Warning: package 'readr' was built under R version 3.3.2
## Warning: package 'purrr' was built under R version 3.3.2
## Conflicts with tidy packages ----------------------------------------------
## filter(): dplyr, stats
## lag(): dplyr, stats
#Chúng ta sử dụng bộ số liệu anorexia
anorexia<-read_csv("http://vincentarelbundock.github.io/Rdatasets/csv/MASS/anorexia.csv")
## Warning: Missing column names filled in: 'X1' [1]
## Parsed with column specification:
## cols(
## X1 = col_integer(),
## Treat = col_character(),
## Prewt = col_double(),
## Postwt = col_double()
## )
anorexia
## # A tibble: 72 × 4
## X1 Treat Prewt Postwt
## <int> <chr> <dbl> <dbl>
## 1 1 Cont 80.7 80.2
## 2 2 Cont 89.4 80.1
## 3 3 Cont 91.8 86.4
## 4 4 Cont 74.0 86.3
## 5 5 Cont 78.1 76.1
## 6 6 Cont 88.3 78.1
## 7 7 Cont 87.3 75.1
## 8 8 Cont 75.1 86.7
## 9 9 Cont 80.6 73.5
## 10 10 Cont 78.4 84.6
## # ... with 62 more rows
#1)Đầu tiên, hàm Mutate cho phép bạn tạo ra 1 biến số mới trong dataframe với gía trị được xác định từ những biến có sẵn
#Thí dụ: Tạo biến "Change" với nội dung là khác biệt cân nặng giữa Trước và Sau điều trị
anorexplus<-anorexia%>%mutate(Change=Postwt-Prewt)
anorexia%>%mutate(Change=Postwt-Prewt)%>%ggplot()+geom_density(aes(x=Change,fill=Treat),alpha=0.5)+theme_bw()

#2) Hàm thứ 2 : GATHER, cho phép ta chuyển dạng 1 data Rộng thành 1 data Dài, hay nói cách khác: nhập nhiều cột (biến số)lại với nhau
#Thí dụ: Ta muốn nhập 2 biến Prewt và Postwt lại thành 1 biến duy nhất là Weight và phân nhóm theo factor tên là Status
anorexlong<-anorexia%>%gather(key=Status,value=Weight,Prewt:Postwt,na.rm =TRUE)
anorexlong
## # A tibble: 144 × 4
## X1 Treat Status Weight
## <int> <chr> <chr> <dbl>
## 1 1 Cont Prewt 80.7
## 2 2 Cont Prewt 89.4
## 3 3 Cont Prewt 91.8
## 4 4 Cont Prewt 74.0
## 5 5 Cont Prewt 78.1
## 6 6 Cont Prewt 88.3
## 7 7 Cont Prewt 87.3
## 8 8 Cont Prewt 75.1
## 9 9 Cont Prewt 80.6
## 10 10 Cont Prewt 78.4
## # ... with 134 more rows
anorexia%>%gather(key=Status,value=Weight,Prewt:Postwt,na.rm =TRUE)%>%ggplot()+geom_boxplot(aes(x=Status,y=Weight,fill=Status))+facet_wrap(~Treat,ncol=1,scales="free")+theme_bw()+coord_flip()

#3) Hàm spread có công dụng ngược lại với hàm Gather, nó cho phép phân tán 1 biến Y thành n biến số mới với n là số bậc giá trị của 1 factor X
anorexwide<-anorexlong%>%spread(key=Status,value=Weight,fill=0,convert=FALSE,drop=TRUE,sep = NULL)
anorexwide
## # A tibble: 72 × 4
## X1 Treat Postwt Prewt
## * <int> <chr> <dbl> <dbl>
## 1 1 Cont 80.2 80.7
## 2 2 Cont 80.1 89.4
## 3 3 Cont 86.4 91.8
## 4 4 Cont 86.3 74.0
## 5 5 Cont 76.1 78.1
## 6 6 Cont 78.1 88.3
## 7 7 Cont 75.1 87.3
## 8 8 Cont 86.7 75.1
## 9 9 Cont 73.5 80.6
## 10 10 Cont 84.6 78.4
## # ... with 62 more rows
#4) Hàm unite cho phép ghép 2 factor lại với nhau để tạo ra 1 factor mới
# Thí dụ: Ta muốn ghép 2 factor: phân nhóm điều trị và phân nhóm thời điểm:
anorexcomb<-anorexlong%>%unite(Group,Treat,Status,sep = "&")
anorexcomb
## # A tibble: 144 × 3
## X1 Group Weight
## * <int> <chr> <dbl>
## 1 1 Cont&Prewt 80.7
## 2 2 Cont&Prewt 89.4
## 3 3 Cont&Prewt 91.8
## 4 4 Cont&Prewt 74.0
## 5 5 Cont&Prewt 78.1
## 6 6 Cont&Prewt 88.3
## 7 7 Cont&Prewt 87.3
## 8 8 Cont&Prewt 75.1
## 9 9 Cont&Prewt 80.6
## 10 10 Cont&Prewt 78.4
## # ... with 134 more rows
anorexlong%>%unite(Group,Treat,Status,sep = "&")%>%ggplot()+geom_boxplot(aes(x=reorder(Group,Weight),y=Weight,fill=reorder(Group,Weight)))+theme_bw()+coord_flip()

#5) Hàm separate đảo ngược công dụng của hàm unite, nó cho phép cắt 1 biến bất kì thành nhiều biến dựa vào 1 dấu hiệu ngăn cách.Hàm này đặc biệt hữu dụng khi bạn xử lý time series data
#Thí dụ: Phục hồi lại trạng thái trước khi dùng hàm unite
anorexsep<-anorexcomb%>%separate(Group, into = c("Treatment","Status"),sep = "&")
anorexsep
## # A tibble: 144 × 4
## X1 Treatment Status Weight
## * <int> <chr> <chr> <dbl>
## 1 1 Cont Prewt 80.7
## 2 2 Cont Prewt 89.4
## 3 3 Cont Prewt 91.8
## 4 4 Cont Prewt 74.0
## 5 5 Cont Prewt 78.1
## 6 6 Cont Prewt 88.3
## 7 7 Cont Prewt 87.3
## 8 8 Cont Prewt 75.1
## 9 9 Cont Prewt 80.6
## 10 10 Cont Prewt 78.4
## # ... with 134 more rows
# Tạm biệt các bạn. Hẹn gặp lần sau nhé.