Apa perbedaan antara tipe data vektor dan daftar di R?

127

Apa perbedaan utama antara tipe data vektor dan daftar di R? Apa keuntungan atau kerugian menggunakan (atau tidak) kedua tipe data ini?

Saya sangat menghargai melihat contoh yang mendemonstrasikan kasus penggunaan tipe data.

DCR
sumber

Jawaban:

77

Secara teknis daftar adalah vektor, meskipun sangat sedikit yang akan menggunakan istilah itu. "list" adalah salah satu dari beberapa mode, dengan mode lainnya adalah "logical", "character", "numeric", "integer". Yang Anda sebut vektor adalah "vektor atom" dalam bahasa R ketat:

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

Daftar adalah jenis "rekursif" (dari vektor) sedangkan vektor atom bukan:

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

Anda memproses objek data dengan fungsi berbeda bergantung pada apakah objek tersebut rekursif, atom, atau memiliki atribut dimensi (matriks dan array). Namun, saya tidak yakin bahwa diskusi tentang "keuntungan dan kerugian" dari struktur data yang berbeda adalah pertanyaan yang cukup terfokus untuk SO. Untuk menambah apa yang dikatakan Tommy, selain list yang mampu menampung sembarang jumlah vektor lain, ada juga ketersediaan dataframe yang merupakan jenis list tertentu yang memiliki atribut dimensional yang mendefinisikan strukturnya. Tidak seperti matriks dan array yang benar-benar merupakan objek atom terlipat, dataframe dapat menampung berbagai jenis termasuk jenis faktor.

Ada juga peringatan bahwa is.vectorfungsi tersebut akan kembali FALSEjika ada atribut selain nama. Lihat: apa itu vektor?

IRTFM
sumber
54

Daftar bersifat "rekursif". Ini berarti mereka dapat berisi nilai dari tipe yang berbeda, bahkan daftar lainnya:

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

Daftar digunakan di R untuk merepresentasikan kumpulan data: the data.frame kelas pada dasarnya adalah daftar di mana setiap elemen adalah kolom dengan tipe tertentu.

Penggunaan lain adalah saat merepresentasikan model: hasil dari lmmengembalikan daftar yang berisi sekumpulan objek berguna.

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)

Vektor atom (seperti non-list, tetapi numerik, logika dan karakter) berguna karena semua elemen diketahui memiliki tipe yang sama. Ini membuat manipulasi mereka sangat cepat.

Tommy
sumber
20

Sebagai seseorang yang baru saja masuk ke R, tetapi berasal dari latar belakang C / Java / Ruby / PHP / Python, inilah pendapat saya tentang itu.

A listsebenarnya adalah sebuah array + sebuah peta hash. Ini adalah array asosiatif PHP.

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

A vectoradalah larik / daftar tipe tetap. Anggap saja seperti daftar tertaut - karena memasukkan item yang berbeda ke dalam daftar tertaut adalah anti-pola. Ini adalah vektor dalam arti yang sama dengan unit SIMD / MMX / vektor menggunakan kata tersebut.

Andy V
sumber
3
Anda dapat memiliki keys dalam vektor dengan menggunakan namesmetode ini.
gokul_uf
9

Pertanyaan pengantar ini dan yang serupa dijawab di http://www.burns-stat.com/pages/Tutor/hints_R_begin.html

Ini dimaksudkan sebagai pengantar lembut yang membuat Anda siap dan bekerja dengan R secepat mungkin. Untuk beberapa hal itu berhasil.

--- Edit: -

Upaya untuk menjelaskan lebih lanjut; dikutip dari referensi di atas.

Vektor atom

Ada tiga jenis vektor atom yang mungkin Anda temui:

  • “Numerik”
  • "logis"
  • "karakter"

Hal yang perlu diingat tentang vektor atom adalah bahwa semua elemen di dalamnya hanya satu jenis.

Daftar

Daftar dapat memiliki berbagai jenis item dalam berbagai komponen. Sebuah komponen list diperbolehkan menjadi list lain, vektor atom (dan hal-hal lain).

Silakan juga merujuk ke tautan ini .

Patrick Burns
sumber
2
Suara negatif: Anda setidaknya harus mengarahkan kami ke bagian tertentu dari situs web tersebut yang menjawab pertanyaan asli.
nbro
2

daftar termasuk beberapa tipe data seperti karakter, numerik, logika et. tetapi vektor hanya berisi jenis data yang serupa. misalnya:

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

untuk daftar:

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

yang artinya list berisi banyak tipe data seperti numeric, character dan logical di mylist. Namun pada vector akan terdapat single type data dari semua elemen dalam vector tersebut.

misalnya:

untuk vektor:

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

#which means all elements of vector containing single data type that is numeric only.
Devyani Balyan
sumber