“Hỏi một câu, chỉ dốt chốc lát, không hỏi sẽ dốt cả đời.”
Ngạn ngữ phương Tây

Chương này sẽ trình bày cách đọc dữ liệu (nhập dữ liệu vào R) từ các tập tin như excel, text (.txt), … và cách ghi ra tập tin để lưu trữ dữ liệu.

Các tập dữ liệu có sẵn trong R

Một số tập dữ liệu được lữu trữ sẵn trong các gói của R để phục vụ cho việc minh họa các hàm trong R. Chẳng hạn gói datasets chứa nhiều tập dữ liệu khác nhau. Để xem thông tin các tập dữ liệu chứa trong gói này chúng ta có thể dùng một trong hai lệnh sau:

data(package = "datasets") # cho thông tin về dữ liệu có trong gói datasets
library(help = "datasets") # cho thông tin về gói datasets và dữ liệu chứa trong đó

Để biết thông tin về một tập dữ liệu cụ thể trong đó ta dùng dấu ?.

?ChickWeight

Ta thấy ChickWeight là một data frame.

class(ChickWeight)
## [1] "nfnGroupedData" "nfGroupedData"  "groupedData"    "data.frame"

Ngoài cách trích xuất các thành phần của data frame như ở Chương 5, chúng ta có hai hàm head()tail() dùng để trích phần đầu và phần cuối tương ứng của một đối tượng trong R.

head(ChickWeight) # mặc định là 6 dòng đầu
##   weight Time Chick Diet
## 1     42    0     1    1
## 2     51    2     1    1
## 3     59    4     1    1
## 4     64    6     1    1
## 5     76    8     1    1
## 6     93   10     1    1
head(ChickWeight, n = 10) # chỉ rõ 10 dòng đầu
##    weight Time Chick Diet
## 1      42    0     1    1
## 2      51    2     1    1
## 3      59    4     1    1
## 4      64    6     1    1
## 5      76    8     1    1
## 6      93   10     1    1
## 7     106   12     1    1
## 8     125   14     1    1
## 9     149   16     1    1
## 10    171   18     1    1
tail(ChickWeight)
##     weight Time Chick Diet
## 573    155   12    50    4
## 574    175   14    50    4
## 575    205   16    50    4
## 576    234   18    50    4
## 577    264   20    50    4
## 578    264   21    50    4
tail(ChickWeight, n = 3)
##     weight Time Chick Diet
## 576    234   18    50    4
## 577    264   20    50    4
## 578    264   21    50    4

Thêm một ví dụ về một gói khác có kèm theo một số tập dữ liệu trong đó là tseries. Gói này không có sẵn trong R, do đó chúng ta cần cài đặt và tải nó lên workspace.

install.packages("tseries")
library(tseries)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo

Tương tự như trên, chúng ta dùng lệnh sau để biết thông tin về gói này và những tập dữ liệu có sẵn trong đó.

library(help="tseries")

Để sử dụng được một tập dữ liệu nào đó trong gói này chúng ta cần tải dữ liệu đó lên bằng hàm data().

data(ice.river)
ice.river[1:5,]
##      flow.vat flow.jok prec temp
## [1,]     16.1     30.2  8.1  0.9
## [2,]     19.2     29.0  4.4  1.6
## [3,]     14.5     28.4  7.0  0.1
## [4,]     11.0     27.8  0.0  0.6
## [5,]     13.6     27.8  0.0  2.0

Đọc dữ liệu từ tập tin bên ngoài

Đầu tiên chúng ta sẽ đọc dữ liệu từ tập tin định dạng bảng (table-format), tức là dạng tệp text có phần mở rộng là .txt. Bấm vào đây tải tệp định dạng bảng chứa dữ liệu và lưu ở một thư mục nào đó trong máy. Đây là dữ liệu về giải phẫu mèo nuôi trong nhà. Dữ liệu là một data frame gồm 3 biến là Sex: giống (F: cái, M: đực), Bwt: trọng lượng cơ thể (kg), Hwt: trọng lượng tim (g). Để đọc dữ liệu từ tập tin txt chúng ta dùng hàm read.table(). Để nhập dữ liệu vào R ta có một vài cách sau:

dframe <- read.table("cats.txt", header = T) # chọn header=TRUE nếu mỗi cột dữ liệu có tên (Sex,Bwt,Hwt).
head(dframe) # Xuất 6 dòng đầu
##   Sex Bwt Hwt
## 1   F 2.0 7.0
## 2   F 2.0 7.4
## 3   F 2.0 9.5
## 4   F 2.1 7.2
## 5   F 2.1 7.3
## 6   F 2.1 7.6
dframe <- read.table("D:/Stats program/Stats Intro/Practice/cats.txt", header = T)

Lưu ý: Trong code R phải đổi dấu \ (backslash: xuyệc ngược) trong đường dẫn thành dấu / (slash: xuyệc).

dframe <- read.table(file.choose(), header = T)

Bây giờ chúng ta sẽ đọc dữ liệu từ tập tin Excel. Bấm bào đây tải tập tin Excel chứa dữ liệu và lưu ở một thư mục nào đó trong máy. Tập tin Excel có phần mở rộng là .xlsx. Do đó để đọc dữ liệu từ tập tin Excel chúng ta cần đổi .xlsx sang .csv và sau đó dùng hàm read.csv().

Cách đổi .xlsx sang .csv: Mở tập tin Excel chứa dữ liệu \(\rightarrow\) File \(\rightarrow\) Save as \(\rightarrow\) Save as type: CSV (Comma delimited).

