You are on page 1of 28

Chương 3

Dữ liệu và một số thao tác tiền


xử lý dữ liệu

. . . .
. .
. . . .
. .
. . . .
. .
. . . .
. .
. . . .
. .
. . . .
. .
. . . .

Yêu cầu đối với sinh viên

• Biết cách thực hiện phép toán và dùng hàm tính toán đơn giản.

• Biết cách nhập, biên tập và truy cập dữ liệu.

• Biết cách tạo dữ liệu bằng một số hàm thông dụng.

• Biết cách nhập dữ liệu từ những tệp có sẵn.

• Biết cách chọn mẫu ngẫu nhiên.

22
3.1. Phép toán, hàm tính toán và những tính toán đơn giản 23

Nhập dữ liệu, tính toán trên dữ liệu và xử lí dữ liệu là những thao tác không thể thiếu trong thống
kê. Trong phần này, ta sẽ xem cách nhập dữ liệu cũng như những thao tác đầu tiên về xử lí dữ
liệu trên R.

3.1 Phép toán, hàm tính toán và những tính toán đơn giản
Những phép toán trong R giúp thực hiện các tính toán. Bảng sau cho ta một số phép toán phổ
biến trong R:

Phép toán số học Phép toán so sánh Phép toán logic


+ cộng < nhỏ hơn ! phủ định
- trừ > lớn hơn & và
 nhân <= nhỏ hơn hoặc bằng | hoặc
/ chia >= lớn hơn hoặc bằng xor tuyển loại
^ lũy thừa == bằng

Ta minh họa một vài thao tác sử dụng những phép toán này:

> #Cộng và trừ


> 20 + 568 - 100
[1] 488
> #Nhân và chia
> 12*15/8
[1] 22.5
> #Lũy thừa
> 15^2
[1] 225
> # Vài thao tác dùng phép toán so sánh và logic
> 3<5
[1] TRUE
> 3<5& 5<10
[1] TRUE
> 6!=2
[1] TRUE
> !6!=2
[1] FALSE
> 3<=4
[1] TRUE
> 3<5 | 5>10
[1] TRUE
> xor(2==1,3>=5)
[1] TRUE

Các phép toán này không chỉ áp dụng cho những phần tử đơn lẻ, mà có thể thực hiện trên một
dãy gồm nhiều phần tử (véc tơ):

> x = c(1, 3, 5, 7, 9)
> y = c(2, 4, 6, 8, 10)

> #Cộng véc tơ với một số


> x + 2
[1] 3 5 7 9 11
> #Nhân một véc tơ với một số
> 2*x
[1] 2 6 10 14 18
24 Chương 3. Dữ liệu và một số thao tác tiền xử lý dữ liệu

> #Chia véc tơ cho một số


> x/5
[1] 0.2 0.6 1.0 1.4 1.8
> #Nâng lũy thừa một véc tơ
> x^2
[1] 1 9 25 49 81
> #Cộng hai véc tơ
> x + y
[1] 3 7 11 15 19
> #Nhân hai véc tơ với nhau
> x*y
[1] 2 12 30 56 90
> #Chia hai véc tơ cho nhau
> x/y
[1] 0.5000000 0.7500000 0.8333333 0.8750000 0.9000000
> #Lũy thừa các phần tử trong x với số mũ trong y
> x^y
[1] 1 81 15625 5764801 3486784401
> x<5
[1] TRUE TRUE FALSE FALSE FALSE
> !x<5
[1] FALSE FALSE TRUE TRUE TRUE
> y==6
[1] FALSE FALSE TRUE FALSE FALSE
> (x<5)&(y==6)
[1] FALSE FALSE FALSE FALSE FALSE
> (x<5)|(y==6)
[1] TRUE TRUE TRUE FALSE FALSE

Ngoài những phép toán, R cung cấp rất nhiều hàm tính toán để người sử dụng có thể thực hiện
những tính toán khác nhau. Bảng dưới đây liệt kê một số hàm tính toán đơn giản trong R, những
hàm này có thể áp dụng cho một số hay một véc tơ gồm nhiều số:

x là một véc tơ số
Hàm Công dụng
abs(x) Tính giá trị tuyệt đối các số trong x
sqrt(x) Tính căn bậc hai của các số trong x
floor(x) Tính sàn của các số trong x
ceiling(x) Tính trần của các số trong x
round(x,digits=k) Tính số làm tròn của các số trong x đến k chữ số thập phân
exp(x) Tính lũy thừa cơ số e của các số trong x
log(x, base=a) Tính logarit cơ số a của các số trong x, mặc định cơ số e
cos(x),sin(x),tan(x) Tính cos, sin, tg của các số trong x
choose(n,x) Tính số tổ hợp chập x của n
sum(x) Tính tổng các số trong x
prod(x) Tính tích các số trong x
max(x) Đưa ra số lớn nhất của x
min(x) Đưa ra số nhỏ nhất của x
range(x) Đưa ra số nhỏ nhất và lớn nhất của x
cumsum(x) Tính tổng tích lũy các số trong x
cumprod(x) Tính tích tích lũy các số trong x
cummax(x) Tính số lớn nhất tính đến từng vị trí của từng số trong x
cummin(x) Tính số nhỏ nhất tính đến từng vị trí của từng số trong x
3.1. Phép toán, hàm tính toán và những tính toán đơn giản 25

Bạn đọc sẽ hiểu kĩ hơn cách dùng những hàm này qua đoạn lệnh sau:

> #Tính lũy thừa cơ số e


> exp(3)
[1] 20.08554

> #Tính logarit cơ số 10


> log(100, base=10)
[1] 2
> #Logarit cơ số e
> log(5)
[1] 1.609438

> #Tính giá trị tuyệt đối


> abs(-8)
[1] 8
> #Tính căn bậc 2
> sqrt(4)
[1] 2
> #Tính giá trị hàm lượng giác
> cos(pi)
[1] -1

> #Làm tròn


> round(3.45)
[1] 3
> round(3.7)
[1] 4
> round(3.45, digits=1)
[1] 3.5
> #Tính số tổ hợp chập 2 của 5 phần tử
> choose(5,2)
[1] 10
> #Tính số hoán vị của 5 phần tử
> prod(1:5)
[1] 120

> #Nhập véc tơ x


> x = c(1,4,2,9,5)
> exp(x)
[1] 2.718282 54.598150 7.389056 8103.083928 148.413159
> log(x)
[1] 0.0000000 1.3862944 0.6931472 2.1972246 1.6094379
> sqrt(x)
[1] 1.000000 2.000000 1.414214 3.000000 2.236068

> #Tính tổng các phần tử của x


> sum(x)
[1] 21
> #Tính tích các phần tử của x
> prod(x)
[1] 360
> #Tính tổng tích lũy
> cumsum(x)
[1] 1 5 7 16 21
> #Tính giá trị lớn nhất tích lũy
> cummax(x)
[1] 1 4 4 9 9
26 Chương 3. Dữ liệu và một số thao tác tiền xử lý dữ liệu

3.2 Ma trận và phép toán trên ma trận


Một ma trận trong R được tạo bởi hàm matrix với các tham số cụ thể như sau:

matrix(data, nrow, ncol, byrow)

Trong đó

data véc tơ các phần tử của ma trận.


nrow số dòng của ma trận, mặc định là 1.
ncol số cột của ma trận, mặc định là 1.
byrow tham số logic xác định việc sắp xếp các phần tử trong data theo hàng
hay theo cột, mặc định byrow = FALSE, tức là sắp xếp theo cột.

Chẳng hạn, ta có ma trận A:  


