Was sind die Unterschiede zwischen Vektor- und Listendatentypen in R?

127

Was sind die Hauptunterschiede zwischen Vektor- und Listendatentypen in R? Welche Vor- oder Nachteile hat die Verwendung dieser beiden Datentypen (oder nicht)?

Ich würde mich über Beispiele freuen, die die Anwendungsfälle der Datentypen veranschaulichen.

DCR
quelle

Antworten:

77

Technisch Listen sind Vektoren, obwohl nur sehr wenige würde diesen Begriff verwenden. "Liste" ist einer von mehreren Modi, wobei andere "logisch", "Zeichen", "numerisch", "Ganzzahl" sind. Was Sie Vektoren nennen, sind "Atomvektoren" im strengen R-Sprachgebrauch:

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

Listen sind ein "rekursiver" Typ (eines Vektors), während Atomvektoren nicht:

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

Sie verarbeiten Datenobjekte mit unterschiedlichen Funktionen, je nachdem, ob sie rekursiv oder atomar sind oder dimensionale Attribute (Matrizen und Arrays) aufweisen. Ich bin mir jedoch nicht sicher, ob eine Diskussion der "Vor- und Nachteile" verschiedener Datenstrukturen eine ausreichend fokussierte Frage für SO ist. Zusätzlich zu den Aussagen von Tommy gibt es neben Listen, die eine beliebige Anzahl anderer Vektoren enthalten können, auch Datenrahmen, bei denen es sich um einen bestimmten Listentyp handelt, der ein Dimensionsattribut aufweist, das seine Struktur definiert. Im Gegensatz zu Matrizen und Arrays, die wirklich gefaltete atomare Objekte sind, können Datenrahmen unterschiedliche Typen enthalten, einschließlich Faktortypen.

Es gibt auch die Einschränkung, dass die is.vectorFunktion zurückgegeben wird, FALSEwenn andere Attribute als Namen vorhanden sind. Siehe: Was ist Vektor?

IRTFM
quelle
54

Listen sind "rekursiv". Dies bedeutet, dass sie Werte unterschiedlichen Typs enthalten können, auch andere Listen:

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

In R werden Listen verwendet, um Datensätze darzustellen: Die data.frameKlasse ist im Wesentlichen eine Liste, in der jedes Element eine Spalte eines bestimmten Typs ist.

Eine andere Verwendung ist die Darstellung eines Modells: Das Ergebnis von lmgibt eine Liste zurück, die eine Reihe nützlicher Objekte enthält.

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)

Atomvektoren (nicht listähnlich, aber numerisch, logisch und zeichenartig) sind nützlich, da bekannt ist, dass alle Elemente denselben Typ haben. Dies macht die Manipulation sehr schnell.

Tommy
quelle
20

Als jemand, der gerade in R eingestiegen ist, aber aus einem C / Java / Ruby / PHP / Python-Hintergrund stammt, denke ich folgendermaßen darüber nach.

A listist wirklich ein Array + eine Hashmap. Es ist ein assoziatives PHP-Array.

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

A vectorist ein Array / eine Liste vom festen Typ. Stellen Sie sich das wie eine verknüpfte Liste vor - denn das Einfügen unterschiedlicher Elemente in eine verknüpfte Liste ist sowieso ein Anti-Muster. Es ist ein Vektor im gleichen Sinne, wie SIMD / MMX / Vektoreinheiten das Wort verwenden.

Andy V.
quelle
3
keyMit der namesMethode können Sie s in Vektoren haben .
gokul_uf
9

Diese und ähnliche einleitende Fragen werden unter http://www.burns-stat.com/pages/Tutor/hints_R_begin.html beantwortet

Es soll eine sanfte Einführung sein, die Sie so schnell wie möglich mit R zum Laufen bringt. Bis zu einem gewissen Grad gelingt es.

--- Bearbeiten: -

Ein Versuch, weiter zu erklären; zitiert aus der obigen Referenz.

Atomvektor

Es gibt drei Arten von Atomvektoren, denen Sie wahrscheinlich begegnen:

  • "Numerisch"
  • "logisch"
  • "Charakter"

Bei Atomvektoren ist zu beachten, dass alle Elemente in ihnen nur von einem Typ sind.

Aufführen

Listen können verschiedene Arten von Elementen in verschiedenen Komponenten enthalten. Eine Komponente einer Liste darf eine andere Liste sein, ein Atomvektor (und andere Dinge).

Bitte beachten Sie auch diesen Link.

Patrick Burns
quelle
2
Downvoted: Sie sollten uns zumindest auf den spezifischen Abschnitt dieser Website verweisen, der die ursprüngliche Frage beantwortet.
Nbro
2

Liste enthalten mehrere Datentypen wie Zeichen, Zahlen, logische et. Der Vektor enthält jedoch nur ähnliche Datentypen. zum Beispiel:

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

für Liste:

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

Dies bedeutet, dass die Liste mehrere Datentypen wie numerisch, zeichenweise und logisch in mylist enthält. Im Vektor gibt es jedoch einen einzelnen Datentyp aller Elemente in diesem Vektor

zum Beispiel:

für 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
quelle