dframe <- read.csv(file.choose(), header = T)
head(dframe)
##   Sex Bwt Hwt
## 1   F 2.0 7.0
## 2   F 2.0 7.4
## 3   F 2.0 9.5
## 4   F 2.1 7.2
## 5   F 2.1 7.3
## 6   F 2.1 7.6
tail(dframe)
##     Sex Bwt  Hwt
## 139   M 3.6 15.0
## 140   M 3.7 11.0
## 141   M 3.8 14.8
## 142   M 3.8 16.8
## 143   M 3.9 14.4
## 144   M 3.9 20.5

Chúng ta có thể đọc dữ liệu từ tập tin được lưu trên web.

mydf <- read.csv("https://public.services.aad.gov.au/datasets/science/ASAC_2388/FishingGrounds.csv")
head(mydf)
##   GroundNo GroundNo2    Fishing.Ground Area       Location
## 1        0         1         Not Known HIMI     New Ground
## 2        1         2    Colgate Valley  MAC Colgate Valley
## 3        2         3     Aurora Trough  MAC  Aurora Trough
## 4        3         4      Grand Canyon  MAC   Grand Canyon
## 5        4         5 Grand Canyon Flat  MAC   Grand Canyon
## 6        5         6      Golden Track  MAC  Aurora Trough

Ghi dữ liệu ra tập tin

Để xuất dữ liệu dạng data frame ra tập tin .txt và .csv ta dùng hàm write.table()write.csv() tương ứng. Ở đây chúng ta phải tạo thư mục R trong ổ đĩa D để lưu tập tin.

write.table(dframe, file = "D:/R/mydata.txt", row.names = F, quote = F, sep = "\t")
write.csv(dframe, file = "D:/R/mydata.csv", row.names = F)

Lúc này, chúng ta vào thư mục R trong ổ đĩa D sẽ thấy hai tập tin mydata.txtmydata.csv.

Đọc/ghi đối tượng đặc biệt

Đối với các đối tượng như list (danh sách) hay array (mảng) chúng ta cần hàm dput() để ghi ra tập tin và hàm dget() để đọc từ tập tin.

somelist <- list(
  foo = c(5,2,45),
  bar = matrix(data = c(T, T, F, F, F, F, T, F, T), nrow = 3, ncol = 3),
  baz = factor(c(1, 2, 2, 3, 1, 1, 3), levels = 1:3, ordered = T)
)
somelist
## $foo
## [1]  5  2 45
## 
## $bar
##       [,1]  [,2]  [,3]
## [1,]  TRUE FALSE  TRUE
## [2,]  TRUE FALSE FALSE
## [3,] FALSE FALSE  TRUE
## 
## $baz
## [1] 1 2 2 3 1 1 3
## Levels: 1 < 2 < 3
dput(somelist, "D:/R/myRobject.txt")

Kiểm tra thư mục R trong ổ đĩa D chúng ta sẽ thấy tập tin myRobject.txt. Bây giờ chúng ta dùng hàm dget() để đọc dữ liệu từ tập tin này.

newobject <- dget("D:/R/myRobject.txt")
newobject
## $foo
## [1]  5  2 45
## 
## $bar
##       [,1]  [,2]  [,3]
## [1,]  TRUE FALSE  TRUE
## [2,]  TRUE FALSE FALSE
## [3,] FALSE FALSE  TRUE
## 
## $baz
## [1] 1 2 2 3 1 1 3
## Levels: 1 < 2 < 3

Bài tập 8.1.

  1. Trong package datasets có tập dữ liệu quakes. Hãy mở cửa sổ chứa thông tin về tập dữ liệu này để biết thêm thông tin. Sau đó hãy thực hiện các yêu cầu sau:
    1. Trích các quan trắc có mag lớn hơn hoặc bằng 5 và ghi dữ liệu này ra tập tin định dạng bảng (file txt) đặt tên là q5.txt và lưu ở một thư mục nào đó.
    2. Đọc dữ liệu từ tập tin vừa ghi ở (i) và đặt tên là q5.dframe.
  2. Trong package car có data frame tên là Duncan. Hãy cài gói car, truy cập dữ liệu Duncan và hiện thị cửa sổ thông tin về dữ liệu này.
  3. Tạo một list đặt tên là exer chứa 3 tập dữ liệu: quakes, q5.dframeDuncan. Sau đó hãy thực hiện các yêu cầu sau:
    1. Ghi đối tượng list thành một tập tin tên Exercise8-1.txt. Từ tệp vừa ghi hãy mở xem thông tin bên trong.
    2. Đọc dữ liệu từ tập tin Exercise8-1.txt và đặt tên là list.of.dataframes. Kiểm tra xem list.of.dataframes có chứa đúng 3 đối tượng được ghi.

Tóm tắt

Hàm/Toán tử Ý nghĩa
data() Tải dữ liệu từ các gói
head() Trích phần đầu của một đối tượng
tail() Trích phần cuối của một đối tượng
read.table() Nhập dữ liệu từ tệp định dạng bảng
read.csv() Nhập dữ liệu từ tệp Excel với phần mở rộng là .csv
write.table() Ghi dữ liệu ra tệp định dạng bảng
write.csv() Ghi dữ liệu ra tệp Excel (.csv)
dput() Ghi đối tượng trong R ra tập tin
dget() Nhập đối tượng từ tập tin

Tài liệu tham khảo

Davies, Tilman M. 2016. The Book of R: A First Course in Programming and Statistics. No Starch Press.