¿Cuáles son las diferencias entre los tipos de datos vectoriales y de lista en R?

127

¿Cuáles son las principales diferencias entre los tipos de datos vectoriales y de lista en R? ¿Cuáles son las ventajas o desventajas de usar (o no) estos dos tipos de datos?

Agradecería ver ejemplos que demuestren los casos de uso de los tipos de datos.

DCR
fuente

Respuestas:

77

Técnicamente, las listas son vectores, aunque muy pocos usarían ese término. "lista" es uno de varios modos, y otros son "lógico", "carácter", "numérico", "entero". Lo que llama vectores son "vectores atómicos" en estricto lenguaje R:

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

Las listas son del tipo "recursivo" (de vector) mientras que los vectores atómicos no son:

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

Usted procesa objetos de datos con diferentes funciones dependiendo de si son recursivos, atómicos o tienen atributos dimensionales (matrices y matrices). Sin embargo, no estoy seguro de que una discusión sobre las "ventajas y desventajas" de las diferentes estructuras de datos sea una pregunta suficientemente enfocada para SO. Para agregar a lo que dijo Tommy, además de que las listas pueden contener un número arbitrario de otros vectores, existe la disponibilidad de marcos de datos que son un tipo particular de lista que tiene un atributo dimensional que define su estructura. A diferencia de las matrices y las matrices que en realidad son objetos atómicos plegados, los marcos de datos pueden contener diferentes tipos, incluidos los tipos de factores.

También existe la advertencia de que la is.vectorfunción volverá FALSEcuando haya atributos distintos de los nombres. Ver: ¿qué es el vector?

IRTFM
fuente
54

Las listas son "recursivas". Esto significa que pueden contener valores de diferentes tipos, incluso otras listas:

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

Las listas se usan en R para representar conjuntos de datos: la data.frameclase es esencialmente una lista donde cada elemento es una columna de un tipo específico.

Otro uso es cuando se representa un modelo: el resultado de lmdevuelve una lista que contiene un montón de objetos útiles.

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)

Los vectores atómicos (no similares a listas, pero numéricos, lógicos y de caracteres) son útiles ya que se sabe que todos los elementos tienen el mismo tipo. Esto hace que manipularlos sea muy rápido.

Tommy
fuente
20

Como alguien que acaba de ingresar a R, pero proviene de un fondo C / Java / Ruby / PHP / Python, así es como lo pienso.

A listes realmente una matriz + un hashmap. Es una matriz asociativa de PHP.

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

A vectores una matriz / lista de tipo fijo. Piense en ello como una lista vinculada, porque de todos modos, poner elementos diferentes en una lista vinculada es un antipatrón. Es un vector en el mismo sentido que las unidades SIMD / MMX / vector usan la palabra.

Andy V
fuente
3
Puedes tener keys en vectores usando el namesmétodo
gokul_uf
9

Esta y otras preguntas introductorias similares se responden en http://www.burns-stat.com/pages/Tutor/hints_R_begin.html

Está destinado a ser una introducción suave que lo pone en funcionamiento con R lo más rápido posible. Hasta cierto punto tiene éxito.

--- Editar: -

Un intento de explicar más; citado de la referencia anterior.

Vector atómico

Hay tres variedades de vectores atómicos que es probable que encuentre:

  • "numérico"
  • "lógico"
  • "personaje"

Lo que hay que recordar sobre los vectores atómicos es que todos los elementos en ellos son de un solo tipo.

Lista

Las listas pueden tener diferentes tipos de elementos en diferentes componentes. Un componente de una lista puede ser otra lista, un vector atómico (y otras cosas).

Consulte también este enlace.

Patrick Burns
fuente
2
Votación negativa: al menos debe indicarnos la sección específica de ese sitio web que responde a la pregunta original.
nbro
2

La lista incluye múltiples tipos de datos como caracteres, numéricos, lógicos, etc. pero el vector solo contiene un tipo similar de datos. por ejemplo:

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

para la lista:

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

lo que significa una lista que contiene múltiples tipos de datos como numérico, de caracteres y lógico en mylist. Pero en el vector habrá un solo tipo de datos de todos los elementos en ese vector

por ejemplo:

para el vector:

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
fuente