Quais são as diferenças entre os tipos de dados vetoriais e de lista em R?

127

Quais são as principais diferenças entre os tipos de dados vetoriais e de lista no R? Quais são as vantagens ou desvantagens de usar (ou não) esses dois tipos de dados?

Eu gostaria de ver exemplos que demonstrem os casos de uso dos tipos de dados.

DCR
fonte

Respostas:

77

Tecnicamente, listas são vetores, embora muito poucos usem esse termo. "lista" é um dos vários modos, com outros sendo "lógico", "caractere", "numérico", "número inteiro". O que você está chamando de vetores são "vetores atômicos" em linguagem estrita R:

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

As listas são do tipo "recursivo" (de vetor), enquanto os vetores atômicos não são:

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

Você processa objetos de dados com funções diferentes, dependendo de serem recursivos, atômicos ou possuírem atributos dimensionais (matrizes e matrizes). No entanto, não tenho certeza de que uma discussão sobre as "vantagens e desvantagens" de diferentes estruturas de dados seja uma questão suficientemente focada para o SO. Para acrescentar ao que Tommy disse, além de as listas serem capazes de conter um número arbitrário de outros vetores, existe a disponibilidade de quadros de dados que são um tipo particular de lista que possui um atributo dimensional que define sua estrutura. Ao contrário de matrizes e matrizes que são realmente objetos atômicos dobrados, os quadros de dados podem conter tipos variados, incluindo tipos de fatores.

Há também a ressalva de que a is.vectorfunção retornará FALSEquando houver atributos diferentes de nomes. Veja: o que é vetor?

IRTFM
fonte
54

As listas são "recursivas". Isso significa que eles podem conter valores de tipos diferentes, até outras 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

As listas são usadas em R para representar conjuntos de dados: a data.frameclasse é essencialmente uma lista em que cada elemento é uma coluna de um tipo específico.

Outro uso é ao representar um modelo: o resultado de lmretorna uma lista que contém vários objetos úteis.

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)

Os vetores atômicos (que não são do tipo lista, mas numéricos, lógicos e caracteres) são úteis, pois todos os elementos são conhecidos por terem o mesmo tipo. Isso torna a manipulação muito rápida.

Tommy
fonte
20

Como alguém que acabou de entrar no R, mas vem de um background C / Java / Ruby / PHP / Python, aqui está como eu penso nisso.

A listé realmente uma matriz + um hashmap. É uma matriz associativa PHP.

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

A vectoré uma matriz / lista de tipo fixo. Pense nisso como uma lista vinculada - porque colocar itens diferentes em uma lista vinculada é um antipadrão de qualquer maneira. É um vetor no mesmo sentido que as unidades SIMD / MMX / vetor usam a palavra.

Andy V
fonte
3
Você pode ter keys em vetores usando o namesmétodo
gokul_uf
9

Esta e outras perguntas introdutórias semelhantes são respondidas em http://www.burns-stat.com/pages/Tutor/hints_R_begin.html

Ele deve ser uma introdução suave que coloca você em funcionamento com o R o mais rápido possível. Até certo ponto, consegue.

--- Editar: -

Uma tentativa de explicar mais; citada da referência acima.

Vetor atômico

Existem três variedades de vetores atômicos que você provavelmente encontrará:

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

O que deve ser lembrado sobre os vetores atômicos é que todos os elementos neles são de apenas um tipo.

Lista

As listas podem ter diferentes tipos de itens em diferentes componentes. Um componente de uma lista pode ser outra lista, um vetor atômico (e outras coisas).

Por favor, consulte também este link.

Patrick Burns
fonte
2
Votos negativos: você deve pelo menos nos indicar a seção específica desse site que responde à pergunta original.
Nr 8/18
2

lista incluem vários tipos de dados como caractere, numérico, lógico et. mas o vetor contém apenas tipos de dados semelhantes. por exemplo:

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

para 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

o que significa lista contendo vários tipos de dados como numérico, caractere e lógico em mylist. Mas no vetor, haverá um único tipo de dado de todos os elementos nesse vetor

por exemplo:

para vetor:

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
fonte