Eu tenho uma lista aninhada de dados. Seu comprimento é 132 e cada item é uma lista de comprimento 20. Existe uma maneira rápida de converter essa estrutura em um quadro de dados com 132 linhas e 20 colunas de dados?
Aqui estão alguns dados de amostra para trabalhar:
l <- replicate(
132,
list(sample(letters, 20)),
simplify = FALSE
)
Respostas:
Supondo que sua lista de listas seja chamada
l
:O acima irá converter todas as colunas de caracteres em fatores, para evitar isso, você pode adicionar um parâmetro à chamada data.frame ():
fonte
Com
rbind
Edit: retorno
data.frame
da versão anterior delist
's em vez de vetores (como @IanSudbery apontou nos comentários).fonte
rbind(your_list)
retorna uma matriz de lista 1x32?do.call
passa elementos deyour_list
as argumentos pararbind
. É equivalente arbind(your_list[[1]], your_list[[2]], your_list[[3]], ....., your_list[[length of your_list]])
.your_list
contenha vetores de tamanhos iguais.NULL
tem comprimento 0, portanto deve falhar.Você pode usar o
plyr
pacote. Por exemplo, uma lista aninhada do formulárioagora tem um comprimento de 4 e cada lista
l
contém outra lista do comprimento 3. Agora você pode executare deve obter o mesmo resultado que nas respostas @Marek e @nico.
fonte
matrix
abordagem.data.frame(t(sapply(mylistlist,c)))
sapply
converte-o em uma matriz.data.frame
converte a matriz em um quadro de dados.fonte
c
desempenhar aqui, uma instância dos dados da lista? Ah, espere, c pela função concatenar, certo? Confundindo-se com o uso de c. Também concordo com o @dchandler, acertar os nomes das colunas era uma necessidade valiosa no meu caso de uso. Solução brilhante.?c
:Combine Values into a Vector or List
suponha que sua lista seja chamada
L
,fonte
data.frame(Reduce(rbind, list(c('col1','col2'))))
produz um quadro de dados com 2 linhas, 1 coluna (eu esperava 1 linha 2 colunas)O pacote
data.table
tem a funçãorbindlist
que é uma implementação super rápidado.call(rbind, list(...))
.Pode levar uma lista de
lists
,data.frames
oudata.tables
como entrada.Isso retorna um
data.table
herda dedata.frame
.Se você realmente deseja converter novamente em data.frame, use
as.data.frame(DT)
fonte
setDF
agora permite retornar ao data.frame por referência.O
tibble
pacote possui uma funçãoenframe()
que resolve esse problema coagindolist
objetos aninhados a objetos aninhadostibble
("arrumar o quadro de dados"). Aqui está um breve exemplo do R for Data Science :Como você tem vários ninhos em sua lista,
l
você pode usar ounlist(recursive = FALSE)
para remover o aninhamento desnecessário para obter apenas uma única lista hierárquica e depois passar paraenframe()
. Eu usotidyr::unnest()
para desnaturar a saída em um único quadro de dados "organizado", com duas colunas (uma para o gruponame
e outra para as observações dos gruposvalue
). Se você deseja colunas que ampliam, é possível adicionar uma colunaadd_column()
que apenas repete a ordem dos valores 132 vezes. Então apenasspread()
os valores.fonte
Dependendo da estrutura de suas listas, existem algumas
tidyverse
opções que funcionam bem com listas de tamanhos diferentes:Você também pode misturar vetores e quadros de dados:
fonte
X2
não pode ser convertida de número inteiro para caractereRemodelar2 produz a mesma saída que o exemplo plyr acima:
rendimentos:
Se você estivesse quase sem pixels, poderá fazer tudo isso em 1 linha com reformulação ().
fonte
Este método usa um
tidyverse
pacote ( purrr ).A lista:
Convertendo-o em um quadro de dados (
tibble
mais especificamente):fonte
Ampliando a resposta da @ Marek: se você deseja evitar que as strings sejam transformadas em fatores e a eficiência não é uma preocupação, tente
fonte
Para o caso geral de listas profundamente aninhadas com 3 ou mais níveis, como os obtidos de um JSON aninhado:
considere a abordagem de
melt()
converter a lista aninhada em um formato alto primeiro:seguido por
dcast()
então para ampliar novamente em um conjunto de dados organizado, onde cada variável forma uma coluna e cada observação forma uma linha:fonte
Mais respostas, além de tempos na resposta a esta pergunta: Qual é a maneira mais eficiente de transmitir uma lista como um quadro de dados?
A maneira mais rápida, que não produz um quadro de dados com listas, em vez de vetores para colunas, parece ser (da resposta de Martin Morgan):
fonte
Às vezes, seus dados podem ser uma lista de listas de vetores do mesmo comprimento.
(Os vetores internos também podem ser listas, mas estou simplificando para facilitar a leitura).
Então você pode fazer a seguinte modificação. Lembre-se de que você pode desassistir um nível de cada vez:
Agora use seu método favorito mencionado nas outras respostas:
fonte
Isto é o que finalmente funcionou para mim:
do.call("rbind", lapply(S1, as.data.frame))
fonte
fonte
Para uma solução paralela (multicore, multisessão, etc) usando a
purrr
família de soluções, use:Onde
l
está a lista?Para comparar o mais eficiente,
plan()
você pode usar:fonte
O seguinte comando simples funcionou para mim:
Referência ( resposta do Quora )
Mas isso falhará se não for óbvio como converter a lista em um quadro de dados:
Nota : A resposta é referente ao título da pergunta e pode pular alguns detalhes da pergunta
fonte
Uma maneira curta (mas talvez não a mais rápida) de fazer isso seria usar a base r, pois um quadro de dados é apenas uma lista de vetores de comprimento igual . Assim, a conversão entre sua lista de entrada e um data.frame de 30 x 132 seria:
A partir daí, podemos transpor para uma matriz de 132 x 30 e convertê-la novamente em um dataframe:
Como uma linha:
Os nomes de usuário serão muito irritantes de se olhar, mas você sempre pode renomear aqueles com
rownames(new_df) <- 1:nrow(new_df)
fonte
Que tal usar a
map_
função junto com umfor
loop? Aqui está a minha solução:onde
map_dfr
converta cada elemento da lista em data.frame e depois os unerbind
.No seu caso, acho que seria:
fonte