Sự khác nhau giữa kiểu dữ liệu vectơ và danh sách trong R là gì?


127

Sự khác biệt chính giữa kiểu dữ liệu vectơ và danh sách trong R là gì? Ưu điểm hoặc nhược điểm của việc sử dụng (hoặc không) hai kiểu dữ liệu này là gì?

Tôi đánh giá cao việc xem các ví dụ minh họa các trường hợp sử dụng của các loại dữ liệu.

Câu trả lời:


77

Về mặt kỹ thuật, danh sách các vectơ, mặc dù rất ít người sử dụng thuật ngữ đó. "danh sách" là một trong một số chế độ, với các chế độ khác là "logic", "ký tự", "số", "số nguyên". Những gì bạn đang gọi vectơ là "vectơ nguyên tử" theo cách nói của R nghiêm ngặt:

 aaa <- vector("list", 3)
 is.list(aaa)   #TRUE
 is.vector(aaa)  #TRUE

Danh sách là loại "đệ quy" (của vectơ) trong khi vectơ nguyên tử không phải là:

is.recursive(aaa)  # TRUE
is.atomic(aaa)  # FALSE

Bạn xử lý các đối tượng dữ liệu với các chức năng khác nhau tùy thuộc vào việc chúng thuộc tính đệ quy, nguyên tử hay có các thuộc tính chiều (ma trận và mảng). Tuy nhiên, tôi không chắc rằng một cuộc thảo luận về "ưu điểm và nhược điểm" của các cấu trúc dữ liệu khác nhau là một câu hỏi đủ tập trung cho SO. Để thêm vào những gì Tommy đã nói, bên cạnh các danh sách có khả năng chứa một số lượng tùy ý các vectơ khác, còn có các khung dữ liệu là một loại danh sách cụ thể có thuộc tính chiều xác định cấu trúc của nó. Không giống như ma trận và mảng là những đối tượng nguyên tử thực sự được gấp lại, khung dữ liệu có thể chứa nhiều kiểu khác nhau bao gồm cả kiểu yếu tố.

Ngoài ra còn có cảnh báo rằng is.vectorhàm sẽ trả về FALSEkhi có các thuộc tính khác với tên. Xem: vectơ là gì?


54

Danh sách là "đệ quy". Điều này có nghĩa là chúng có thể chứa các giá trị thuộc các loại khác nhau, thậm chí cả các danh sách khác:

x <- list(values=sin(1:3), ids=letters[1:3], sub=list(foo=42,bar=13))
x # print the list
x$values   # Get one element
x[["ids"]] # Another way to get an element
x$sub$foo  # Get sub elements
x[[c(3,2)]]  # Another way (gets 13)
str(x)     # A "summary" of the list's content

Danh sách được sử dụng trong R để biểu diễn các tập dữ liệu: data.framelớp về cơ bản là một danh sách trong đó mỗi phần tử là một cột của một kiểu cụ thể.

Một cách sử dụng khác là khi biểu diễn một mô hình: kết quả từ lmtrả về một danh sách chứa một loạt các đối tượng hữu ích.

d <- data.frame(a=11:13, b=21:23)
is.list(d) # TRUE
str(d)

m <- lm(a ~ b, data=d)
is.list(m) # TRUE
str(m)

Các vectơ nguyên tử (không giống như danh sách, nhưng là số, lôgic và ký tự) rất hữu ích vì tất cả các phần tử được biết là có cùng kiểu. Điều này làm cho việc thao tác chúng rất nhanh chóng.


20

Là một người mới làm quen với R, nhưng xuất thân từ nền tảng C / Java / Ruby / PHP / Python, đây là cách tôi nghĩ về nó.

A listthực sự là một mảng + một bản đồ băm. Đó là một mảng kết hợp PHP.

> foo = list(bar='baz')
> foo[1]
'baz'
> foo$bar
'baz'
> foo[['bar']]
'baz'

A vectorlà một mảng / danh sách kiểu cố định. Hãy coi nó giống như một danh sách được liên kết - bởi vì việc đặt các mục không giống nhau vào một danh sách được liên kết là một cách chống lại khuôn mẫu. Đó là một vectơ theo nghĩa giống như các đơn vị SIMD / MMX / vectơ sử dụng từ này.


3
Bạn có thể có keys trong vectơ bằng cách sử dụng namesphương pháp này.
gokul_uf

9

Câu hỏi này và các câu hỏi giới thiệu tương tự được trả lời trong http://www.burns-stat.com/pages/Tutor/hints_R_begin.html

Nó có nghĩa là một phần giới thiệu nhẹ nhàng giúp bạn bắt đầu và sử dụng R nhanh nhất có thể. Ở một mức độ nào đó nó thành công.

--- Biên tập: --

Cố gắng giải thích thêm; trích dẫn từ tài liệu tham khảo trên.

Vectơ nguyên tử

Có ba loại vector nguyên tử mà bạn có thể gặp phải:

  • "Số"
  • "hợp lý"
  • "tính cách"

Điều cần nhớ về vectơ nguyên tử là tất cả các phần tử trong chúng chỉ thuộc một loại.

Danh sách

Danh sách có thể có nhiều loại mục khác nhau trong các thành phần khác nhau. Một thành phần của danh sách được phép là một danh sách khác, một vectơ nguyên tử (và những thứ khác).

Vui lòng tham khảo liên kết này .


2
Bị phản đối: ít nhất bạn nên chỉ cho chúng tôi đến phần cụ thể của trang web đó, phần trả lời câu hỏi ban đầu.
nbro

2

danh sách bao gồm nhiều kiểu dữ liệu như ký tự, số, lôgic et. nhưng vector chỉ chứa loại dữ liệu tương tự. cho người yêu cũ:

scores <- c(20,30,40,50)
student <- c("A","B","C","D")
sc_log <- c(TRUE,FALSE,FALSE,TRUE)

cho danh sách:

mylist <- list(scores,student,sc_log)
# search for class of mylist vector 
#check structure of mylist using str() function.
str(mylist)
[1] list of 3
[1] $:num [1:4] 20 30 40 50
[2] $:chr [1:4] "A""B""C""D"
[3] $:log [1:4] TRUE FALSE FALSE TRUE

có nghĩa là danh sách chứa nhiều kiểu dữ liệu như số, ký tự và lôgic trong danh sách của tôi. Nhưng trong vectơ sẽ có một kiểu dữ liệu duy nhất của tất cả các phần tử trong vectơ đó

cho người yêu cũ:

cho vectơ:

vector1 <- c(1,2,3,4)
Class(vector1)
[1] "Numeric"

#which means all elements of vector containing single data type that is numeric only.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.