1 4 7
A = 2 5 8 .
3 6 9
Để tạo ra ma trận A trong R, ta thực hiện như sau:

> x = c(1,2,3,4,5,6,7,8,9)
> A = matrix(x, nrow=3)
> A
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9

Khi khai báo tham số byrow = T các phần tử của véc tơ x sẽ được sắp xếp theo hàng:

> B = matrix(data = x, nrow=3, byrow=T)


> #hoặc B = matrix(x, nrow=3, byrow=T)
> B
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9

Các phép toán đơn giản trên ma trận được thực hiện như sau:

> #Phép chuyển vị ma trận


> B = t(A)
> B
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
> #Phép cộng ma trận
> A + B
[,1] [,2] [,3]
[1,] 2 6 10
[2,] 6 10 14
[3,] 10 14 18
> #Phép trừ ma trận
3.2. Ma trận và phép toán trên ma trận 27

> A - B
[,1] [,2] [,3]
[1,] 0 2 4
[2,] -2 0 2
[3,] -4 -2 0
> #Nhân ma trận với một số
> 2*A
[,1] [,2] [,3]
[1,] 2 8 14
[2,] 4 10 16
[3,] 6 12 18
> #Nhân hai ma trận với nhau
> A %*% B
[,1] [,2] [,3]
[1,] 66 78 90
[2,] 78 93 108
[3,] 90 108 126

R cung cấp cho ta một số hàm đơn giản để tính định thức, hạng hay véc tơ riêng của ma trận:

> #Định thức của ma trận


> det(A)
[1] 0

> #Hạng của ma trận


> qr(A)$rank
[1] 2

> #Giá trị riêng và véc tơ riêng của ma trận


> eigen(A)
$values
[1] 1.611684e+01 -1.116844e+00 -4.054214e-16

$vectors
[,1] [,2] [,3]
[1,] -0.4645473 -0.8829060 0.4082483
[2,] -0.5707955 -0.2395204 -0.8164966
[3,] -0.6770438 0.4038651 0.4082483

Ngoài ra bằng những hàm đơn giản ta có thể tính được ma trận nghịch đảo của một ma trận và
từ đó tìm được nghiệm của một hệ phương trình Crammer.
Xét hệ phương trình tuyến tính
$
& x  y + z = 1
% 2xx +

2y + 2z = 3
3y  5z = 0.

Nhận thấy ma trận hệ số của hệ có định thức bằng 4 khác không nên có nghịch đảo. Từ đó hệ
trên là hệ crammer và có nghiệm duy nhất dạng X = A1 B. Các nghiệm này được tính toán
trên R như sau:

> #Nhập ma trận hệ số


> A = matrix(c(1,-1,2,-1,2,-3,1,2,-5), nrow=3)
> A
[,1] [,2] [,3]
[1,] 1 -1 1
28 Chương 3. Dữ liệu và một số thao tác tiền xử lý dữ liệu

[2,] -1 2 2
[3,] 2 -3 -5
> #Nhập ma trận hệ số tự do
> B = matrix(c(1,3,0),nrow=3)
> #Định thức của ma trận hệ số
> det(A)
[1] -4

> #Ma trận nghịch đảo của A


> A.nd = solve(A)
> A.nd
[,1] [,2] [,3]
[1,] 1.00 2.00 1.00
[2,] 0.25 1.75 0.75
[3,] 0.25 -0.25 -0.25

> #Nghiệm của hệ phương trình tuyến tính


> X = A.nd %*% B
> X
[,1]
[1,] 7.0
[2,] 5.5
[3,] -0.5

Từ những kết quả tính toán, ta thấy hệ phương trình đã cho có nghiệm duy nhất là: x = 7,
y = 5, 5 và z = 0, 5.
Chú ý: Để thực hiện những tính toán chuyên biệt về ma trận, ta có thể cài đặt và sử dụng gói
matrix.

3.3 Véc tơ dữ liệu


3.3.1 Nhập dữ liệu dạng véc tơ
Để nhập một dữ liệu dạng véc tơ trong R, ta có thể dùng hàm c hoặc hàm scan. Giả sử ta có
một véc tơ chỉ số lỗi chính tả trong 10 trang sách đầu tiên của một cuốn sách:
2305107027
Dữ liệu trên có thể được nhập vào R bằng hàm c như sau:
> SoLoi = c(2, 3, 0, 5, 1, 0, 7, 0, 2, 7)
> SoLoi
[1] 2 3 0 5 1 0 7 0 2 7
> is.vector(SoLoi)
[1] TRUE

Hoặc nhập bằng hàm scan:


> SoLoi = scan()
1: 2 3 0 5 1 0 7 0 2 7
11:
Read 10 items
> # (ENTER hai lần để kết thúc việc nhập dữ liệu)
> SoLoi
[1] 2 3 0 5 1 0 7 0 2 7
> is.vector(SoLoi)
[1] TRUE
3.3. Véc tơ dữ liệu 29

Chú ý: Khi nhập dữ liệu bằng hàm c hoặc hàm scan, ta nên lưu ý sự khác biệt của hai hàm
này như sau:

• Hàm c có thể nhập dữ liệu dạng kí tự nhưng hàm scan chỉ nhập được dữ liệu dạng số.
> GioiTinh = c("Nam", "Nu", "Nu", "Nam")
> GioiTinh
[1] "Nam" "Nu" "Nu" "Nam"

> GioiTinh = scan()


1: Nam Nu Nu Nam
Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,:
scan() expected 'a real', got 'Nam'

• Hàm scan, trong một số trường hợp, giúp ta có thể copy dữ liệu từ những cột trong những
tệp có sẵn từ excel file, text file,... nhưng ta không áp dụng được những thao tác kiểu này
cho hàm c.

3.3.2 Biên tập dữ liệu


Mỗi phần tử trong một véc tơ được xác định bởi địa chỉ là thứ tự của phần tử đó trong véc tơ.
Ta có thể thay đổi, thêm vào hay bớt đi một số phần tử của véc tơ bằng cách truy cập vào địa
chỉ của những phần tử đó. Chẳng hạn, trên véc tơ SoLoi ta có thể thực hiện:

> #Sao chép SoLoi sang SoLoi1


> SoLoi1 = SoLoi
> SoLoi1
[1] 2 3 0 5 1 0 7 0 2 7
> #Sửa số lỗi ở trang đầu tiên thành 1
> SoLoi1[1] = 1
> SoLoi1
[1] 1 3 0 5 1 0 7 0 2 7
> #Sửa số lỗi trong trang 2,4,6
> SoLoi1[c(2,4,6)]=c(1,2,3)
> SoLoi1
[1] 1 1 0 2 1 3 7 0 2 7

Ta cũng có thể thêm vào hay bớt đi một số phần tử của véc tơ:

> SoLoi1[11:15] = c(1, 2, 0, 3, 1) # thêm số lỗi của 5 trang sau


> SoLoi1
[1] 1 1 0 2 1 3 7 0 2 7 1 2 0 3 1
> SoLoi1[-(1:3)] # bỏ ra khỏi véc tơ số lỗi 3 trang đầu tiên
[1] 2 1 3 7 0 2 7 1 2 0 3 1

hoặc cũng có thể ghép nhiều véc tơ dữ liệu lại với nhau:

> SoLoi1 = SoLoi


> SoLoi2 = c(1, 4, 0, 5, 2, 3, 1, 0, 2, 5) # Số lỗi trong 10 trang kế tiếp
> GhepSoLoi = c(SoLoi1, SoLoi2)
> GhepSoLoi
[1] 1 1 0 2 1 3 7 0 2 7 1 4 0 5 2 3 1 0 2 5

