logo xDuLieu.com

Trang trướcTruy xuất dữ liệuTrang sau

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ơ

 

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

Truy xuất dữ liệu từ bảng hay ma trận

 

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 dữ liệu từ bả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 :

  • bng là tên của bảng dữ liệu.
  • dieu_kien là điều kiện truy xuất. Thông thường các điều kiện này liên quan đến các dòng.
  • select là đối số liên quan đến các biến được truy xuất.

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)]

Truy xuất dữ liệu từ danh sách

 

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 trướcVề đầu chươngTrang sau


Trang web này được cập nhật lần cuối ngày 25/11/2018

R