3.9 Listas
Chegamos ao último tópico antes de voltarmos aos data frames: as listas.
Listas são objetos muito importantes dentro do R. Primeiro porque todo data frame é uma lista. Segundo porque elas são bem parecidas com vetores, mas com uma diferença essencial: você pode misturar diferentes classes de objetos dentro dela.
Para criar uma lista, rodamos list(valor1, valor2, valor3)
.
list(1, "a", TRUE)
## [[1]]
## [1] 1
##
## [[2]]
## [1] "a"
##
## [[3]]
## [1] TRUE
Veja que não houve coerção. Ainda temos um valor número, um texto e um valor lógico dentro da lista.
O subsetting de listas é um pouco diferente do que o de vetores. Isso porque cada elemento de uma lista também é uma lista. Veja o que acontece se tentarmos usar []
para pegar um elemento de uma lista.
<- list(1, "a", TRUE)
lista
1]
lista[## [[1]]
## [1] 1
class(lista[1])
## [1] "list"
O R nos retorna uma lista com apenas aquele elemento. Se quisermos o elemento de fato dentro de cada posição, precisamos usar dois colchetes:
1]]
lista[[## [1] 1
class(lista[[1]])
## [1] "numeric"
Cada elemento de uma lista ser uma lista é importante pois isso nos permite colocar vetores de tamanhos diferentes em cada posição. Isso faz das listas uma estrutura bem flexível para guardar dados.
<- list(1:3, "a", c(TRUE, TRUE, FALSE, FALSE))
lista
lista## [[1]]
## [1] 1 2 3
##
## [[2]]
## [1] "a"
##
## [[3]]
## [1] TRUE TRUE FALSE FALSE
1]
lista[## [[1]]
## [1] 1 2 3
2]
lista[## [[1]]
## [1] "a"
3]
lista[## [[1]]
## [1] TRUE TRUE FALSE FALSE
É muito comum darmos nomes para cada posição de uma lista.
<- list(cliente = "Ana Silva", idade = 25, estado_civil = NA)
dados_cliente
dados_cliente## $cliente
## [1] "Ana Silva"
##
## $idade
## [1] 25
##
## $estado_civil
## [1] NA
Agora, dentro da lista, o valor Ana Silva
, por exemplo, está sendo atribuído ao nome cliente
. Esse nome só existirá dentro da lista.
Um detalhe importante: os iguais utilizados nas atribuições dos nomes dentro da lista não podem ser substituídos por <-
.
Quando as posições de uma lista tem nome, podemos acessar seus valores diretamente utilizando o operador $
.
$cliente
dados_cliente## [1] "Ana Silva"
$idade
dados_cliente## [1] 25
$estado_civil
dados_cliente## [1] NA
Repare que o R devolve o valor dentro de cada posição, e não uma lista.
1]
dados_cliente[## $cliente
## [1] "Ana Silva"
$cliente
dados_cliente## [1] "Ana Silva"
class(dados_cliente[1])
## [1] "list"
class(dados_cliente$cliente)
## [1] "character"
Isto implica que, nesse exemplo, dados_cliente$cliente
é equivalente a dados_cliente[[1]]
.
Conforme ficamos mais e mais proficientes na linguagem R, as listas passam a ficar cada vez mais frequentes. Voltaremos a falar delas diversas vezes nos próximos capítulos, em especial no Capítulo 10.