Tương tự, để ghép n véc tơ dữ liệu có tên x1, x2, . . . , xn lại với nhau theo thứ tự này, ta dùng
hàm c như trên:
30 Chương 3. Dữ liệu và một số thao tác tiền xử lý dữ liệu

> z = c(x1, x2,.., xn)

Ngoài cách truy cập vào địa chỉ, ta có thể sửa, thêm, bớt phần tử của véc tơ bằng hàm edit.
Chẳng hạn để biên tập véc tơ SoLoi và lưu kết quả vào véc tơ có tên SoLoi3 ta làm như sau:

> SoLoi3=edit(SoLoi)

Màn hình làm việc sẽ xuất hiện cửa sổ biên tập dữ liệu R Editor. Tại cửa sổ này ta trực tiếp
chỉnh sửa, thêm, bớt phần tử của véc tơ.

Và kết thúc bằng cách đóng cửa sổ biên tập dữ liệu, xác nhận có lưu những thay đổi đã thực
hiện hay không:

3.3.3 Truy cập dữ liệu


Để truy cập vào một véc tơ ta có thể tham khảo bảng lệnh sau:

x là một véc tơ
Lệnh Công dụng
length(x) Tính số phần tử của x
x[i] Đưa ra phần tử thứ i của x
x[-i] Đưa ra mọi phần tử trừ phần tử thứ i của x
x[1:k] Đưa ra k phần tử đầu của x
x[(length(x)- Đưa ra k phần tử cuối
k+1):length(x)]
x[c(i,j,k)] Đưa ra phần tử ở vị trí i, j , k của x
3.3. Véc tơ dữ liệu 31

x[x>α] Đưa ra những phần tử lớn hơn α


x[x>α & x<β] Đưa ra những phần tử lớn hơn α và nhỏ hơn β
sum(x>α) Tính số phần tử lớn hơn α trong x
which(x==α) Đưa ra vị trí của những phần tử trong x bằng α
which(x==max(x)) Đưa ra vị trí của những phần tử lớn nhất trong x
which.max(x) Đưa ra vị trí đầu tiên của phần tử lớn nhất trong x
subset(x,subset) Đưa ra một tập con của x với điều kiện nêu trong tham
số subset

Đoạn lệnh sau cho ta một số thông tin khi truy cập vào véc tơ chỉ số lỗi của 10 trang đánh máy
trên:

> #Số trang tìm lỗi


> length(SoLoi)
[1] 10
> #Số lỗi ở trang thứ 5
> SoLoi[5]
[1] 1
> #Số lỗi ở trang 2, 5, 7
> SoLoi[c(2,5,7)]
[1] 3 1 7
> #Những số lỗi lớn hơn 3
> SoLoi[SoLoi > 3]
[1] 5 7 7
> #hoặc
> subset(SoLoi>3)
[1] 5 7 7
> #Những số lỗi lớn hơn 3 và nhỏ hơn 6
> SoLoi[SoLoi > 3 & SoLoi < 6]
[1] 5
> #hoặc
> subset(SoLoi > 3 & SoLoi < 6)
> #Số trang có số lỗi lớn hơn 3
> sum(SoLoi > 3)
[1] 3
> #Những trang không có lỗi nào
> which(SoLoi == 0)
[1] 3 6 8
> #Những trang có lớn hơn hay bằng 3 lỗi
> which(SoLoi >=3)
[1] 6 7 10 14
> #Những trang có nhiều lỗi nhất
> which(SoLoi == max(SoLoi))
[1] 7 10
> #Số lỗi lớn nhất
> max(SoLoi)
[1] 7
> #Trang đầu tiên có nhiều lỗi nhất
> which.max(SoLoi == max(SoLoi))
[1] 7
32 Chương 3. Dữ liệu và một số thao tác tiền xử lý dữ liệu

3.3.4 Loại bỏ số liệu trống


Trong trường hợp tập dữ liệu có chứa số liệu trống NA (Not Available) ta có thể loại những số
liệu trống đó bằng hàm na.omit. Chẳng hạn, khi nhập thêm số lỗi của 5 trang đánh máy tiếp
theo nhưng số liệu thứ 13 bị trống:

> SoLoi2 = c(1, 0, NA, 5, 2)


> is.na(SoLoi2)
[1] FALSE FALSE TRUE FALSE FALSE
> sum(SoLoi2)
[1] NA

Ta loại đi số liệu trống ở trang thứ 13 như sau:

> SoLoi3 = na.omit(SoLoi2)


> SoLoi3
[1] 1 0 5 2
attr(,"na.action")
[1] 3
attr(,"class")
[1] "omit"
> sum(SoLoi3)
[1] 8

3.3.5 Chuyển dữ liệu số thành dữ liệu định danh


Giả sử ta đánh giá về số lỗi của một trang đánh máy thành ba mức: ít (dưới 2 lỗi), bình thường
(từ 2 đến 5 lỗi), nhiều (trên 5 lỗi). Ta tạo ra véc tơ định danh PhanLoai để mã hóa véc tơ
SoLoi với ba mức IT, BT, NHIEU như sau:

> SoLoi = c(2, 3, 0, 5, 1, 0, 7, 0, 2, 7)


> PhanLoai = SoLoi
> #Trước khi mã hóa
> PhanLoai
[1] 2 3 0 5 1 0 7 0 2 7

> #Mã hóa


> PhanLoai[SoLoi < 2] = "IT"
> PhanLoai[SoLoi >= 2 & SoLoi <= 5] = "BT"
> PhanLoai[SoLoi > 5] = "NHIEU"

> #Sau khi mã hóa


> PhanLoai
[1] "BT" "BT" "IT" "BT" "IT" "IT" "NHIEU" "IT" "BT"
[10] "NHIEU"

Ta có thể kết hợp hai véc tơ SoLoi và PhanLoai thành một bảng dữ liệu (data frame) bằng
hàm data.frame:

> data.frame(SoLoi, PhanLoai)


SoLoi PhanLoai
1 2 BT
2 3 BT
3 0 IT
4 5 BT
5 1 IT
3.4. Bảng dữ liệu 33

6 0 IT
7 7 NHIEU
8 0 IT
9 2 BT
10 7 NHIEU

3.3.6 Biến đổi véc tơ định danh thành véc tơ nhân tố


Véc tơ PhanLoai trên đây là một véc tơ định danh với giá trị là những xâu kí tự. Để chuyển
véc tơ PhanLoai này thành véc tơ lưu dữ liệu dạng thứ bậc, ta dùng hàm factor:

> PhanLoai = factor(PhanLoai, level=c("IT", "BT", "NHIEU"))


> PhanLoai
[1] BT BT IT BT IT IT NHIEU IT BT NHIEU
Levels: IT BT NHIEU

3.4 Bảng dữ liệu


3.4.1 Nhập dữ liệu dạng bảng
Giả sử ta có một tập dữ liệu dạng bảng cho thông tin về chiều cao, cân nặng và giới tính của 5
sinh viên như sau:

Chiều cao Cân nặng Giới tính


170 65 Nam
165 50 Nam
150 45 Nu
158 60 Nu
166 53 Nam

Dữ liệu trên có thể được nhập thành một bảng (data frame) trong R bằng cách nhập từng cột vào
một véc tơ rồi ghép chúng lại với nhau bằng hàm data.frame:

data.frame(..., row.names, stringsAsFactors)

trong đó

... tên các cột của bảng dữ liệu.


row.names tên các dòng.
stringsAsFactors tham số logic, TRUE/FALSE tương ứng có/không chuyển
các biến kiểu xâu kí tự thành yếu tố.

> ChieuCao = c(170, 165, 150, 158, 166)


> CanNang = c(65, 50, 45, 60, 53)
> GioiTinh = c("Nam", "Nam", "Nu", "Nu", "Nam")
> DuLieu = data.frame(ChieuCao, CanNang, GioiTinh)
> DuLieu
ChieuCao CanNang GioiTinh
1 170 65 Nam
2 165 50 Nam
3 150 45 Nu
4 158 60 Nu
34 Chương 3. Dữ liệu và một số thao tác tiền xử lý dữ liệu

5 166 53 Nam

> is.data.frame(DuLieu)
[1] TRUE

Ngoài cách trên ta có thể nhập dữ liệu vào bảng dữ liệu trong R bằng cách sử dụng hàm edit.
Để nhập dữ liệu theo cách này, tại cửa sổ dòng lệnh ta gõ lệnh:

> DuLieu = edit(data.frame())

Sau dòng lệnh này R sẽ xuất hiện cửa sổ biên tập dữ liệu (Data Editor) để nhập dữ liệu vào
từng ô tương ứng trong hình sau:

Để nhập dữ liệu, chẳng hạn cho cột ChieuCao, đầu tiên nhấp chuột vào ô var1 để mở cửa sổ
Variable editor, tại cửa sổ này chọn tên cột và kiểu dữ liệu cho cột:

• Chọn variable name là ChieuCao;

• Chọn type là numeric.

và sau đó nhập dữ liệu vào trong các ô của cột. Nhập dữ liệu cho các cột còn lại cũng được tiến
hành tương tự.
Để kết thúc việc nhập dữ liệu, ta đóng cửa sổ biên tập dữ liệu và khi đó trong cửa sổ dòng lệnh
R Console đã có một đối tượng tên là DuLieu.

3.4.2 Biên tập dữ liệu


Trong một bảng dữ liệu, mỗi dòng, mỗi cột đều được xác định bởi địa chỉ là thứ tự hoặc tên của
dòng, cột đó. Địa chỉ của mỗi ô trong bảng dữ liệu được xác định bởi địa chỉ của dòng và cột
chứa ô đó. Địa chỉ của dòng, cột, ô được khai báo trong kí hiệu [,].
Sau đây ta minh họa một số thao tác thay đổi, thêm bớt dữ liệu trên bảng DuLieu.
3.4. Bảng dữ liệu 35

> #Đổi tên cho các cột bằng hàm colnames hoặc names
> colnames(DuLieu) = c("CC","CN","GT")
> DuLieu
CC CN GT
1 170 65 Nam
2 165 50 Nam
3 150 45 Nu
4 158 60 Nu
5 166 53 Nam

> #Đặt tên cho các dòng bằng hàm rownames


> rownames(DuLieu) = c("Vu", "Hieu", "Hoa", "Thuy", "Nam")
> DuLieu
C1 C2 C3
Vu 170 65 Nam
Hieu 165 50 Nam
Hoa 150 45 Nu
Thuy 158 60 Nu
Nam 166 53 Nam

> DuLieu
ChieuCao CanNang GioiTinh
1 170 65 Nam
2 165 50 Nam
3 150 45 Nu
4 158 60 Nu
5 166 53 Nam

> # Sửa chiều cao của sinh viên thứ 3 thành 160 (sửa ô ở dòng 3, cột 1)
> DuLieu[3,1] = 160
> DuLieu
ChieuCao CanNang GioiTinh
1 170 65 Nam
2 165 50 Nam
3 160 45 Nu
4 158 60 Nu
5 166 53 Nam

Như đã nói trên, địa chỉ DuLieu[3,1] có thể khai báo theo những cách khác: DuLieu["3","ChieuCao"]
hoặc DuLieu[3,"ChieuCao"] hoặc DuLieu["3",1]
Khi muốn thêm vào bảng dữ liệu một số cột, chẳng hạn thêm cột quê quán và tuổi của 5 sinh
viên nói trên, ta làm như sau:

> #Nhập dữ liệu cột quê quán và cột tuổi


> QueQuan = c("HaNoi", "QuangNinh", "NgheAn", "NamDinh", "LangSon")
> Tuoi = c(23, 22, 20, 25, 19)
> # Ghép hai cột quê quán và tuổi vào bảng dữ liệu
> DuLieu = data.frame(DuLieu, QueQuan, Tuoi)
> DuLieu
ChieuCao CanNang GioiTinh QueQuan Tuoi
1 170 65 Nam HaNoi 23
2 165 50 Nam QuangNinh 22
3 150 45 Nu NgheAn 20
4 158 60 Nu NamDinh 25
5 166 53 Nam LangSon 19

Hoặc ta cũng có thể ghép thêm cột vào bảng dữ liệu theo cách sau:
36 Chương 3. Dữ liệu và một số thao tác tiền xử lý dữ liệu

> DuLieu[,4:5] = c(QueQuan, Tuoi)


> DuLieu
ChieuCao CanNang GioiTinh V4 V5
1 170 65 Nam HaNoi 23
2 165 50 Nam QuangNinh 22
3 150 45 Nu NgheAn 20
4 158 60 Nu NamDinh 25
5 166 53 Nam LangSon 19

sau đó đổi tên hai cột cuối


> names(DuLieu)[4:5]=c("QueQuan", "Tuoi")
> DuLieu
ChieuCao CanNang GioiTinh QueQuan Tuoi
1 170 65 Nam HaNoi 23
2 165 50 Nam QuangNinh 22
3 150 45 Nu NgheAn 20
4 158 60 Nu NamDinh 25
5 166 53 Nam LangSon 19

Việc thêm một số dòng vào bảng dữ liệu được làm tương tự như đối với cột. Ngoài ra, ta có thể
thực hiện việc thêm cột hay dòng vào bảng dữ liệu nhờ hàm cbind (cho cột) và rbind (cho
dòng). Cách dùng hai hàm này được minh họa qua đoạn lệnh sau:
> DuLieu = data.frame(ChieuCao, CanNang, GioiTinh)
> #Ghép thêm cột quê quán và tuổi
> DuLieu = cbind(DuLieu, QueQuan, Tuoi)
> DuLieu
ChieuCao CanNang GioiTinh QueQuan Tuoi
1 170 65 Nam HaNoi 23
2 165 50 Nam QuangNinh 22
3 150 45 Nu NgheAn 20
4 158 60 Nu NamDinh 25
5 166 53 Nam LangSon 19

> #Ghép thêm hai dòng cho thông tin của 2 sinh viên
> DuLieu = rbind(DuLieu, DuLieuThem)
> DuLieu
ChieuCao CanNang GioiTinh QueQuan Tuoi
1 170 65 Nam HaNoi 23
2 165 50 Nam QuangNinh 22
3 150 45 Nu NgheAn 20
4 158 60 Nu NamDinh 25
5 166 53 Nam LangSon 19
6 150 48 Nu CaoBang 21
7 170 70 Nam HaNoi 19

Sử dụng địa chỉ của ô, dòng, cột để thay đổi, thêm hoặc bớt dữ liệu vào bảng rất tiện lợi đối với
những bảng dữ liệu cỡ lớn. Đối với bảng dữ liệu cỡ nhỏ, ta có thể sử dụng hàm edit hoặc dùng
hàm fix để thực hiện các thao tác trên. Chẳng hạn, để sửa bảng DuLieu, ta làm như sau:
> DuLieu = edit(DuLieu)
> #Hoặc
> fix(DuLieu)

Khi đó dữ liệu trong bảng DuLieu sẽ xuất hiện trên cửa sổ R Data Editor cho phép ta tiến
hành những thao tác biên tập theo ý muốn. Việc biên tập sẽ kết thúc sau khi cửa sổ này được
đóng lại.
3.4. Bảng dữ liệu 37

Đối với hàm edit, bảng dữ liệu sau khi chỉnh sửa cần được đặt tên (kể cả khi dùng lại tên cũ),
còn hàm fix tự động cập nhật những thay đổi vào bảng dữ liệu cũ, việc đặt tên chỉ có ý nghĩa
sao chép bảng dữ liệu để tạo ra một đối tượng có cùng nội dung nhưng với tên gọi khác.
Trong ví dụ trên, bảng dữ liệu sau khi thay đổi vẫn giữ tên DuLieu, nếu ta muốn phân biệt bảng
dữ liệu ban đầu và bảng dữ liệu sau khi biên tập ta có thể làm như sau:

> DuLieuMoi = edit(DuLieu) # hoặc edit(data.frame(DuLieu))

3.4.3 Truy cập dữ liệu


Trong phần này, ta sẽ thực hiện các thao tác trên bảng dữ liệu DuLieu để minh họa cách truy
cập vào một bảng dữ liệu trong R. Ta có thể tham khảo một số lệnh cơ bản trong bảng sau:

A là một bảng dữ liệu


Lệnh Công dụng
dim(A) Cho biết số dòng và số cột của A
nrow(A) Cho biết số dòng của A
ncol(A) Cho biết số cột của A
colnames(A)/names(A) Cho biết tên cột của A
rownames(A) Cho biết tên dòng của A
A[i,j] Cho biết giá trị của phần tử ở dòng i, cột j của A
A[i,] Cho biết dòng i của A
A[,j] Cho biết cột j của A
A[c(i,j,k),] Cho biết dòng i, j, k của A
A[,c(i,j,k)] Cho biết cột i, j, k của A
subset(A, subset) Đưa ra những phần tử trong A thỏa mãn điều kiện
trong tham số subset
38 Chương 3. Dữ liệu và một số thao tác tiền xử lý dữ liệu

> DuLieu
ChieuCao CanNang GioiTinh
1 170 65 Nam
2 165 50 Nam
3 150 45 Nu
4 158 60 Nu
5 166 53 Nam

Đoạn lệnh sau cho một số thông tin của nhóm sinh viên khi truy cập vào bảng DuLieu.
> #Tên các cột
> names(DuLieu)
[1] "ChieuCao" "CanNang" "GioiTinh"
> #Số dòng và số cột
> dim(DuLieu)
[1] 5 3

> #Chiều cao của sinh viên thứ 4


> DuLieu[4,1]
[1] 158
> # Dữ liệu về sinh viên thứ 3
> DuLieu[3,]
ChieuCao CanNang GioiTinh
3 150 45 Nu
> #Thông tin về sinh viên thứ 2 và thứ 5
> DuLieu[c(2,5),]
ChieuCao CanNang GioiTinh
2 165 50 Nam
5 166 53 Nam
> #Thông tin về giới tính của nhóm sinh viên
> DuLieu[,3]
[1] Nam Nam Nu Nu Nam
Levels: Nam Nu
> # hoặc ta có thể làm như sau
> DuLieu[,"GioiTinh"]
[1] Nam Nam Nu Nu Nam
Levels: Nam Nu

Ta cũng có thể đưa ra những phần tử trong bảng dữ liệu thỏa mãn một hoặc một số điều kiện
nào đó bằng cách sử dụng hàm subset. Chẳng hạn để lấy dữ liệu về những sinh viên nữ, ta
thực hiện:
> subset(DuLieu, GioiTinh == "Nu")
ChieuCao CanNang GioiTinh
3 150 45 Nu
4 158 60 Nu

Để đưa ra những phần tử của bảng dữ liệu thỏa mãn một số điều kiện, ta dùng các toán tử logic
để kết hợp các điều kiện với nhau. Ví dụ muốn lấy dữ liệu của những sinh viên nam có chiều
cao trên 160, ta thực hiện:
> subset(DuLieu, GioiTinh == "Nam" & ChieuCao > 160)
ChieuCao CanNang GioiTinh
1 170 65 Nam
5 166 53 Nam

Một thao tác thường gặp trên bảng dữ liệu là lấy ra dữ liệu ở một cột nào đó. Ngoài cách sử
dụng địa chỉ của cột như trong ví dụ trên, ta có thể sử dụng trực tiếp tên cột để truy cập vào các
cột dữ liệu. Tuy nhiên, với cột ChieuCao:
3.4. Bảng dữ liệu 39

> ChieuCao
Error: object 'ChieuCao' not found

R báo lỗi vì ChieuCao hiện tại là một cột trong đối tượng DuLieu chứ không phải là một đối
tượng đang được làm việc trực tiếp. Để lấy ra cột ChieuCao ta có thể làm theo một số cách
sau:

• Sử dụng toán tử $:

> DuLieu$ChieuCao
[1] 170 165 150 158 166

• Dùng hàm attach:

> attach(DuLieu)
> ChieuCao
[1] 170 165 150 158 166

Hàm attach giúp truy cập vào cột dữ liệu trong một bảng dữ liệu bằng tên cột, để kết thúc
công việc này, ta dùng hàm detach:

> detach(DuLieu)
> ChieuCao
Error: object 'ChieuCao' not found

3.4.4 Loại bỏ số liệu trống


Tương tự trường hợp dữ liệu dạng véc tơ, hàm na.omit được dùng để loại đi số liệu trống
(NA) trong bảng dữ liệu. Chẳng hạn ta có bảng dữ liệu:

> DuLieuMoi
ChieuCao CanNang GioiTinh
1 170 65 Nam
2 165 50 Nam
3 150 45 Nu
4 158 60 Nu
5 166 53 Nam
6 160 50 <NA>

Ta loại đi dữ liệu trống trong bảng:

> na.omit(DuLieuMoi)
ChieuCao CanNang GioiTinh
1 170 65 Nam
2 165 50 Nam
3 150 45 Nu
4 158 60 Nu
5 166 53 Nam

và kết quả cho ta thấy R loại bỏ toàn bộ dòng chứa dữ liệu trống.
40 Chương 3. Dữ liệu và một số thao tác tiền xử lý dữ liệu

3.5 Lưu dữ liệu


Các véc tơ, bảng dữ liệu đã tạo ra có thể lưu lại để sử dụng trong các phân tích về sau. R có thể
giúp ta lưu dữ liệu dưới nhiều định dạng khác nhau, phần này trình bày một cách đơn giản và
tiện lợi: lưu dữ liệu dưới dạng tệp .rda.

save (..., file)

Trong đó

... tên các đối tượng dữ liệu cần lưu.


file tên tệp chứa dữ liệu.

Chẳng hạn để lưu bảng dữ liệu có tên DuLieu mà chúng ta vừa tạo ra trên đây ta thực hiện như
sau:

> #Chọn thư mục để lưu dữ liệu


> setwd("F:/ThucHanhXSTKTrenR")
> #Thực hiện lưu dữ liệu
> save(DuLieu, file = "SinhVien.rda")

Như vậy ta đã tạo ra một tệp có tên SinhVien.rda tại thư mục ThucHanhXSTKTrenR trong ổ F
của máy tính.
Ta cũng có thể lưu nhiều đối tượng dữ liệu trong cùng một tệp:

> #Chọn thư mục để lưu dữ liệu


> setwd("F:/ThucHanhXSTKTrenR")
> #Thực hiện lưu dữ liệu
> save(SoLoi,DuLieu, file = "NhieuDL.rda")

Khi cần lấy dữ liệu được lưu trong một tệp .rda, ta dùng hàm load tại cửa sổ R Console.
Giả sử ta cần lấy dữ liệu được lưu trong tệp NhieuDL.rda có trong thư mục ThucHanhXSTK-
TrenR trong ổ F, ta làm như sau:

> #Truy cập vào thư mục chứa tệp dữ liệu


> setwd("F:/ThucHanhXSTKTrenR")
> # Tải và xem trong tệp có chứa những đối tượng dữ liệu nào:
> print(load("NhieuDL.rda"))
[1] "SoLoi" "DuLieu"

Trong trường hợp này, R báo cho ta biết có 2 đối tượng dữ liệu có tên là SoLoi và DuLieu
được lưu trong tệp đã cho. Từ đây chúng ta có thể sử dụng bất cứ tập dữ liệu nào trong số đó.

3.6 Tạo dữ liệu


R cung cấp rất nhiều hàm tạo dữ liệu theo những yêu cầu nhất định. Trong mục này, ta giới thiệu
một số hàm tạo dữ liệu đơn giản hay sử dụng trong R như: seq, rep, gl.

3.6.1 Tạo dãy số cách đều bằng hàm seq


Để tạo dãy số cách đều ta có thể dùng hàm seq bằng những cách sau:
3.6. Tạo dữ liệu 41

seq(from, to, by),


seq(length, from, by)
seq(length, from, to)

trong đó

from giá trị bắt đầu của dãy số.


to giá trị chặn trên của dãy số.
by khoảng cách giữa các số trong dãy.
length số phần tử của dãy số.

Đoạn lệnh sau minh họa cho ta những dãy số tạo từ hàm seq với những cách sử dụng tham số
khác nhau:

> # Tạo một dãy số từ 2 đến 5 cách nhau 0.5


> seq(from = 2, to = 5, by = 0.5)
[1] 2.0 2.5 3.0 3.5 4.0 4.5 5.0
> # hoặc
> seq(2, 5, 0.5)
[1] 2.0 2.5 3.0 3.5 4.0 4.5 5.0

> # Tạo một dãy số xuất phát từ 2, bị chặn trên bởi 5.3, cách nhau 0.5
> seq(2, 5.3, 0.5)
[1] 2.0 2.5 3.0 3.5 4.0 4.5 5.0
> # Tạo một dãy số độ dài 8, bắt đầu từ 4 cách nhau 3
> seq(length = 8, from = 4, by = 3)
[1] 4 7 10 13 16 19 22 25
> # Tạo một dãy số độ dài 5, cách đều nhau từ 4 đến 6
> seq(length = 5, from = 4, to = 6)
[1] 4.0 4.5 5.0 5.5 6.0

Khi các phần tử trong dãy cách nhau 1, ta có thể làm như sau:

> seq(1,10)
[1] 1 2 3 4 5 6 7 8 9 10
> # hoặc
> 1:10
[1] 1 2 3 4 5 6 7 8 9 10

3.6.2 Tạo dãy lặp lại bằng hàm rep

rep(x, times)

trong đó

x véc tơ các giá trị được lặp lại.


times véc tơ chỉ số lần lặp lại.

Cách dùng hàm rep và các tham số của nó được minh họa qua đoạn lệnh sau:

> #Tạo dãy số 8 lặp 5 lần


> rep(8, times = 5)
[1] 8 8 8 8 8
42 Chương 3. Dữ liệu và một số thao tác tiền xử lý dữ liệu

> #Tạo dãy số 1,2,3,4 lặp lại 3 lần


> rep(1:4, times = 3)
[1] 1 2 3 4 1 2 3 4 1 2 3 4
> #Tạo dãy số 1,2,3,4, mỗi số lặp lại 3 lần
> rep(1:4, each=3)
[1] 1 1 1 2 2 2 3 3 3 4 4 4
> #Tạo dãy chữ cái trong đó chữ a lặp 2 lần, chữ b lặp 3 lần,
chữ c lặp 4 lần
> rep(c("a","b","c"),c(2,3,4))
[1] "a" "a" "b" "b" "b" "c" "c" "c" "c"

3.6.3 Tạo dãy thứ bậc bằng hàm gl

gl(n, k, length, labels)

trong đó

n số nguyên dương chỉ số bậc.


k số lần lặp lại của mỗi bậc.
length chiều dài của kết quả.
labels véc tơ nhãn gán cho tên của các bậc.

Cách dùng hàm gl được minh họa như sau:

> #Tạo dãy gồm bậc 1, 2 mỗi bậc lặp lại 5 lần
> gl(2, 5)
[1] 1 1 1 1 1 2 2 2 2 2
Levels: 1 2
> #Tạo dãy gồm bậc 1, 2 mỗi bậc lặp lại 5 lần, chiều dài 12
> gl(2, 5, length=12)
[1] 1 1 1 1 1 2 2 2 2 2 1 1
Levels: 1 2
> #Tạo biến gồm bậc a, b, c mỗi bậc lặp lại 2 lần, chiều dài 10
> gl(3, 2, length=10, labels=c("a","b","c"))
[1] a a b b c c a a b b
Levels: a b c

3.7 Đọc dữ liệu từ các tệp dữ liệu có sẵn


R hỗ trợ rất nhiều hàm đọc dữ liệu tạo ra từ những phần mềm khác. Mục này giới thiệu một số
hàm đọc dữ liệu từ những phần mềm thông dụng như: Notepad, Excel, SPSS,...

3.7.1 Đọc dữ liệu từ một tệp text (File.txt)


Để đọc một dữ liệu dạng text file trong R ta dùng hàm read.table với một số tham số như
sau:

read.table(file, header)

trong đó

file tệp dữ liệu dạng File.txt.


3.7. Đọc dữ liệu từ các tệp dữ liệu có sẵn 43

header tham số logic TRUE/FALSE chỉ dòng đầu tiên trong dữ liệu có/không
phải tên của các cột, mặc định header = FALSE.

Giả sử tại thư mục F:/ThucHanhXSTKTrenR có một tệp dữ liệu DuLieuFastFood.txt.


Trong đó các cột dữ liệu đã có tên (dòng đầu) nên khi đọc dữ liệu bằng hàm read.tableta
khai báo tham số header = T:

> #Truy cập vào thư mục chứa dữ liệu


> setwd("F:/ThucHanhXSTKTrenR")
> #Đọc dữ liệu từ tệp DuLieuFastFood.txt và lưu dữ liệu vào đối tượng FastFood
> FastFood = read.table("DuLieuFastFood.txt", header=T)
> # 5 dòng đầu tiên của đối tượng FastFood
> head(FastFood, 5)
Tuoi GioiTinh NgheNghiep ThuNhap Gia ChonDoQC ChonDoTL ChonDoSP ChonDoGC
1 22 Nam HSSV 1 3 1 5 3 5
2 18 Nam HSSV 1 2 3 5 4 1
3 16 Nu HSSV 1 2 5 5 1 5
4 49 Nam NVVP 4 4 5 1 2 2
5 20 Nam HSSV 2 3 3 5 1 2

Chú ý: Trong trường hợp khai báo tham số header=F hoặc không khai báo tham số này (khi
đó theo mặc định header=F) R sẽ hiểu rằng các cột dữ liệu chưa có tên và R tự đặt tên cho
các cột như sau:

