R-007 list trong R

Nội dung bài viết

list là một những kiểu dữ liệu cơ bản của R.

Để hiểu rõ list của R các bạn có thể đọc tài liệu chi tiết về list bằng lệnh:

?list

(Mặc dù gọi là list nhưng mình thấy nó tương ứng với dictionary và hashtable trong các ngôn ngữ lập trình khác như Python)

1. Tạo một danh sách list:

Danh sách trong R có thể tạo với hàm list().

l1 <- list(name="quantiencs", age=22, handsome=TRUE)
l1
$`id`
[1] "quantiencs"

$age
[1] 22

$handsome
[1] TRUE

Những thành phần tên của những thành phần sau $... được gọi là tags. Chúng ta có thể gọi riêng mỗi riêng từng thành phần ra:

l1$age

Không phải lúc nào chúng ta cũng nhất thiết khai báo tags cho R.

l2 <- list("quantiencs", 22, TRUE)
l2

2. Toán tử thông dụng trên list:

Tạo một list mẫu để thử các ví dụ sau:

a.mind.of.numbers <- list(book="A Mind For Numbers",
 publisher="TarcherPerigee", author="Barbara A. Oakley", print.length=332)

2.1 Truy cập các phần tử trong list:

Có 3 cách để truy cập một phần tử trong list:

  • Dùng [[index.number]]
a.mind.of.numbers[[3]]
[1] "Barbara A. Oakley"
  • Dùng [[key]]
a.mind.of.numbers[["author"]]
[1] "Barbara A. Oakley"
  • Dùng ...$key
a.mind.of.numbers$author
[1] "Barbara A. Oakley"

2.2 Thêm một phần tử

Thêm một phần tử vào list có thể dể dàng dùng toán tử gán:

a.mind.of.numbers[[5]] <- "thu them phan tu"
a.mind.of.numbers
$`book`
[1] "A Mind For Numbers"

$publisher
[1] "TarcherPerigee"

$author
[1] "Barbara A. Oakley"

$print.length
[1] 332

[[5]]
[1] "thu them phan tu"

Ngoài ra chúng ta có thể thêm nhờ toán tử ...$name:

a.mind.of.numbers$ASIN <- "B00G3L19ZU"
a.mind.of.numbers
$`book`
[1] "A Mind For Numbers"

$publisher
[1] "TarcherPerigee"

$author
[1] "Barbara A. Oakley"

$print.length
[1] 332

[[5]]
[1] "thu them phan tu"

$ASIN
[1] "B00G3L19ZU"

2.3 Xóa một phần tử

Bạn có thể xóa một phần tử trong list bằng cách gán NULL

(Một điểm lưu ý là hiện tại thì khóa ASIN đang ở index thứ 6 của list. Bạn đọc tự kiểm tra.)

a.mind.of.numbers[[5]] <- NULL
a.mind.of.numbers
$`book`
[1] "A Mind For Numbers"

$publisher
[1] "TarcherPerigee"

$author
[1] "Barbara A. Oakley"

$print.length
[1] 332

$ASIN
[1] "B00G3L19ZU"

Bây giờ thì khóa ASIN đang nằm ở index thứ 5 thay vì 5 như trước:

(hãy cẩn thận với điều này)

a.mind.of.numbers[5]
$`ASIN`
[1] "B00G3L19ZU"

2.4 Lấy danh sách con:

Bây giờ bạn lại thắc mắc, toán tử [...] ở trên mà nãy mình đang dùng là gì? Toán tử này có thể dùng để lấy danh sách con từ danh sách ban đầu (tương tự vector).

a.mind.of.numbers[1:3]
$`book`
[1] "A Mind For Numbers"

$publisher
[1] "TarcherPerigee"

$author
[1] "Barbara A. Oakley"

Hoặc cũng có thể lấy từ vector khóa:

a.mind.of.numbers[c("book", "author")]
$`book`
[1] "A Mind For Numbers"

$author
[1] "Barbara A. Oakley"

2.5 Ghép danh sách

Về mặt bản chất thì list là một vector của một cặp keyvalue. Do đó chúng ta có thể nối hai list lại bằng hàm c(...)

l1 <- list(one="một", two="hai")
l2 <- list(three="ba", four="bốn")
c(l1, l2)
$`one`
[1] "một"

$two
[1] "hai"

$three
[1] "ba"

$four
[1] "bốn"