07/09/2020

Trích xuất đối tượng R

Có 3 dấu được sử dụng cho mục đích trích xuất đối tượng R

  • Dấu [] luôn trả về một đối tượng cùng nhóm với đối tượng gốc. Nó có thể được sử dung để trích xuất nhiều thành phần trong một đối tượng.

  • Dấu [[]] được sử dụng để trích xuất những đối tượng của list hoặc data frame. Nó chỉ có thể trích xuất được một thành phần đơn lẻ, và đối tượng được trả về không nhất thiết phải là list hoặc data frame.

  • Dấu $ được sử dụng để trích xuất thành phần của list hoặc data frame bằng tên gọi. Tính chất của nó tương tự [[]].

Trích xuất một vector

Vector là đối tượng cơ bản trong R, và có thể được trích xuất theo chỉ số, hay index, bằng dấu [].

x <- c("a","b","c","c","d","a")
x[1]    # Trích xuất thành phần đầu tiên bằng index number 1
## [1] "a"
x[2]    # Trích xuất thành phần thứ hai
## [1] "b"

Trích xuất một vector

Dấu [] có thể trích xuất nhiều thành phần của một vector bằng cách đưa vào một chuỗi số.

x[1:4]   # Trích xuất bốn thành phần đầu tiên của vector
## [1] "a" "b" "c" "c"

Chuỗi số này không nhất thiết phải theo thứ tự

x[c(1,3,4)]  # Trích xuất thành phần thứ 1, 3 và 4
## [1] "a" "c" "c"

Trích xuất một vector

Chúng ta có thể đưa vào [] một chuỗi logic để trích xuất những thành phần thỏa điều kiện.

u <- x > "a"     # Trích xuất những thành phần của x mà lớn hơn "a"
u
## [1] FALSE  TRUE  TRUE  TRUE  TRUE FALSE
x[u]
## [1] "b" "c" "c" "d"

Để gọn gàng hơn, chúng ta có thể trích xuất bằng cách đưa biểu thức logic vào dấu [] luôn.

x[x > "a"]
## [1] "b" "c" "c" "d"

Trích xuất một Matrix

Matrix được trích xuất bằng chỉ số, hay index, dạng [i,j].

x <- matrix(1:6,2,3)
x
##      [,1] [,2] [,3]
## [1,]    1    3    5
## [2,]    2    4    6

Ta có thể trích xuất thành phần [1,2] hoặc [2,1] của matrix với những index

x[1,2]
## [1] 3
x[2,1]
## [1] 2

Trích xuất một Matrix

Nếu muốn trích xuất cả một hàng hay một cột, ta để trống index ở nơi tương ứng

x[1,] ## Trích xuất hàng đầu
## [1] 1 3 5
x[,2] ## Trích xuất cột thứ 2
## [1] 3 4

Trích xuất một Matrix

Theo mặc định, khi trích xuất một hoặc nhiều thành phần của matrix, kết quả trả ra sẽ ở dạng vector. Để chuyển về dạng matrix, ta sử dụng tham số drop = FALSE

x[1, , drop = FALSE]
##      [,1] [,2] [,3]
## [1,]    1    3    5

Trích xuất list

Ta có thể trích xuất thông tin từ list với cả 3 dấu đề cập ở trên, với 3 mục đích khác nhau.

x <- list(varone = 1:4, vartwo = 6:10)
x
## $varone
## [1] 1 2 3 4
## 
## $vartwo
## [1]  6  7  8  9 10

Trích xuất list

Dấu [[]] được sử dụng để trích xuất MỘT thành phần của list.

x[[1]]  # Trích xuất thành phần đầu tiên của list
## [1] 1 2 3 4

Trích xuất list

Dấu [[]] còn dùng được với named index.

x[["bar"]]
## NULL
x[["foo"]]
## NULL

Trích xuất list

Với chức năng tương tự, ta có thể sử dụng dấu $ để trích xuất qua named index.

x$bar
## NULL
x$foo
## NULL

Lưu ý rằng với dấu $, ta không phải sử dụng dấu nháy đôi "".

Trích xuất list

Một điểm khác biệt khác, là [[]] có thể làm việc với computed index, còn $ chỉ làm việc được với literal name.

x <- list(foo = 1:4, bar = .6, baz = "hello")
name <- "foo"
## computed index for "foo"
x[[name]]
## [1] 1 2 3 4
## element "name" doesn't exist with $ sign (though no error here)
x$name
## NULL
## though element "foo" does exist
x$foo
## [1] 1 2 3 4

Trích xuất thành phần làm tổ trong list

Dấu [[]] kết hợp với chuỗi sỗ nguyên giúp trích xuất thành phần làm tổ trong list.

x <- list(a = list(10,12,14), b = c(3.14, 2.81))
## Trích xuất thành phần thứ 3 của thành phần thứ 1 trong list
x[[c(1,3)]]
## [1] 14
## Tương tự
x[[1]][[3]]
## [1] 14
# Hoặc
x[[1]][3]
## [[1]]
## [1] 14
# Có thể
x$a[3]
## [[1]]
## [1] 14

Trích xuất nhiều thành phần của list

Dấu [] được sử dụng để trích xuất nhiều thành phần từ list.

x <- list(foo = 1:4, bar = .6, baz = "hello")
x[c(1,3)]
## $foo
## [1] 1 2 3 4
## 
## $baz
## [1] "hello"

Lưu ý rằng dấu [] luôn trả về đối tượng cùng nhóm với đối tượng ban đầu.

Partial matching

Có thể dùng partial matching với [[]] và $. Rất hữu ích với với những đối tượng có tên dài, khó.

x <- list(aardvark = 1:5)
x$a
## [1] 1 2 3 4 5
x[["a"]]
## NULL
x[["a", exact = FALSE]]
## [1] 1 2 3 4 5
x <- list(aardvark = 1:5, ardvard = 6:10)
x$a
## NULL
x$aa
## [1] 1 2 3 4 5
x$ar
## [1]  6  7  8  9 10