Quali sono le differenze tra i tipi di dati vettoriali e di elenco in R?


127

Quali sono le principali differenze tra i tipi di dati vettoriali e di elenco in R? Quali sono i vantaggi o gli svantaggi dell'utilizzo (o meno) di questi due tipi di dati?

Apprezzerei vedere esempi che dimostrano i casi d'uso dei tipi di dati.

Risposte:


77

Tecnicamente gli elenchi sono vettori, sebbene pochissimi userebbero questo termine. "list" è una delle varie modalità, con altre "logiche", "carattere", "numerico", "intero". Quelli che chiami vettori sono "vettori atomici" in stretto linguaggio R:

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

Le liste sono di tipo "ricorsivo" (di vettore) mentre i vettori atomici non lo sono:

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

Si elaborano oggetti dati con funzioni differenti a seconda che siano ricorsivi, atomici o abbiano attributi dimensionali (matrici e array). Tuttavia, non sono sicuro che una discussione sui "vantaggi e svantaggi" di diverse strutture di dati sia una domanda sufficientemente focalizzata per SO. A ciò che ha detto Tommy, oltre a essere in grado di contenere un numero arbitrario di altri vettori, si aggiunge la disponibilità di dataframe che sono un particolare tipo di lista che ha un attributo dimensionale che ne definisce la struttura. A differenza delle matrici e degli array che sono realmente oggetti atomici piegati, i dataframe possono contenere diversi tipi, inclusi i tipi di fattore.

C'è anche l'avvertenza che la is.vectorfunzione tornerà FALSEquando ci sono attributi diversi dai nomi. Vedi: cos'è il vettore?


54

Le liste sono "ricorsive". Ciò significa che possono contenere valori di diverso tipo, anche altri elenchi:

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

Gli elenchi vengono utilizzati in R per rappresentare i set di dati: la data.frameclasse è essenzialmente un elenco in cui ogni elemento è una colonna di un tipo specifico.

Un altro utilizzo è quando si rappresenta un modello: il risultato di lmrestituisce un elenco che contiene una serie di oggetti utili.

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)

I vettori atomici (non simili a liste, ma numerici, logici e caratteri) sono utili poiché tutti gli elementi sono noti per avere lo stesso tipo. Questo rende la loro manipolazione molto veloce.


20

Come qualcuno che è appena entrato in R, ma proviene da uno sfondo C / Java / Ruby / PHP / Python, ecco come lo penso.

A listè davvero un array + una hashmap. È un array associativo PHP.

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

A vectorè un array / elenco di tipo fisso. Pensalo come un elenco collegato, perché inserire elementi dissimili in un elenco collegato è comunque un anti-pattern. È un vettore nello stesso senso in cui le unità SIMD / MMX / vettore usano la parola.


3
Puoi avere keys in vettori usando il namesmetodo.
gokul_uf

9

Questa e altre domande introduttive simili trovano risposta in http://www.burns-stat.com/pages/Tutor/hints_R_begin.html

È pensato per essere un'introduzione delicata che ti consente di iniziare a utilizzare R il più rapidamente possibile. In una certa misura ci riesce.

--- Modificare: --

Un tentativo di spiegare ulteriormente; citato dal riferimento sopra.

Vettore atomico

Esistono tre varietà di vettori atomici che potresti incontrare:

  • "numerico"
  • "logico"
  • "carattere"

La cosa da ricordare sui vettori atomici è che tutti gli elementi in essi contenuti sono di un solo tipo.

Elenco

Gli elenchi possono avere diversi tipi di elementi in diversi componenti. Un componente di una lista può essere un'altra lista, un vettore atomico (e altre cose).

Fare riferimento anche a questo collegamento.


2
Downvoted: dovresti almeno indicarci la sezione specifica di quel sito web che risponde alla domanda originale.
nbro

2

l'elenco include più tipi di dati come carattere, numerico, logico e così via. ma il vettore contiene solo un tipo di dati simile. per es:

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

per elenco:

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

che significa elenco contenente più tipi di dati come numerico, carattere e logico nella mia lista, ma nel vettore ci sarà un unico tipo di dati di tutti gli elementi in quel vettore

per es:

per il vettore:

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

#which means all elements of vector containing single data type that is numeric only.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.