# 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é.