Tidyverse là một hộp công cụ lớn chứa nhiều package nhỏ bên trong và các mảnh nhỏ này kết nối với nhau một cách tiện ích để vận hành một quy trình phân tích dữ liệu hoàn chỉnh, từ khâu nhập dữ liệu vào R (readr,readxl,haven), định hình (tibble), hoán chuyển, chọn lọc và dọn dẹp (tidyr, dplyr,purr) đến bước trình bày và thăm dò dữ liệu bằng đồ họa (ggplot2). Package tidyverse được tạo ra vào năm 2016 bởi Hadley Wickham, một nhân vật quan trọng đã góp phần cho sự thành công của R, cũng là tác giả của những package nổi tiếng như reshape, dplyr, tidyr và ggplot2.
Hiện nay tidyverse chứa 19 packages bao gồm:
library(pander)
library(tidyverse)
tidyverse_packages()
## [1] "broom" "dplyr" "forcats" "ggplot2" "haven"
## [6] "httr" "hms" "jsonlite" "lubridate" "magrittr"
## [11] "modelr" "purrr" "readr" "readxl" "stringr"
## [16] "tibble" "rvest" "tidyr" "xml2" "tidyverse"
Trong bài thực hành hôm nay Nhi sẽ giới thiệu với các bạn một bộ phận trong tidyverse có tên là dplyr, và một số chức năng tiện lợi của package dplyr này.
Package dplyr là thành phần rất quan trọng trong hệ sinh thái tidyverse, vì nó cung cấp những function hoán chuyển và thao tác trên dữ liệu sau khi nó đã được tải vào R. Gần như bất cứ lần nào làm việc trên R Nhi cũng đều dùng ít nhất là 2 đến 3 hàm của dplyr cho công việc của mình. Package này được phát hành lần đầu tiên vào ngày 17 tháng 1 năm 2014,và nhanh chóng tạo ra phong trào thay thế baseR bằng dplyr trong cộng đồng. Phiên bản mới nhất hiện nay là dplyr 0.7.4 (phát hành ngày 29/9/2017).
Mặc dù có nhiều tutorial đã được viết cho dplyr trên Rpubs,youtube cũng như sách tham khảo về Data wrangling; nhưng tác giả đều dùng dataset kinh tế, và chỉ minh họa từng function đơn lẻ. Một vài function cũ có từ năm 2014 đã bị thay thế bằng function mới, cũng như có một số function mới được bổ sung vào năm 2016. Do đó, Nhi muốn viết lại bản hướng dẫn này, sử dụng một dataset Y khoa và kết hợp các function lại với nhau để đạt được một số mục tiêu nhất định.
Bộ số liệu sử dụng trong bài là “lung”, trích từ package survival, có nguồn gốc từ một nghiên cứu về Ung thư phổi của nhóm tác giả Loprinzi CL. et al (Journal of Clinical Oncology. 12(3):601-7, 1994). 228 bệnh nhân từ 33 trung tâm khác nhau được khảo sát về Tuổi, Giới tính, Karnofsky performance score, ECOG performance score, calories mổi bữa ăn, số cân nặng sụt giảm trong 6 tháng, thời gian Sống còn và Biến cố tử vong hoặc Censored.
Lưu ý: Tất cả thao tác trong bài chỉ nhằm mục đích trình diễn, nên kết quả chưa được lưu lại như 1 object. Ngoài ra Nhi sử dụng toán tử pipe trong tất cả các quy trình, nên cú pháp của các hàm đã được giản lược
df=read.csv("https://raw.github.com/vincentarelbundock/Rdatasets/master/csv/survival/cancer.csv")%>%as_tibble()
df$inst=paste("Center",df$inst,sep="")
df$status<-recode_factor(df$status,`1` = "Censored", `2` = "Dead")
df$sex<-recode_factor(df$sex,`1` = "Male", `2` = "Female")
head(df)%>%knitr::kable()
X | inst | time | status | age | sex | ph.ecog | ph.karno | pat.karno | meal.cal | wt.loss |
---|---|---|---|---|---|---|---|---|---|---|
1 | Center3 | 306 | Dead | 74 | Male | 1 | 90 | 100 | 1175 | NA |
2 | Center3 | 455 | Dead | 68 | Male | 0 | 90 | 90 | 1225 | 15 |
3 | Center3 | 1010 | Censored | 56 | Male | 0 | 90 | 90 | NA | 15 |
4 | Center5 | 210 | Dead | 57 | Male | 1 | 90 | 60 | 1150 | 11 |
5 | Center1 | 883 | Dead | 60 | Male | 0 | 100 | 90 | NA | 0 |
6 | Center12 | 1022 | Censored | 74 | Male | 1 | 50 | 80 | 513 | 0 |
Hàm glimpse() thay thế cho hàm str(), nó mô tả cấu trúc data object , cách trình bày của nó dễ nhìn hơn hàm str(). Hiểu cấu trúc object trong R là một việc quan trọng, vì khi mới tải vào R định dạng của biến số thường được quy ước tự độngbởi package tibble. Đa số trường hợp định dạng là phù hợp, tuy nhiên cũng có khi nó sai, nhất là các định dạng integer, numeric và double, cũng như chr và factor.
glimpse(df)
## Observations: 228
## Variables: 11
## $ X <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 1...
## $ inst <chr> "Center3", "Center3", "Center3", "Center5", "Center1...
## $ time <int> 306, 455, 1010, 210, 883, 1022, 310, 361, 218, 166, ...
## $ status <fctr> Dead, Dead, Censored, Dead, Dead, Censored, Dead, D...
## $ age <int> 74, 68, 56, 57, 60, 74, 68, 71, 53, 61, 57, 68, 68, ...
## $ sex <fctr> Male, Male, Male, Male, Male, Male, Female, Female,...
## $ ph.ecog <int> 1, 0, 0, 1, 0, 1, 2, 2, 1, 2, 1, 2, 1, NA, 1, 1, 1, ...
## $ ph.karno <int> 90, 90, 90, 90, 100, 50, 70, 60, 70, 70, 80, 70, 90,...
## $ pat.karno <int> 100, 90, 90, 60, 90, 80, 60, 80, 80, 70, 80, 70, 90,...
## $ meal.cal <int> 1175, 1225, NA, 1150, NA, 513, 384, 538, 825, 271, 1...
## $ wt.loss <int> NA, 15, 15, 11, 0, 0, 10, 1, 16, 34, 27, 23, 5, 32, ...
Hàm rename cho phép đổi tên biến dễ dàng, như trong thí dụ này, Nhi thay tên biến X bằng ID
rename(df,ID=X)%>%head()
## # A tibble: 6 x 11
## ID inst time status age sex ph.ecog ph.karno pat.karno
## <int> <chr> <int> <fctr> <int> <fctr> <int> <int> <int>
## 1 1 Center3 306 Dead 74 Male 1 90 100
## 2 2 Center3 455 Dead 68 Male 0 90 90
## 3 3 Center3 1010 Censored 56 Male 0 90 90
## 4 4 Center5 210 Dead 57 Male 1 90 60
## 5 5 Center1 883 Dead 60 Male 0 100 90
## 6 6 Center12 1022 Censored 74 Male 1 50 80
## # ... with 2 more variables: meal.cal <int>, wt.loss <int>
filter() là hàm quan trọng đầu tiên trong dplyr, khi ta chỉ muốn giữ lại một số rows trong data nếu chúng thỏa mãn một điều kiện nào đó. Trước kia ta hay dùng subset() hoặc [] để làm việc này, nhưng từ khi có dplyr thì việc lọc dữ liệu dễ dàng hơn rất nhiều:
Thí dụ: Lọc ra những bệnh nhân có thời gian sống dài hơn 1 năm, và nhỏ hơn 60 tuổi:
filter(df,time>=365 & age < 60)
## # A tibble: 26 x 11
## X inst time status age sex ph.ecog ph.karno pat.karno
## <int> <chr> <int> <fctr> <int> <fctr> <int> <int> <int>
## 1 3 Center3 1010 Censored 56 Male 0 90 90
## 2 15 Center12 567 Dead 57 Male 1 80 70
## 3 23 Center11 624 Dead 50 Male 1 70 80
## 4 24 Center15 371 Dead 58 Male 0 90 100
## 5 29 Center13 390 Dead 53 Male 1 80 70
## 6 33 Center7 533 Dead 48 Male 2 60 80
## 7 43 Center10 433 Dead 59 Female 0 90 90
## 8 50 Center22 765 Dead 50 Female 1 90 100
## 9 55 Center6 689 Dead 59 Male 1 90 80
## 10 59 Center3 687 Dead 58 Female 1 80 80
## # ... with 16 more rows, and 2 more variables: meal.cal <int>,
## # wt.loss <int>
Hay lọc ra những bệnh nhân có điểm Karno tự đánh giá từ 0 đến 50:
filter(df, pat.karno %in% c(0:50) )
## # A tibble: 8 x 11
## X inst time status age sex ph.ecog ph.karno pat.karno
## <int> <chr> <int> <fctr> <int> <fctr> <int> <int> <int>
## 1 30 Center1 12 Dead 74 Male 2 70 50
## 2 36 Center1 122 Dead 62 Female 2 50 50
## 3 39 Center1 93 Dead 74 Male 2 50 40
## 4 66 Center3 65 Dead 68 Male 2 70 50
## 5 110 Center3 351 Dead 75 Female 2 60 50
## 6 136 Center22 511 Censored 74 Female 2 60 40
## 7 155 Center32 156 Dead 55 Male 2 70 30
## 8 219 Center11 211 Censored 70 Female 2 70 30
## # ... with 2 more variables: meal.cal <int>, wt.loss <int>
Hàm select() cho phép ta trích một phần dữ liệu chỉ chứa những biến số mà ta quan tâm (hay ngược lại, loại bỏ những biến số không cần thiết). Khi kết hợp với hàm contains, ta còn có thể chọn hàng loạt biến có tên chứa 1 chuỗi kí tự nào đó
Thí dụ:
Chọn tất cả biến số có chứa chữ “karno”:
select(df,contains("karno")) %>%head()
## # A tibble: 6 x 2
## ph.karno pat.karno
## <int> <int>
## 1 90 100
## 2 90 90
## 3 90 90
## 4 90 60
## 5 100 90
## 6 50 80
Loại bỏ biến ECOG và tất cả biến có chứa chữ “karno”:
select(df,-contains("karno"),-ph.ecog)
## # A tibble: 228 x 8
## X inst time status age sex meal.cal wt.loss
## <int> <chr> <int> <fctr> <int> <fctr> <int> <int>
## 1 1 Center3 306 Dead 74 Male 1175 NA
## 2 2 Center3 455 Dead 68 Male 1225 15
## 3 3 Center3 1010 Censored 56 Male NA 15
## 4 4 Center5 210 Dead 57 Male 1150 11
## 5 5 Center1 883 Dead 60 Male NA 0
## 6 6 Center12 1022 Censored 74 Male 513 0
## 7 7 Center7 310 Dead 68 Female 384 10
## 8 8 Center11 361 Dead 71 Female 538 1
## 9 9 Center1 218 Dead 53 Male 825 16
## 10 10 Center7 166 Dead 61 Male 271 34
## # ... with 218 more rows
Chọn riêng 4 biến từ time cho đến sex:
select(df,time:sex)%>%head()
## # A tibble: 6 x 4
## time status age sex
## <int> <fctr> <int> <fctr>
## 1 306 Dead 74 Male
## 2 455 Dead 68 Male
## 3 1010 Censored 56 Male
## 4 210 Dead 57 Male
## 5 883 Dead 60 Male
## 6 1022 Censored 74 Male
Thí dụ: Ta muốn lọc riêng những bệnh nhân sống lâu hơn 1 năm, dưới 50 tuổi, sau đó xếp thứ tự thời gian sống còn giảm dần.
df%>%filter(time>=365 & age < 50)%>%
select(X,time)%>%
arrange(desc(time))
## # A tibble: 5 x 2
## X time
## <int> <int>
## 1 85 806
## 2 89 740
## 3 130 543
## 4 33 533
## 5 174 382
Hoặc tăng dần:
df%>%filter(time>=365 & age < 50)%>%
select(X,time)%>%
arrange(time)
## # A tibble: 5 x 2
## X time
## <int> <int>
## 1 174 382
## 2 33 533
## 3 130 543
## 4 89 740
## 5 85 806
Như bạn thấy, Nhi vừa kết hợp 3 hàm filter, select và range với nhau.
mutate() là một hàm cực kì tiện ích trong khi phân tích dữ liệu, vì nó cho phép bạn tạo ra biến số mới tùy thích trong dataframe.
Bạn có thể dùng mutate cho 2 việc: 1) Hoán chuyển biến số hiện có và 2) tạo ra biến số mới hoàn toàn.
Thí dụ: Chuyển thời gian sống còn từ ngày sang tháng:
df%>%mutate(timeMonth=round(time/30,2))%>%select(time,timeMonth)%>%head()
## # A tibble: 6 x 2
## time timeMonth
## <int> <dbl>
## 1 306 10.20
## 2 455 15.17
## 3 1010 33.67
## 4 210 7.00
## 5 883 29.43
## 6 1022 34.07
Hoặc tạo ra 1 biến mới có tên là karnomean, là trung bình của pat.karno và ph.karno, sau đó tạo ra 1 biến nhị phân cho biết bệnh nhân sống lâu hơn 2 năm, và 1 biến khác là Dead mã hóa nhị phân 1/0
df%>%mutate(karnomean=(ph.karno+pat.karno)/2,
Surv2yr=if_else(time>365*2,"Yes","No"),
Dead=if_else(status=="Censored",0,1))%>%
select(contains("karno"),karnomean,time,status,Surv2yr,Dead)%>%
glimpse()
## Observations: 228
## Variables: 7
## $ ph.karno <int> 90, 90, 90, 90, 100, 50, 70, 60, 70, 70, 80, 70, 90,...
## $ pat.karno <int> 100, 90, 90, 60, 90, 80, 60, 80, 80, 70, 80, 70, 90,...
## $ karnomean <dbl> 95, 90, 90, 75, 95, 65, 65, 70, 75, 70, 80, 70, 90, ...
## $ time <int> 306, 455, 1010, 210, 883, 1022, 310, 361, 218, 166, ...
## $ status <fctr> Dead, Dead, Censored, Dead, Dead, Censored, Dead, D...
## $ Surv2yr <chr> "No", "No", "Yes", "No", "Yes", "Yes", "No", "No", "...
## $ Dead <dbl> 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1...
dplyr cung cấp một số hàm tiện ích khác là summarise,summarise_at() và summarise_if(); khi kết hợp chúng với hàm group_by(), bạn có thể tạo ra những bảng thống kê mô tả cho từng phân nhóm tùy thích:
Hàm summarise dùng được hầu hết các hàm thống kê đơn giản trong R, với điều kiện mỗi hàm chỉ xuất ra 1 kết quả, thí dụ nếu ta muốn tính trung bình cân nặng sụt giảm trong 6 tháng cho 2 phân nhóm Censored và Dead:
df %>%
group_by(status) %>%
summarise(Mean_Weight_loss = mean(wt.loss, na.rm=TRUE))%>%pander()
status | Mean_Weight_loss |
---|---|
Censored | 9.113 |
Dead | 10.12 |
Hoặc trung vị thời gian sống còn cho từng bệnh viện:
df %>%
group_by(inst) %>%
summarise_at("time",funs(medTime=median),na.rm=T)%>%pander()
inst | medTime |
---|---|
Center1 | 221.5 |
Center10 | 275.5 |
Center11 | 216.5 |
Center12 | 285 |
Center13 | 298 |
Center15 | 274 |
Center16 | 279 |
Center2 | 197 |
Center21 | 183 |
Center22 | 428 |
Center26 | 295.5 |
Center3 | 305 |
Center32 | 240 |
Center33 | 139 |
Center4 | 433.5 |
Center5 | 224 |
Center6 | 225.5 |
Center7 | 289.5 |
CenterNA | 329 |
Hàm summarise_if() cho phép thực hiện cùng 1 hàm trên hàng loạt biến nếu chúng thỏa điều kiện, thí dụ là biến kiểu số.
Thí dụ ta tính thời gian trung bình cho tất cả biến numeric và cho riêng mỗi phân nhóm censored và dead
df %>%select(-X)%>%
group_by(status) %>%
summarise_if(is.numeric,mean,na.rm=T)%>%pander()
status | time | age | ph.ecog | ph.karno | pat.karno | meal.cal | wt.loss |
---|---|---|---|---|---|---|---|
Censored | 363.5 | 60.25 | 0.6825 | 85.56 | 83.97 | 912.8 | 9.113 |
Dead | 283 | 63.28 | 1.055 | 80.55 | 78.4 | 934.4 | 10.12 |
Nhi có thể làm cầu kì hơn khi kết hợp thêm nhiều hàm , thí dụ Mean, Sd, quantile…
df %>%
group_by(status) %>%
summarise_at("time",funs(Mean=mean,
Median=median,
SD=sd,
LL=quantile(.,probs=0.05),
UL=quantile(.,probs=0.95))
)%>%pander()
status | Mean | Median | SD | LL | UL |
---|---|---|---|---|---|
Censored | 363.5 | 284 | 221.1 | 174.1 | 838.1 |
Dead | 283 | 226 | 202.8 | 26.8 | 701.8 |
Bạn có thể tạo bảng chéo nữa:
df %>%
group_by(status) %>%
select(inst)%>%table()
## inst
## status Center1 Center10 Center11 Center12 Center13 Center15 Center16
## Censored 9 0 7 5 8 2 4
## Dead 27 4 11 18 12 4 12
## inst
## status Center2 Center21 Center22 Center26 Center3 Center32 Center33
## Censored 1 2 4 4 4 5 1
## Dead 4 11 13 2 15 2 1
## inst
## status Center4 Center5 Center6 Center7 CenterNA
## Censored 0 3 2 2 0
## Dead 4 6 12 6 1
dplyr còn cung cấp hàm n() để đếm tần số của những biến categorical. Khi kết hợp với hàm summarise, group_by và mutate bạn có thể làm 1 thống kê mô tả đơn giản cho một biến số trong dữ liệu:
df%>%group_by(inst)%>%
summarise(Frequency=n())%>%
mutate(Proportion=round(100*Frequency/sum(Frequency),2))%>%pander()
inst | Frequency | Proportion |
---|---|---|
Center1 | 36 | 15.79 |
Center10 | 4 | 1.75 |
Center11 | 18 | 7.89 |
Center12 | 23 | 10.09 |
Center13 | 20 | 8.77 |
Center15 | 6 | 2.63 |
Center16 | 16 | 7.02 |
Center2 | 5 | 2.19 |
Center21 | 13 | 5.7 |
Center22 | 17 | 7.46 |
Center26 | 6 | 2.63 |
Center3 | 19 | 8.33 |
Center32 | 7 | 3.07 |
Center33 | 2 | 0.88 |
Center4 | 4 | 1.75 |
Center5 | 9 | 3.95 |
Center6 | 14 | 6.14 |
Center7 | 8 | 3.51 |
CenterNA | 1 | 0.44 |
Một bảng chéo khác được tạo ra bằng cách kết hợp hàm group_by, summarise và spread
df%>%
group_by(inst,status) %>%
summarise(frequency = n()) %>%
spread(status,frequency) %>%
pander
inst | Censored | Dead |
---|---|---|
Center1 | 9 | 27 |
Center10 | NA | 4 |
Center11 | 7 | 11 |
Center12 | 5 | 18 |
Center13 | 8 | 12 |
Center15 | 2 | 4 |
Center16 | 4 | 12 |
Center2 | 1 | 4 |
Center21 | 2 | 11 |
Center22 | 4 | 13 |
Center26 | 4 | 2 |
Center3 | 4 | 15 |
Center32 | 5 | 2 |
Center33 | 1 | 1 |
Center4 | NA | 4 |
Center5 | 3 | 6 |
Center6 | 2 | 12 |
Center7 | 2 | 6 |
CenterNA | NA | 1 |
dplyr cung cấp hàm sample_frac() và sample_n(), cho phép thực hiện việc chọn mẫu ngẫu nhiên trên dữ liệu theo tỉ lệ và theo kích thước tùy chọn:
Thí dụ: Chọn mẫu ngẫu nhiên 10% dữ liệu
sample_frac(df,0.1)
## # A tibble: 23 x 11
## X inst time status age sex ph.ecog ph.karno pat.karno
## <int> <chr> <int> <fctr> <int> <fctr> <int> <int> <int>
## 1 17 Center22 613 Dead 70 Male 1 90 100
## 2 87 Center22 641 Dead 62 Female 1 80 80
## 3 192 Center16 81 Dead 52 Male 2 60 70
## 4 107 Center26 529 Censored 54 Female 1 80 100
## 5 90 Center1 163 Dead 72 Male 2 70 70
## 6 226 Center32 105 Censored 75 Female 2 60 70
## 7 201 Center15 79 Dead 64 Female 1 90 90
## 8 22 Center6 81 Dead 49 Female 0 100 70
## 9 86 Center6 284 Dead 71 Male 1 80 90
## 10 102 Center6 450 Dead 69 Female 1 80 90
## # ... with 13 more rows, and 2 more variables: meal.cal <int>,
## # wt.loss <int>
Chọn 10 cases ngẫu nhiên:
sample_n(df,10)
## # A tibble: 10 x 11
## X inst time status age sex ph.ecog ph.karno pat.karno
## <int> <chr> <int> <fctr> <int> <fctr> <int> <int> <int>
## 1 107 Center26 529 Censored 54 Female 1 80 100
## 2 31 Center12 473 Dead 69 Female 1 90 90
## 3 98 Center12 310 Dead 71 Male 1 90 100
## 4 72 Center3 305 Dead 48 Female 1 80 90
## 5 159 Center12 179 Dead 63 Male 1 80 70
## 6 108 Center1 11 Dead 67 Male 1 90 90
## 7 11 Center6 170 Dead 57 Male 1 80 80
## 8 156 CenterNA 329 Dead 69 Male 2 70 80
## 9 122 Center26 199 Dead 60 Female 2 70 80
## 10 133 Center6 353 Dead 47 Male 0 100 90
## # ... with 2 more variables: meal.cal <int>, wt.loss <int>
Chọn 50 cases từ hàng 100 đến 150:
slice(df,100:150)
## # A tibble: 51 x 11
## X inst time status age sex ph.ecog ph.karno pat.karno
## <int> <chr> <int> <fctr> <int> <fctr> <int> <int> <int>
## 1 100 Center3 166 Dead 70 Female 0 90 70
## 2 101 Center1 559 Censored 58 Female 0 100 100
## 3 102 Center6 450 Dead 69 Female 1 80 90
## 4 103 Center13 364 Dead 56 Male 1 70 80
## 5 104 Center6 107 Dead 63 Male 1 90 70
## 6 105 Center13 177 Dead 59 Male 2 50 NA
## 7 106 Center12 156 Dead 66 Male 1 80 90
## 8 107 Center26 529 Censored 54 Female 1 80 100
## 9 108 Center1 11 Dead 67 Male 1 90 90
## 10 109 Center21 429 Dead 55 Male 1 100 80
## # ... with 41 more rows, and 2 more variables: meal.cal <int>,
## # wt.loss <int>
Ta làm phức tạp hơn 1 chút: Chọn 3 case đầu tiên từ mỗi phân nhóm Censore hay Dead
df%>%group_by(status)%>%slice(1:3)
## # A tibble: 6 x 11
## # Groups: status [2]
## X inst time status age sex ph.ecog ph.karno pat.karno
## <int> <chr> <int> <fctr> <int> <fctr> <int> <int> <int>
## 1 3 Center3 1010 Censored 56 Male 0 90 90
## 2 6 Center12 1022 Censored 74 Male 1 50 80
## 3 38 Center15 965 Censored 66 Female 1 70 90
## 4 1 Center3 306 Dead 74 Male 1 90 100
## 5 2 Center3 455 Dead 68 Male 0 90 90
## 6 4 Center5 210 Dead 57 Male 1 90 60
## # ... with 2 more variables: meal.cal <int>, wt.loss <int>
Hoặc chọn 10% từ mỗi phân nhóm Censore/Dead
df%>%group_by(status)%>%sample_frac(0.1)
## # A tibble: 22 x 11
## # Groups: status [2]
## X inst time status age sex ph.ecog ph.karno pat.karno
## <int> <chr> <int> <fctr> <int> <fctr> <int> <int> <int>
## 1 157 Center26 364 Censored 68 Female 1 90 90
## 2 134 Center13 511 Censored 55 Female 1 80 70
## 3 219 Center11 211 Censored 70 Female 2 70 30
## 4 217 Center13 192 Censored 41 Female 1 90 80
## 5 130 Center12 543 Censored 48 Female 0 90 60
## 6 174 Center16 382 Censored 43 Female 0 100 90
## 7 192 Center16 81 Dead 52 Male 2 60 70
## 8 110 Center3 351 Dead 75 Female 2 60 50
## 9 195 Center22 269 Dead 71 Male 1 90 90
## 10 29 Center13 390 Dead 53 Male 1 80 70
## # ... with 12 more rows, and 2 more variables: meal.cal <int>,
## # wt.loss <int>
Nhi vừa trình bày một số tính năng mà dplyr package thực hiện được. Như ta thấy, những công việc này có thể cần bất cứ khi nào trong quá trình làm việc trên dữ liệu, đặc biệt là việc lọc biến số và tạo biến mới. Những hàm trong dplyr còn cực kì hữu ích khi bạn muốn vẽ biểu đồ từ dữ liệu gốc hay từ output object của một package khác, như bootstrap, mô hình… chẳng hạn. Sử dụng thông thạo dplyr có nghĩa là bạn đã có thể từ bỏ hoàn toàn những software dạng bảng tính như Excel, SPSS, Medcalc và hoàn toàn dùng R cho công việc của mình.