Convertir una lista en un marco de datos
Tengo una lista anidada de datos. Su longitud es 132 y cada elemento es una lista de longitud 20. ¿Existe una solución rápida ? de convertir esta estructura en un marco de datos que tenga 132 filas y 20 columnas de datos?
Aquí hay algunos datos de muestra con los que trabajar:
l <- replicate(
132,
as.list(sample(letters, 20)),
simplify = FALSE
)
Conrbind
do.call(rbind.data.frame, your_list)
Editar: la versión anterior devuelve 's data.frame
en list
lugar de vectores (como @IanSudbery señaló en los comentarios).
Actualización de julio de 2020:
El valor predeterminado para el parámetro stringsAsFactors
es ahora default.stringsAsFactors()
, que a su vez se convierte FALSE
en su valor predeterminado.
Suponiendo que su lista de listas se llame l
:
df <- data.frame(matrix(unlist(l), nrow=length(l), byrow=TRUE))
Lo anterior convertirá todas las columnas de caracteres en factores; para evitar esto, puede agregar un parámetro a la llamada a data.frame():
df <- data.frame(matrix(unlist(l), nrow=132, byrow=TRUE),stringsAsFactors=FALSE)
Puedes usar el plyr
paquete. Por ejemplo una lista anidada del formulario
l <- list(a = list(var.1 = 1, var.2 = 2, var.3 = 3)
, b = list(var.1 = 4, var.2 = 5, var.3 = 6)
, c = list(var.1 = 7, var.2 = 8, var.3 = 9)
, d = list(var.1 = 10, var.2 = 11, var.3 = 12)
)
ahora tiene una longitud de 4 y cada lista l
contiene otra lista de longitud 3. Ahora puede ejecutar
library (plyr)
df <- ldply (l, data.frame)
y debería obtener el mismo resultado que en la respuesta @Marek y @nico.
Corregir los datos de muestra para que coincidan con la descripción original 'cada elemento es una lista de longitud 20'
mylistlist <- replicate(
132,
as.list(sample(letters, 20)),
simplify = FALSE
)
Podemos convertirlo en un marco de datos como este:
data.frame(t(sapply(mylistlist,c)))
sapply
lo convierte en una matriz.
data.frame
convierte la matriz en un marco de datos.
Resultando en: