Truy xuất dữ liệu thường dùng để tìm hay lấy ra một số phần tử từ một đối tượng có kiểu dữ liệu hợp như vectơ hay ma trận. Nhưng cũng có khi truy xuất dữ liệu dùng để xác lập giá trị của một số phần tử từ đối tượng có kiểu dữ liệu hợp. Phương pháp cơ bản dùng để truy xuất dữ liệu là dùng "chỉ số" (Indexing).
Truy xuất dữ liệu từ vectơ được xem là nội dung cơ bản của truy xuất dữ liệu vì phần lớn các phương pháp truy xuất áp dụng cho vectơ đều có thể mở rộng cho các dữ liệu có nhiều chiều hơn.
Truy xuất theo chỉ số
Muốn truy xuất phần tử thứ i của vectơ x, ta sử dụng cú pháp x[i]
.
Thí dụ ta có vectơ vec :
vec <- c(2, 5, 12, 4, 8, 6, 10)
Vậy kết quả khi truy xuất phần tử thứ 3 của vec là:
> vec[3]
[1] 12
Lưu ý là khi đếm chỉ số, R bắt đầu từ 1 chứ không phải là 0 như một số ngôn ngữ lập trình khác.
Ta có thể truy xuất cùng một lúc nhiều dữ liệu đơn khi ta đặt trong cặp dấu móc vuông một nhóm chỉ số thay vì một chỉ số. Thí dụ:
> vec[c(2, 3, 5)]
[1] 5 12 8
Hay :
> vec[2:5]
[1] 5 12 4 8
Lưu ý là kết quả truy xuất một vectơ là một vectơ, ngay khi chỉ có một thành phần:
> is.vector(vec[3])
[1] TRUE
Ta có thể loại trừ phần tử thứ i của vectơ x bằng cách đặt dấu -
trước chỉ số như cú pháp x[-i]
. Thí dụ:
> vec[-3]
[1] 2 5 4 8 9 6 10
Tương tự, ta cũng có thể loại bỏ nhiều phần tử nếu đặt dấu trừ trước một nhóm chỉ số đặt trong cặp dấu móc vuông:
> vec[-2:4]
[1] 2 8 6 10
Truy xuất theo điều kiện
Trong cặp dấu móc vuông có thể là một điều kiện luận lý. Thí dụ:
> vec[vec>5]
[1] 12 8 6 10
Đôi khi ta cần xác định vị trí của các phần tử trong vectơ thỏa một điều kiện nào đấy. Lúc ấy ta dùng hàm which
với cú pháp which(dieu_kien)
. Thí dụ như:
> which(vec < 8)
[1] 1 2 4 6
Truy xuất ngẫu nhiên
Nếu ta muốn truy xuất một cách ngẫu nhiên n phần tử của một vectơ vec (chẳng hạn như khi lấy mẫu) thì ta sử dụng hàm sample
theo cú pháp:
sample(vec, n, replace = xx)
Đối số replace cho biết sự lấy mẫu này có hoàn lại hay không. Giá trị mặc định của nó là FALSE (không hoàn lại). Nếu ta muốn lấy mẫu có hoàn lại, ta đặt
replace = TRUE
Ta xem xét hai ví dụ sau :
> sample(vec, 5)
[1] 5 4 6 10 8 > sample(vec, 5, replace = T)
[1] 10 8 12 8 5
Nếu đối tượng x cần truy xuất là bảng hay ma trận (dữ liệu 2 chiều) thì chỉ số dùng để truy xuất phải có 2 thành phần như cú pháp x[i, j]
với i là chỉ số dòng, j là chỉ số cột. Thí dụ:
bng[2, 3]
dùng để truy xuất phần tử nằm ở dòng thứ hai và cột thứ ba của bảng bng.
Ta cũng có thể truy xuất nhiều dòng hay nhiều cùng một lúc khi các thành phần trong cặp dấu móc vuông là các nhóm chỉ số. Thí dụ như:
bng[c(2,4,6), 2:5]
sẽ truy xuất các dòng 2, 4 và 6 của các cột 2 3, 4 và 5
Nếu ta muốn truy xuất toàn bộ dòng, hay toàn bộ cột thì ta để trống chỉ số còn lại.
mt[3, ]
sẽ truy xuất toàn bộ dòng 3,mt[c(2,5), ]
sẽ truy xuất toàn bộ các dòng 2 và 5,mt[, 4]
sẽ truy xuất toàn bộ cột 4,mt[, 3:6]
sẽ truy xuất toàn bộ các cột 3, 4, 5 và 6,Điều cần lưu ý là cả bảng và ma trận đều là dữ liệu 2 chiều, có hình thức tương đối giống nhau nhưng truy xuất mỗi loại dữ liệu đều có những điểm đặc thù riêng.
Truy xuất một biến
Để truy xuất một biến (hoặc một cột) có tên là TenBien từ một bảng bng, ta sử dụng toán tử $
theo cú pháp:
bng$TenBien
hay sử dụng chỉ số theo cú pháp
bng[, "TenBien"]
Thí dụ : ta xem xét lại bảng dữ liệu TraiCay (Bảng 1b)
Bảng 1b Một số thông số của một vài loại trái cây
Loai | Nuoc_g | Protein_g | Gluxit_g | Lipit_g | Khoang_g | NangLuong_kcal |
---|---|---|---|---|---|---|
Bo | 73 | 2 | 8.53 | 14.66 | 1.58 | 160 |
Buoi | 89 | 0.76 | 9.62 | 0.04 | 0.48 | 38 |
Cam | 87 | 0.94 | 11.75 | 0.12 | 0.44 | 47 |
ChanhDay | 73 | 2.2 | 23.38 | 0.7 | 0.8 | 97 |
Chuoi | 75 | 1.09 | 22.84 | 0.33 | 0.82 | 89 |
Dao | 89 | 0.91 | 9.54 | 0.25 | 0.43 | 39 |
DuDu | 88 | 0.47 | 10.82 | 0.26 | 0.39 | 43 |
Duwsa | 86 | 0.54 | 13.12 | 0.12 | 0.22 | 50 |
DuaHau | 91 | 0.61 | 7.55 | 0.15 | 0.25 | 30 |
Kết quả của truy xuất hàm lượng lipid của các loại trái cây được thể hiện như sau:
> TraiCay$Lipit_g
[1] 14.66 0.04 0.12 0.70 0.33 0.25 0.26 0.12
[9] 0.15
Ta cũng thu được kết quả tương tự khi sử dụng câu lệnh
> TraiCay[, "Lipit_g"]
Truy xuất bằng hàm subset
Trong các trường hợp phức tạp hơn, ta sử dụng hàm subset
theo cú pháp
subset(bng, dieu_kien, select = xxx)
Trong cú pháp này :
Thí dụ ta muốn truy xuất 3 biến là tên trái cây, hàm lượng protein và hàm lượng gluxit từ bảng dữ liệu trái cây, nhưng chỉ truy xuất các loại trái cây mà năng lượng cung cấp trên 40 kcal cho 100 g. Kết quả truy xuất như sau:
> subset(TraiCay, NangLuong_kcal > 40, select = c(1, 3, 4)) Loai Protein_g Gluxit_g
1 Bo 2.00 8.53
3 Cam 0.94 11.75
4 ChanhDay 2.20 23.38
5 Chuoi 1.09 22.84 7 DuDu 0.47 10.82
9 Duwsa 0.54 13.12
Lưu ý là ta có thể thu được kết quả tương tự bằng cách sử dụng chỉ số với câu lệnh:
> TraiCay[TraiCay$NangLuong_kcal > 40, c(1, 3, 4)]
Trước hết, nhắc lại rằng danh sách tập hợp các phần tử có kiểu dữ liệu khác nhau. Vì thế dữ liệu tại một vị trí nào đó trong danh sách được phân cấp rõ rệt. Xét danh sách dsD được tạo nên từ ký tự "A", vectơ vB và ma trận mtC như thí dụ sau:
vB <- c("a", "b", "c", "d")
mtC <- matrix(1:24, 6)
dsD <- list("A", vB, mtC)
Khi ấy, ký tự "A", vectơ vB và ma trận mtC là các phần tử cấp 1 của danh sách, các phần tử của vB và mtC, như ký tự "d" hay số 17, là các phần tử cấp 2 của danh sách.
Muốn truy xuất một phần tử cấp 1 của danh sách, ta dùng chỉ số đặt trong 2 cặp dấu móc vuông như thí dụ sau:
dsD[[2]]
[1] "a" "b" "c" "d"
Muốn truy xuất một phần tử x cấp 2 của danh sách, ta phải truy xuất hai lần. Lần thứ nhất, truy xuất phần tử cấp 1 chứa x theo cách trình bày ở trên. Sau đó ta truy xuất đến x bằng cách sử dụng thêm một cặp dấu móc vuông, trong chứa (các) chỉ số của x. Ta xét các thí dụ sau:
dsD[[2]][3]
[1] "c"
dsD[[3]][4, 2]
[1] 10
Trang web này được cập nhật lần cuối ngày 25/11/2018
R
Các chuyên đề
Xử lý dữ liệu
Ma trận
R