Convertir una lista en un marco de datos

Resuelto Btibert3 asked hace 54 años • 27 respuestas

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
)
Btibert3 avatar Jan 01 '70 08:01 Btibert3
Aceptado

Conrbind

do.call(rbind.data.frame, your_list)

Editar: la versión anterior devuelve 's data.frameen listlugar de vectores (como @IanSudbery señaló en los comentarios).

Marek avatar Nov 19 '2010 17:11 Marek

Actualización de julio de 2020:

El valor predeterminado para el parámetro stringsAsFactorses ahora default.stringsAsFactors(), que a su vez se convierte FALSEen 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)
nico avatar Nov 19 '2010 16:11 nico

Puedes usar el plyrpaquete. 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 lcontiene 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.

mropa avatar Nov 19 '2010 17:11 mropa

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)))

sapplylo convierte en una matriz. data.frameconvierte la matriz en un marco de datos.

Resultando en:

ingrese la descripción de la imagen aquí

Alex Brown avatar Nov 19 '2010 17:11 Alex Brown