Estou fazendo algumas operações de dados com tapply()
e ele retorna um list
objeto semelhante a -. Por exemplo:
x <- 1:10
y <- rep(c('A', 'B'), each = 5)
lst.1 <- tapply(x, y, function(vec) return(vec), simplify = FALSE)
lst.1
# $A
# [1] 1 2 3 4 5
#
# $B
# [1] 6 7 8 9 10
Quero transformá-lo em um arquivo data.frame
. Uma intuição está usando as.data.frame()
, mas falhou.
as.data.frame(lst.1)
# lst1
# A 1, 2, 3, 4, 5
# B 6, 7, 8, 9, 10
Eu crio outra lista manualmente para imitar lst.1
e as.data.frame()
funciona conforme esperado.
lst.2 <- list(A = 1:5, B = 6:10)
lst.2
# $A
# [1] 1 2 3 4 5
#
# $B
# [1] 6 7 8 9 10
as.data.frame(lst.2)
# A B
# 1 1 6
# 2 2 7
# 3 3 8
# 4 4 9
# 5 5 10
Qual é a diferença entre lst.1
e lst.2
? E como converter corretamente uma lista retornada por tapply
(ie lst.1
) em a data.frame
?
Se você observar a estrutura da lista retornada por
tapply()
, verá que ela possui um atributo de dimensão e é uma lista e um array.Isso significa que quando você chama
as.data.frame()
o método que está sendo despachado nos bastidores éas.data.frame.array()
e nãoas.data.frame.list()
. Para contornar isso você pode invocar o método que deseja usar diretamente:Ou use:
De
?tapply
:Portanto,
lst.1
está na verdade mais próximo de anarray
, embora pareça umlist
. A tabela a seguir mostra algumas diferenças em termos declass
,dim
, edimnames
.class()
dim()
dimnames()
lst.2
"list"
lst.1
"array"
[1] "A" "B"
Duas soluções para converter
lst.1
em data.frame:Chame explicitamente o
as.data.frame
método para class'list'
:Use
c()
para desatar o array de listas como uma lista comum:Saída