2009-10-30 20 views
18

Tengo una lista de listas que se ve así: x[[state]][[year]]. Cada elemento de esto es un marco de datos, y acceder a ellos individualmente no es un problema.rbind dataframes en una lista de listas

Sin embargo, me gustaría encontrar marcos de datos en varias listas. Más específicamente, me gustaría tener tantos marcos de datos como años tenga, es decir, reunir todos los marcos de datos estatales dentro de cada año. En otras palabras, me gustaría combinar todos los datos de mi estado, año por año, en marcos de datos separados.

Sé que puedo combinar una sola lista en un marco de datos con do.call("rbind",list). Pero no sé cómo puedo hacerlo a través de listas de listas.

+2

Por curiosidad, ¿por qué se trata de datos de esta manera en lugar de tener una trama de datos grande con todos los datos? –

Respuesta

6

se puede hacer algo a lo largo de las siguientes líneas (no pude probar ya que no tengo tal estructura):

extract.year <- function(my.year) lapply(x, function(y) y[[my.year]]) 

x.by.year <- sapply(my.list.of.years, function(my.year) 
    do.call(rbind, extract.year(my.year))) 

El año extracto función crea una lista que contiene sólo las tramas de datos para el año dado. A continuación, les rbind ...

+2

Las cosas se complicaron con la respuesta anterior, así que probé tu enfoque, ¡lo que funcionó! Con una pequeña modificación. La primera línea devolvió el marco de datos que estaba buscando. La segunda línea no funcionó, así que en su lugar recurrí al paquete plyr de Hadley. Este comando devuelve una lista de marcos de datos encuadernados perfectamente después de su primera línea: llply (my.list.of.years, function (my.year) do.call (rbind, extract.year (my.year))) Increíble, gracias chicos por ayudar! – bshor

+1

ldply() es incluso más rápido y más eficiente. – bshor

32

colapso en una primera lista:

list <- unlist(listoflists, recursive = FALSE) 
df <- do.call("rbind", list) 
+0

¡Gracias por la pronta ayuda! Pero esto no es exactamente lo que quiero. Tu respuesta me da un cuadro de datos ÚNICO de todos los marcos de datos dentro de la lista de listas (usando unislist, un comando genial que nunca supe). Pero me gustaría una lista de 32 marcos de datos enlazados, que son tantos como yo, que combinan todos los estados. La primera línea de sus respuestas me da una lista de longitud de estado * aproximadamente (aunque por alguna razón obtengo una longitud = 1584, no 32 * 50 = 1600 como era de esperar). Así que creo que esa es una pista ... – bshor

+0

Después de un poco más de experimentación, creo que estoy llegando a algún lado. Nombré los elementos de la lista de estados por primera vez, de modo que ahora los elementos de la lista no listada (después del primer comando de Hadley) ahora tienen nombres útiles como "AL3" y "TX4". Ahora tengo que combinar todos los 3 juntos, todos los 4, y así sucesivamente. – bshor

+0

Oh chico, supongo que las expresiones regulares son parte de la respuesta. Probé grep ("1 $", nombres (lista)) para obtener las listas que llevan el nombre "1", pero eso me da todos los años con un 1 en ellos, como 11, 21, 31. Probé grep ("\ D1 $", nombres (lista)) pero no ir. – bshor

Cuestiones relacionadas