Lập trình với R: Truy xuất vector

Vector

Vector


Trong bài viết này, ta sẽ học cách truy xuất các thành phần trong vector dựa trên những điều kiện chúng ta chỉ đinh. Ví dụ, chúng ta chỉ quan tâm đến 20 phần tử đầu tiên trong vector, hay truy xuất các phần tử không mang giá trị NA, hay chỉ truy xuất các phần tử dương. Kết thúc bài viết này, chúng ta sẽ biết cách xử lý từng tình huống trên.

Giả sử chúng ta có biến x là vector gồm 20 phần tử mang các giá trị ngẫu nhiên gồm các số bất kỳ và các giá trị NA.

x
[1]          NA  0.27407207          NA  0.47248674 -2.13286986 -0.60572245
[7]  0.74990217  0.37901797          NA  1.32495488  0.92939541 -0.71212377
[13]          NA -0.84094630          NA  0.06148433          NA          NA
[19]  1.89385923          NA

Ta chạy dòng lệnh sau để truy xuất các phần tử bên trong x. Cách mà bạn bảo R rằng bạn muốn truy xuất những phần tử cụ thể (subsetting) từ một vector, có nghĩa là chỉ định cho R biết vị trí các phần tử (index) bạn muốn lấy trong vector đó.

# truy xuất 10 phần tử đầu tiên của biến x
x[1:10]
[1]         NA  0.2740721         NA  0.4724867 -2.1328699 -0.6057225
[7]  0.7499022  0.3790180         NA  1.3249549

Index vector có bốn dạng gồm: logical vectors, positive/negative integer vectors, và character string vector. Chúng ta sẽ tiến hành khảo sát từng dạng index vector này.

Logical vectors

Đầu tiên, ta sẽ truy xuất dữ liệu với logical vectors. Một trong những trường hợp thông thường khi làm việc với dữ liệu thực tế đó là chúng ta cần truy xuất các phần tử không có giá trị bị thiếu (NA – missing data). Ta sử dụng hàm is.na(x) để trả về logical vector từ đó có thể truy xuất những phần tử không bị mất mát.

# truy xuất các phần tử không phải là NA
y <- x[!is.na(x)]
y
[1]  0.27407207  0.47248674 -2.13286986 -0.60572245  0.74990217  0.37901797
[7]  1.32495488  0.92939541 -0.71212377 -0.84094630  0.06148433  1.89385923

# truy xuất các phần tử lớn hơn 0
y[y > 0]
[1] 0.27407207 0.47248674 0.74990217 0.37901797 1.32495488 0.92939541 0.06148433
[8] 1.89385923

# kết hợp hai phép truy xuất trên
y <- x[!is.na(x) & x > 0]

Integer vectors

Hầu hết các ngôn ngữ lập trình đều sử dụng ‘zero-based indexing’, nghĩa là phần tử đầu tiên của vector được đánh chỉ số là 0. R sử dụng ‘one-based indexing’, nghĩa là phần tử đầu tiên của vector được đánh chỉ số là 1.

Để truy xuất phần tử thứ 3, 5, và 7 ta có thể làm như sau:

x[c(3, 5, 7)]
[1]         NA -2.1328699  0.7499022

# khi truy xuất các phần tử nằm ngoài phạm vị [1, length(x)], R sẽ không có cảnh báo nào.
# dó đó, cần chú ý chỉ truy xuất các phần tử nằm trong phạm vi của vector để tránh kết quả sai.
x[0]
numeric(0)

x[3000]
[1] NA

Giả sử như chúng ta quan tâm đến tất cả các phần tử của x ngoại trừ phần tử thứ 2 và thứ 10. Ta đơn giản thêm toán tử “-” vào trước chỉ số của phần tử ta muốn loại trừ.

# đặt dấu "-" cho từng chỉ số cần loại trừ 
x[c(-2, -10)]
[1]          NA          NA  0.47248674 -2.13286986 -0.60572245  0.74990217
[7]  0.37901797          NA  0.92939541 -0.71212377          NA -0.84094630
[13]          NA  0.06148433          NA          NA  1.89385923          NA

# tương tự bằng cách đặt dấu "-" ngoài vector chỉ số
x[-c(2, 10)]
[1]          NA          NA  0.47248674 -2.13286986 -0.60572245  0.74990217
[7]  0.37901797          NA  0.92939541 -0.71212377          NA -0.84094630
[13]          NA  0.06148433          NA          NA  1.89385923          NA

Character string vector

Đến bây giờ, chúng ta đã khảo sát ba loại index vectors đó là logical, positive integer, và negative integer. Loại còn lại là character string index. Ta tiến hành tạo vector sau để khảo sát.

vect <- c(foo = 11, bar = 2, norf = NA)
vect
foo  bar norf 
 11    2   NA

# lấy danh sách tên các phần tử
names(vect)
[1] "foo"  "bar"  "norf"

Chúng ta có thể tạo vect2 tương tự vect mà không đặt tên trước như sau:

vect2 <- c(11, 2, NA)
names(vect2) <- c("foo", "bar", "norf")
vect2
foo  bar norf 
 11    2   NA

# kiểm tra hai vector có đồng nhất hay không
identical(vect, vect2)
[1] TRUE

Để truy xuất phần tử của vector bằng tên của các phần tử ta có thể làm như sau:

vect["bar"]
bar 
  2

# truy xuất bằng danh sách tên các phần tử
vect[c("foo", "bar")]
foo bar 
 11   2

Như vậy ta đã biết truy xuất các phần tử của vector thông qua kĩ thuật subsetting gồm logical vector, postive/negative integer vector, và character string vector.

Nguồn tham khảo: http://swirlstats.com/

Advertisements

One thought on “Lập trình với R: Truy xuất vector

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất / Thay đổi )

Connecting to %s