install.packages(c("readxl", "haven"))
2 Chuẩn bị
2.1 File data đang ở đâu?
Bước đầu tiên chúng ta phải biết file data đang nằm ở đâu trong máy tính. Vị trí, hay địa chỉ, hay đường dẫn lưu file data trong máy tính gọi là path.
2.1.1 Windows
Để Windows hiển thị đường dẫn trong Explorer, trên thanh menu chọn dấu ...
> Options
.
Chọn tab View
, tick vào ô Display the full path in the title bar
.
Sau khi làm các bước trên, click vào title bar của Explorer sẽ thấy hiển thị đầy đủ path của file hoặc folder hiện tại như sau:
2.1.2 MacOS
Để hiển thị đường dẫn trong Finder
, trên thanh menu chọn View
> Show Path Bar
Tại thanh đường dẫn (Path Bar), nhấn chuột phải vào folder hoặc file, sau đó chọn Copy "tên_folder" as Pathname
để copy đường dẫn đến folder.
Trong ví dụ sau, đường dẫn được copy là /Users/anhptq/Desktop/r4babies/data
2.1.3 Absolute path và relative path
2.1.3.1 Absolute path
Trong ví dụ trên, C:/Users/ongph/github/r4babies/data
là đường dẫn tuyệt đối (absolute path). Absolute path là path đầy đủ từ đầu ổ đĩa cho đến file hay folder hiện tại.
2.1.3.2 Relative path
Trong folder C:/Users/ongph/github/r4babies
có chứa 2 folders là /data
và /analysis
. Chúng ta có thể minh họa path này như sau:
C:
|-- Users
|-- ongph
|-- github
|-- r4adults
|-- data
|-- r4babies
|-- data
|-- analysis
Ví dụ chúng ta đang ở trong folder /data
. Từ /data
muốn hướng dẫn cho máy tính đi đến được folder /analysis
có thể viết relative path như sau:
../analysis
Trong đó:
..
: đi ngược lên 1 folder, trong ví dụ này chúng ta đang ở/data
, đi ngược lên 1 folder là/r4babies
/analysis
: sau khi đi ngược lên/r4babies
, hướng dẫn máy tính đi tiếp tới folder/analysis
Tương tự, chúng ta đang ở trong folder /data
nằm trong /r4babies
, muốn đến folder /data
nằm trong /r4adults
thì viết như sau:
../../r4adults/data
2.1.4 Quy tắc đặt tên files, folders
Để tránh bị lỗi trong quá trình sử dụng R, nên đặt tên files, folders theo các quy tắc sau:
- Không đặt tên có dấu tiếng Việt
- Không đặt tên quá dài
- Không đặt tên có các kí tự đặc biệt như
/
,\
,&
,,
,(
,)
…, tốt nhất chỉ nên đặt chữ và số - Không đặt tên chữ viết hoa viết thường lẫn lộn, nếu cần thì chỉ đặt theo quy luật camelCase (viết hoa chữ cái đầu của các từ sau từ đầu tiên, ví dụ
dataSoiHcm
) hoặc PascalCase (viết hoa chữ cái đầu của tất cả các từ, ví dụDataSoiHcm
) - Không có khoảng trống
" "
trong tên, có thể đặt kiểu camelCase, hoặc sử dụng dấu-
,_
thay thế các khoảng trống: ví dụ không dùng têndata soi HCM 2023.xlsx
mà có thể đặt làdataSoiHcm2023.xlsx
, hoặcdata-soi-hcm-2023.xlsx
, hoặcdata_soi_hcm_2023.xlsx
2.2 R project
Để tiện quản lý, mỗi dự án phân tích nên được đặt trong 1 folder. Trong folder này chứa tất cả data, code, bảng kết quả, biểu đồ… Chúng ta sẽ dùng chức năng tạo R project của RStudio để tạo folder này.
Trên thanh menu vào File
> New Project...
> New Directory
.
Chọn Project Type là New Project
.
Đặt tên folder cho project này, và chọn đường dẫn nơi sẽ lưu project trong máy tính.
Trong folder /test
là một R project mới tạo này, chúng ta tạo thêm 2 folders /data
và /analysis
. Các thành phần trong folder này như sau:
test
|-- data
|-- data.csv
|-- analysis
|-- code.R
|-- analysis.Rmd
|-- test.Rproj
- Folder
/data
: chứa tất cả data. - Folder
/analysis
: chứa tất cả file R Markdown.
Từ bây giờ, mỗi lần muốn phân tích cho dự án /test
này, chúng ta mở file test.Rproj
bằng RStudio. Tất cả các file code trong folder /analysis
có thể đọc file trong folder /data
bằng cách dùng relative path. Những data quan trọng không thể copy vào chung trong project thì dùng absolute path (xem lại phần nói về path ở Section 2.1.3). Ví dụ:
<- read.csv("../data/data.csv") df
2.3 Đọc data vào R
2.3.1 Phân biệt hai loại file chính
Chúng ta có thể gặp các files data ở rất nhiều format khác nhau, như .csv
, .txt
, .json
, .xlsx
, .dta
… Tuy nhiên, một cách đơn giản, có thể chia các files thành 2 loại:
2.3.1.1 Text files
Là những files khi mở bằng text editor như Notepad thì có thể đọc được các chữ trong file (human-readable). Các files như .csv
, .txt
, .json
đều là text files. Trong R đã có sẵn những functions để đọc được hầu hết các text files.
2.3.1.2 Binary files
Là những files khi mở bằng text editor như Notepad thì không đọc được các chữ trong file. Các files như .xlsx
, .dta
đều là binary files. Binary files cần được mở bằng các phần mềm chuyên dụng, ví dụ dùng Excel để mở file .xlsx
thì mới đọc được dưới dạng chữ human-readable. Bản thân R không đọc được các loại file này, nhưng chúng ta có thể cài đặt và sử dụng các R packages để đọc binary files.
2.3.2 Đọc text files vào R
2.3.2.1 read.table()
Lệnh read.table()
là lệnh chung để đọc tất cả data dạng bảng.
read.table(file, header = FALSE, sep = "")
Dùng ?read.table
để đọc thêm hướng dẫn sử dụng và các arguments khác của lệnh. Ở đây chúng ta tìm hiểu một số arguments thường dùng:
file
: path của file data đầu vào, có thể dùng absolute path hoặc relative path (xem Section 2.1.3).header
: dòng đầu tiên của file data có phải là tên cột không. Nếuheader = TRUE
thì R sẽ lấy các giá trị trong hàng đầu tiên làm tên cột. Nếuheader = FALSE
thì R sẽ tự đặt tên cột làV1
,V2
,V3
…
sep
: các cột trong text file ngăn cách nhau bằng kí tự gì. Ví dụ filelife-exp.csv
nếu chúng ta mở bằng Notepad sẽ thấy các cột ngăn cách nhau bằng dấu,
.
Chúng ta đọc file life-exp.csv
vào R như sau:
<- read.table(file = "data/life-exp.csv", header = F, sep = ",")
df head(df)
V1 V2 V3 V4 V5 V6
1 Country Year Status Life expectancy Adult Mortality infant deaths
2 Afghanistan 2015 Developing 65.0 263 62
3 Afghanistan 2014 Developing 59.9 271 64
4 Afghanistan 2013 Developing 59.9 268 66
5 Afghanistan 2012 Developing 59.5 272 69
6 Afghanistan 2011 Developing 59.2 275 71
V7 V8 V9 V10 V11 V12
1 Alcohol percentage expenditure Hepatitis B Measles BMI under-five deaths
2 0.01 71.27962362 65 1154 19.1 83
3 0.01 73.52358168 62 492 18.6 86
4 0.01 73.21924272 64 430 18.1 89
5 0.01 78.1842153 67 2787 17.6 93
6 0.01 7.097108703 68 3013 17.2 97
V13 V14 V15 V16 V17 V18
1 Polio Total expenditure Diphtheria HIV/AIDS GDP Population
2 6 8.16 65 0.1 584.25921 3.3736494e7
3 58 8.18 62 0.1 612.696514 327582.0
4 62 8.13 64 0.1 631.744976 3.1731688e7
5 67 8.52 67 0.1 669.959 3.696958e6
6 68 7.87 68 0.1 63.537231 2.978599e6
V19 V20 V21
1 thinness 1-19 years thinness 5-9 years Income composition of resources
2 17.2 17.3 0.479
3 17.5 17.5 0.476
4 17.7 17.7 0.47
5 17.9 18.0 0.463
6 18.2 18.2 0.454
V22
1 Schooling
2 10.1
3 10.0
4 9.9
5 9.8
6 9.5
Nếu đọc với argument header = T
:
<- read.table(file = "data/life-exp.csv", header = T, sep = ",")
df head(df)
Country Year Status Life.expectancy Adult.Mortality infant.deaths
1 Afghanistan 2015 Developing 65.0 263 62
2 Afghanistan 2014 Developing 59.9 271 64
3 Afghanistan 2013 Developing 59.9 268 66
4 Afghanistan 2012 Developing 59.5 272 69
5 Afghanistan 2011 Developing 59.2 275 71
6 Afghanistan 2010 Developing 58.8 279 74
Alcohol percentage.expenditure Hepatitis.B Measles BMI under.five.deaths
1 0.01 71.279624 65 1154 19.1 83
2 0.01 73.523582 62 492 18.6 86
3 0.01 73.219243 64 430 18.1 89
4 0.01 78.184215 67 2787 17.6 93
5 0.01 7.097109 68 3013 17.2 97
6 0.01 79.679367 66 1989 16.7 102
Polio Total.expenditure Diphtheria HIV.AIDS GDP Population
1 6 8.16 65 0.1 584.25921 33736494
2 58 8.18 62 0.1 612.69651 327582
3 62 8.13 64 0.1 631.74498 31731688
4 67 8.52 67 0.1 669.95900 3696958
5 68 7.87 68 0.1 63.53723 2978599
6 66 9.20 66 0.1 553.32894 2883167
thinness..1.19.years thinness.5.9.years Income.composition.of.resources
1 17.2 17.3 0.479
2 17.5 17.5 0.476
3 17.7 17.7 0.470
4 17.9 18.0 0.463
5 18.2 18.2 0.454
6 18.4 18.4 0.448
Schooling
1 10.1
2 10.0
3 9.9
4 9.8
5 9.5
6 9.2
2.3.2.2 read.csv()
File .csv
là một định dạng thông dụng, tên đầy đủ là comma-separated values nghĩa là các giá trị được ngăn cách bởi dấu ,
(comma). Trong R có sẵn lệnh read.csv()
để đọc file .csv
.
read.csv(file, header = TRUE, sep = ",")
Các arguments của read.csv()
cũng tương tự read.table()
, nhưng đã được quy định cho phù hợp với file .csv
. Vì vậy, thường chỉ cần đặt path vào argument file
là đủ.
<- read.csv(file = "data/life-exp.csv")
df head(df)
Country Year Status Life.expectancy Adult.Mortality infant.deaths
1 Afghanistan 2015 Developing 65.0 263 62
2 Afghanistan 2014 Developing 59.9 271 64
3 Afghanistan 2013 Developing 59.9 268 66
4 Afghanistan 2012 Developing 59.5 272 69
5 Afghanistan 2011 Developing 59.2 275 71
6 Afghanistan 2010 Developing 58.8 279 74
Alcohol percentage.expenditure Hepatitis.B Measles BMI under.five.deaths
1 0.01 71.279624 65 1154 19.1 83
2 0.01 73.523582 62 492 18.6 86
3 0.01 73.219243 64 430 18.1 89
4 0.01 78.184215 67 2787 17.6 93
5 0.01 7.097109 68 3013 17.2 97
6 0.01 79.679367 66 1989 16.7 102
Polio Total.expenditure Diphtheria HIV.AIDS GDP Population
1 6 8.16 65 0.1 584.25921 33736494
2 58 8.18 62 0.1 612.69651 327582
3 62 8.13 64 0.1 631.74498 31731688
4 67 8.52 67 0.1 669.95900 3696958
5 68 7.87 68 0.1 63.53723 2978599
6 66 9.20 66 0.1 553.32894 2883167
thinness..1.19.years thinness.5.9.years Income.composition.of.resources
1 17.2 17.3 0.479
2 17.5 17.5 0.476
3 17.7 17.7 0.470
4 17.9 18.0 0.463
5 18.2 18.2 0.454
6 18.4 18.4 0.448
Schooling
1 10.1
2 10.0
3 9.9
4 9.8
5 9.5
6 9.2
2.3.3 Đọc binary files vào R
2.3.3.1 read_excel()
Dùng lệnh read_excel()
trong package readxl
để đọc các file excel (đuôi .xls
hay .xlsx
) . Xem lại cách cài đặt và sử dụng R packages tại Section 1.5.
read_excel(path, sheet = NULL, col_names = TRUE)
Chúng ta có thể thấy tên các arguments của read_excel()
hoàn toàn khác với read.table()
hay read.csv()
.
path
: path của file data đầu vào.sheet
: tên hoặc số thứ tự của sheet sẽ đọc vào R, nếu file có nhiều sheets.col_names
: dòng đầu tiên của file data có phải là tên cột không, giống argumentheader
củaread.table()
.
library(readxl)
<- read_excel(path = "data/gdp-capita.xlsx", sheet = 1)
df head(df)
# A tibble: 6 × 10
`Country Name` `Country Code` `2015` `2016` `2017` `2018` `2019` `2020` `2021`
<chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Aruba ABW 28419. 28450. 29329. 30918. 31903. 24008. 29128.
2 Africa Easter… AFE 1554. 1444. 1625. 1558. 1508. 1356. 1546.
3 Afghanistan AFG 567. 523. 526. 492. 498. 512. 356.
4 Africa Wester… AFW 1882. 1649. 1590. 1735. 1812. 1688. 1767.
5 Angola AGO 3217. 1810. 2439. 2541. 2191. 1451. 1927.
6 Albania ALB 3953. 4124. 4531. 5288. 5396. 5343. 6377.
# ℹ 1 more variable: `2022` <dbl>
2.3.3.2 File SPSS, Stata, SAS
Dùng các lệnh read_sav()
(SPSS), read_dta()
(Stata) và read_sas()
(SAS) trong package haven
.
library(haven)
<- read_dta(file = "data/linelist-raw.dta")
df head(df)
# A tibble: 6 × 28
case_id generation infection_date date_onset hosp_date
<chr> <dbl> <dttm> <chr> <dttm>
1 5fe599 4 2014-05-08 00:00:00 2014-05-13 2014-05-15 00:00:00
2 8689b7 4 NA 2014-05-13 2014-05-14 00:00:00
3 11f8ea 2 NA 2014-05-16 2014-05-18 00:00:00
4 b8812a 3 2014-05-04 00:00:00 2014-05-18 2014-05-20 00:00:00
5 893f25 3 2014-05-18 00:00:00 2014-05-21 2014-05-22 00:00:00
6 be99c8 3 2014-05-03 00:00:00 2014-05-22 2014-05-23 00:00:00
# ℹ 23 more variables: date_of_outcome <dttm>, outcome <chr>, gender <chr>,
# hospital <chr>, lon <dbl>, lat <dbl>, infector <chr>, source <chr>,
# age <chr>, age_unit <chr>, row_num <dbl>, wt_kg <dbl>, ht_cm <dbl>,
# ct_blood <dbl>, fever <chr>, chills <chr>, cough <chr>, aches <chr>,
# vomit <chr>, temp <dbl>, time_admission <chr>, merged_header <chr>,
# x28 <chr>