Jakie są różnice między typami danych wektorowych i listowymi w języku R?

127

Jakie są główne różnice między typami danych wektorowych i listowymi w języku R? Jakie są zalety lub wady używania (lub nie) tych dwóch typów danych?

Byłbym wdzięczny za obejrzenie przykładów, które pokazują przypadki użycia typów danych.

DCR
źródło

Odpowiedzi:

77

Z technicznego punktu widzenia listy wektorami, chociaż bardzo niewielu użyłoby tego terminu. „lista” jest jednym z kilku trybów, inne to „logiczny”, „znakowy”, „numeryczny”, „całkowity”. To, co nazywacie wektorami, to „wektory atomowe” w ścisłym języku R:

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

Listy są typu „rekurencyjnego” (wektorowego), podczas gdy wektory atomowe nie są:

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

Przetwarzasz obiekty danych z różnymi funkcjami w zależności od tego, czy są one rekurencyjne, atomowe czy mają atrybuty wymiarowe (macierze i tablice). Jednak nie jestem pewien, czy dyskusja na temat „zalet i wad” różnych struktur danych jest wystarczająco ukierunkowaną kwestią dla SO. Aby dodać do tego, co powiedział Tommy, oprócz tego, że listy mogą zawierać dowolną liczbę innych wektorów, istnieje dostępność ramek danych, które są szczególnym typem listy, która ma atrybut wymiarowy, który określa jej strukturę. W przeciwieństwie do macierzy i tablic, które są naprawdę złożonymi obiektami atomowymi, ramki danych mogą zawierać różne typy, w tym typy czynników.

Istnieje również zastrzeżenie, że is.vectorfunkcja zwróci, FALSEgdy istnieją atrybuty inne niż nazwy. Zobacz: co to jest wektor?

IRTFM
źródło
54

Listy są „rekurencyjne”. Oznacza to, że mogą zawierać wartości różnych typów, nawet inne listy:

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

Listy są używane w języku R do reprezentowania zestawów danych: data.frameklasa jest zasadniczo listą, w której każdy element jest kolumną określonego typu.

Innym zastosowaniem jest reprezentacja modelu: wynik z lmzwraca listę zawierającą kilka przydatnych obiektów.

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)

Wektory atomowe (inne niż listowe, ale numeryczne, logiczne i znakowe) są przydatne, ponieważ wiadomo, że wszystkie elementy mają ten sam typ. To sprawia, że ​​manipulowanie nimi jest bardzo szybkie.

Tommy
źródło
20

Jako ktoś, kto dopiero co wszedł do R, ale wywodzi się z C / Java / Ruby / PHP / Python, oto jak o tym myślę.

A listto tak naprawdę tablica + hashmap. To tablica asocjacyjna PHP.

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

A vectorto tablica / lista o ustalonym typie. Potraktuj to jak listę połączoną - ponieważ umieszczanie różnych elementów na liście połączonej jest i tak anty-wzorcem. Jest to wektor w tym samym sensie, w jakim jednostki SIMD / MMX / wektorowe używają tego słowa.

Andy V
źródło
3
Możesz mieć keys w wektorach za pomocą namesmetody.
gokul_uf
9

Odpowiedzi na to i podobne pytania wstępne można znaleźć w witrynie http://www.burns-stat.com/pages/Tutor/hints_R_begin.html

Ma to być delikatne wprowadzenie, które pozwoli Ci jak najszybciej rozpocząć pracę z R. W pewnym stopniu się to udaje.

--- Edytować: --

Próba dalszego wyjaśnienia; cytowany z powyższego odniesienia.

Wektor atomowy

Istnieją trzy odmiany wektorów atomowych, które prawdopodobnie napotkasz:

  • „Numeryczny”
  • "logiczny"
  • "postać"

W przypadku wektorów atomowych należy pamiętać, że wszystkie zawarte w nich pierwiastki są tylko jednego typu.

Lista

Listy mogą mieć różne typy elementów w różnych komponentach. Składnik listy może być inną listą, wektorem atomowym (i innymi rzeczami).

Proszę również zapoznać się z tym linkiem.

Patrick Burns
źródło
2
Negocjowane: powinieneś przynajmniej wskazać nam konkretną sekcję tej witryny, która odpowiada na pierwotne pytanie.
nbro
2

lista zawiera wiele typów danych, takich jak znakowe, numeryczne, logiczne itp. ale wektor zawiera tylko podobny typ danych. na przykład:

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

dla listy:

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

co oznacza listę zawierającą wiele typów danych, takich jak numeryczne, znakowe i logiczne, ale w wektorze będzie jeden typ danych dla wszystkich elementów w tym wektorze

na przykład:

dla wektora:

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
źródło