> FastFood = read.table("DuLieuFastFood.txt")


> head(FastFood, 5)
V1 V2 V3 V4 V5 V6 V7 V8 V9
1 Tuoi GioiTinh NgheNghiep ThuNhap Gia ChonDoQC ChonDoTL ChonDoSP ChonDoGC
2 22 Nam HSSV 1 3 1 5 3 5
3 18 Nam HSSV 1 2 3 5 4 1
4 16 Nu HSSV 1 2 5 5 1 5
5 49 Nam NVVP 4 4 5 1 2 2
> names(FastFood)
[1] "V1" "V2" "V3" "V4" "V5" "V6" "V7" "V8" "V9"

Trường hợp này, ta cần khai báo lại header = T để đọc dữ liệu đúng.

3.7.2 Nhập dữ liệu từ Excel (File.csv)


Khi nhập dữ liệu vào excel, thông thường tệp chứa dữ liệu có đuôi .xls, để đọc những tệp này
từ R ta làm như sau

• Trước hết ta lưu tệp dưới dạng đuôi .csv.

• Đọc tệp có phần đuôi .csv từ R bằng hàm read.csv

read.csv(file, header)

trong đó

file tệp dữ liệu dạng file.csv.


header xem hàm read.table, mặc định header = TRUE.
44 Chương 3. Dữ liệu và một số thao tác tiền xử lý dữ liệu

Giả sử trong thư mục F:/ThucHanhXSTKTrenR có một tệp dữ liệu tên là DuLieuFast-
Food.xls, ta đổi tệp thành DuLieuFastFood.csv như sau:

• Mở tệp DuLieuFastFood.xls;

• Chọn File Ñ Save as;

• Chọn Save as type là "CSV (Comma delimited)".

Tại cửa sổ R Console dữ liệu lưu trong tệp DuLieuFastFood.csv được tải ra như sau:

> #Truy cập vào thư mục chứa dữ liệu


> setwd("F:/ThucHanhXSTKTrenR")
> #Đọc dữ liệu trong tệp DuLieuFastFood.csv và lưu vào đối tượng FastFood
> FastFood = read.csv("DuLieuFastFood.csv", header=T)
> #Hoặc
> FastFood = read.csv("DuLieuFastFood.csv")
> head(FastFood,3)
Tuoi GioiTinh NgheNghiep ThuNhap Gia ChonDoQC ChonDoTL ChonDoSP ChonDoGC
1 22 Nam HSSV 1 3 1 5 3 5
2 18 Nam HSSV 1 2 3 5 4 1
3 16 Nu HSSV 1 2 5 5 1 5

3.7.3 Nhập dữ liệu từ SPSS (File.sav)


Tệp dữ liệu tạo ra từ phần mềm thống kê SPSS có dạng .sav. Dữ liệu trong tệp loại này được
tải trên R bằng hàm read.spss trong gói foreign với một số tham số chính như sau:

read.spss(file, to.data.frame)

trong đó

file tệp dữ liệu dạng file.sav.


to.data.frame tham số dạng logic, TRUE/FALSE tương ứng có/không chuyển
dữ liệu thành dạng bảng (data frame), mặc định là FALSE.
3.8. Chọn mẫu ngẫu nhiên 45

Ví dụ ta có tệp DuLieuFastFood.sav trong thư mục


F:/ThucHanhXSTKTrenR. Cách tải dữ liệu lưu trong tệp này được thực hiện tương tự hai
trường hợp trên như sau:

> #Truy cập vào thư mục chứa dữ liệu


> setwd("F:/ThucHanhXSTKTrenR")
> #Sử dụng gói foreign
> library(foreign)
> #Đọc dữ liệu và lưu dữ liệu vào đối tượng FastFood
> FastFood = read.spss("DuLieuFastFood.sav", to.data.frame=T)

Chú ý:

• Trong tất cả các trường hợp trên, sau khi dữ liệu được đọc từ những tệp có sẵn, ta có thể
lưu đối tượng FastFood dưới dạng tệp .rda để xử lí sau này bằng hàm save
> setwd("F:/ThucHanhXSTKTrenR")
> save(FastFood, file = "DuLieuFastFood.rda")

• Bạn đọc cần phân biệt tên tệp chứa dữ liệu và tên dữ liệu tại cửa sổ R Console. Trong
những ví dụ trên, dữ liệu đã được lấy ra và lưu vào đối tượng có tên FastFood. Mọi
thao tác sau đó trên dữ liệu sẽ được thực hiện trên đối tượng này chứ không phải trên tệp
chứa dữ liệu ban đầu.

3.8 Chọn mẫu ngẫu nhiên


Khi muốn thực hiện phép chọn mẫu ngẫu nhiên, ta dùng hàm sample với những tham số chính
như sau:

sample(x, size, replace, prob)

trong đó

x véc tơ gồm những phần tử dùng để chọn mẫu, hoặc một số nguyên
dương.
size số nguyên dương chỉ số phần tử trong mẫu.
replace tham số logic, TRUE/FALSE chỉ việc chọn mẫu có/không hoàn lại, mặc
định replace=FALSE.
prob véc tơ cho biết xác suất được chọn của những phần tử trong x.

Đoạn lệnh sau cho ta một số kết quả chọn ngẫu nhiên ra 10 phần tử từ tổng thể gồm 200 phần
tử được đánh số từ 1 tới 200:

> #Chọn mẫu gồm 10 phần tử từ 200 phần tử


> sample(1:200, 10)
[1] 145 123 13 99 43 79 88 59 92 138
> #Chọn mẫu khác gồm 10 phần tử từ 200 phần tử
> sample(1:200, 10)
[1] 167 17 37 101 108 100 85 189 72 193
> #Chọn mẫu gồm 10 phần tử có hoàn lại từ 200 phần tử
> sample(1:200, 10, replace=T)
[1] 66 132 132 173 72 8 12 181 110 63
46 Chương 3. Dữ liệu và một số thao tác tiền xử lý dữ liệu

Giả sử ta có một hộp gồm 3 quả bóng: xanh (X), đỏ (D), vàng (V). Tiến hành chọn (có hoàn lại)
ngẫu nhiên 5 quả bóng, kết quả có thể là:
> sample(c("X","D","V"), 5, replace=T)
[1] "X" "V" "X" "D" "X"

Chọn ra 5 phần tử từ tổng thể gồm 3 phần tử mà xác suất được chọn của chúng lần lượt là 0.5,
0.3 và 0.2:

> sample(3, 5, prob=c(0.5,0.3,0.2), replace=T)


[1] 2 2 2 1 2

Chú ý:

• Vì việc chọn mẫu là ngẫu nhiên nên có thể cùng một lệnh chọn mẫu nhưng với những lần
chọn khác nhau cho ta kết quả là khác nhau. Trong trường hợp muốn cố định mẫu được
chọn để dùng lại trong các lần sau, ta dùng hàm set.seed(n), trong đó n là một số
nguyên dương dùng để cố định mẫu.
> #Đặt tên mẫu
> set.seed(20100612)
> sample(1:200, 10)
[1] 156 176 140 55 78 59 120 45 185 73
> #Không gọi lại tên mẫu, kết quả là một mẫu khác
> sample(1:200, 10)
[1] 195 191 161 150 111 158 41 71 103 199
> #gọi lại tên mẫu và được mẫu như cũ
> set.seed(20100612)
> sample(1:200, 10)
[1] 156 176 140 55 78 59 120 45 185 73

• Hàm sample cho ta cách chọn mẫu từ một véc tơ. Trong trường hợp muốn chọn mẫu
từ một nhóm đối tượng có dữ liệu chứa trong một bảng dữ liệu, đầu tiên ta áp dụng hàm
sample cho véc tơ chỉ số thứ tự của các đối tượng, sau đó lấy từ bảng ra những quan sát
có thứ tự đã chọn được.
Chẳng hạn với bảng DuLieu gồm thông tin của 5 sinh viên cho trong phần trước, để chọn
ngẫu nhiên ra 3 sinh viên từ bảng này, ta thực hiện như sau:
> DuLieu
ChieuCao CanNang GioiTinh
1 170 65 Nam
2 165 50 Nam
3 150 45 Nu
4 158 60 Nu
5 166 53 Nam
> #Chọn thứ tự các sinh viên trong mẫu
> Mau = sample(1:5, 3)
> Mau
[1] 4 1 3
> #Lấy ra những sinh viên với thứ tự trong mẫu
> DLMau = DuLieu[Mau, ]
> DLMau
ChieuCao CanNang GioiTinh
4 158 60 Nu
1 170 65 Nam
3 150 45 Nu
3.8. Chọn mẫu ngẫu nhiên 47

BÀI TẬP
III.1. Giả sử bạn theo dõi số tiền (đơn vị nghìn đồng) trong hóa đơn điện thoại hàng tháng theo
thứ tự từ tháng 1 đến tháng 12 trong năm vừa qua như sau:
198 185 223 221 207 203 180 195 222 177 214 216

a. Nhập dữ liệu thành một véc tơ có tên TienDT.


b. Tính tổng số tiền bạn phải trả cho phí điện thoại trong năm đó.
c. Cho biết tháng nào có số tiền ít (nhiều) nhất và số tiền là bao nhiêu?
d. Cho biết những tháng bạn phải trả hơn 200 nghìn tiền điện thoại. Có bao nhiêu tháng như
thế?
e. Tính xem có bao nhiêu tháng mà tiền điện thoại không quá 190 nghìn.
f. Tính xem có bao nhiêu tháng mà tiền điện thoại dao động trong khoảng [190, 210] nghìn.
g. Tính số tiền điện thoại trung bình một tháng (dùng hàm mean).

III.2. Dùng dữ liệu TienDT trên để thực hiện tiếp những yêu cầu sau:

a. Lưu dữ liệu này vào một tệp .rda


b. Sửa tiền điện thoại tháng 2 thành 175.
c. Nhập thêm vào dãy trên tiền điện thoại của 3 tháng tiếp theo nhưng bạn quên mất số tiền
tháng thứ 13, biết tháng thứ 14, 15 số tiền lần lượt là 201, 185. Sau đó tính lại số tiền
trung bình bạn phải trả mỗi tháng.

III.3. Cho ba tập dữ liệu dạng véc tơ:


x = c(1, 3, 5, 7, 9), y = c(1, 2, 8, 6, 4, 5, 7), z = c(2, 8, 1, 0, 3)
Hãy thực hiện các thao tác sau:

a. z  x, x + z, xz, z/x
b. x + 1, y  2, length(x), length(y), x + y
c. sum(x ¡ 5) và sum(x[x ¡ 5])

III.4. Dưới đây là thông tin về 8 sinh viên mới ra trường của một khóa học:

Thứ tự Lương khởi điểm Giới tính Xếp loại tốt nghiệp Tuổi
1 6.0 Nam K 22
2 5.0 Nu K 25
3 4.5 Nam TB 23
4 3.8 Nu K 22
5 8.0 Nu G 22
6 12.0 Nam G 23
7 4.0 Nam TB 22
8 5.0 Nu TB 24
48 Chương 3. Dữ liệu và một số thao tác tiền xử lý dữ liệu

a. Nhập dữ liệu vào một bảng (đặt tên là SinhVien) gồm các cột TT, Luong, GioiTinh, Tot-
Nghiep, Tuoi.

b. Đưa ra dữ liệu về những sinh viên nữ.

c. Đưa ra dữ liệu về những sinh viên nam.

d. Đưa ra danh sách lương khởi điểm của nhóm sinh viên nữ.

e. Đưa ra danh sách tuổi của nhóm sinh viên nam.

f. Đưa ra danh sách những sinh viên có lương khởi điểm trên 6 triệu/tháng.

g. Cho biết các thông tin về những người có lương cao nhất trong danh sách.

h. Thêm vào danh sách một sinh viên nam tốt nghiệp xếp loại giỏi, lương khởi điểm 7.5 triệu
nhưng không có thông tin về tuổi.

i. Thêm vào bảng trên một cột điểm khóa luận tốt nghiệp của các sinh viên trên theo thứ tự như
sau: 8, 7.5, 7, 7, 9, 9.5, 8, 8, 9.

j. Cho biết dữ liệu trong từng cột được đo bằng thang đo nào?

k. Loại đi số liệu trống không trong bảng. Nhận xét.

III.5. Tệp dữ liệu BaiTap6.rda lưu thông tin của một nhóm học sinh về giới tính (GioiTinh),
lớp (Lop), tuổi (Tuoi), nơi ở (NoiO), học lực (HocLuc), mức độ yêu thích thể thao (TheThao)
và đánh giá hình thức (HinhThuc). Hãy lấy tệp dữ liệu và thực hiện các yêu cầu sau:

a. Cho biết dữ liệu trong từng cột được đo bằng thang đo nào?

b. Cho biết tập dữ liệu này có bao nhiêu cột, bao nhiêu dòng?

c. Lấy ra dữ liệu ở cột thứ 3 (Tuoi).

d. Lấy ra toàn bộ dữ liệu ở dòng thứ 10.

e. Tính số học sinh nữ, nam.

f. Tính tỷ lệ học sinh có mức độ yêu thích thể thao là 4. Tính tỷ lệ này trong nhóm học sinh
nam, trong nhóm học sinh nữ.

III.6. Trong tệp HocSinh.rda, hãy chọn ngẫu nhiên 50 học sinh và lấy ra tất cả thông tin về 50
người đó. Lưu dữ liệu dưới dạng tệp .rda.

III.7.

a. Tạo dãy số từ 1 đến 100.

b. Tạo dãy số chẵn từ 0 đến 100.

c. Tạo dãy số trong đó 3 lặp 4 lần, 5 lặp 10 lần, 16 lặp 7 lần.

d. Tạo dãy số trong đó có các giá trị 1, 2, 3, 4 lần lượt lặp lại 10 lần.
3.8. Chọn mẫu ngẫu nhiên 49

e. Tạo dãy số mà cả cụm 1, 2, 3 lặp lại 8 lần.

f. Tạo biến thứ bậc gồm 3 bậc, mỗi bậc lặp 4 lần.

g. Tạo biến thứ bậc gồm 4 bậc, mỗi bậc lặp 4 lần, chiều dài biến bằng 15.

h. Tạo biến thứ bậc gồm 3 bậc, số lần lặp lại tương ứng là 2, 5, 8 với ký hiệu a, b, c.

III.8. Chọn ngẫu nhiên 5 người từ danh sách gồm 40 người.

III.9. Tung một đồng xu 50 lần. Mô phỏng phép thử và đếm số mặt sấp.

III.10. Tung một con xúc xắc 100 lần. Mô phỏng phép thử và đếm số lần xuất hiện mặt 6 chấm.

III.11. Chọn ngẫu nhiên năm cây bài từ bộ bài tú lơ khơ. Mô phỏng phép thử và kiểm tra xem
có bộ đôi nào trong mẫu không? Hãy lặp lại cho đến khi có được một đôi trong 5 cây bài.

You might also like