2009-10-03 21 views
8

Tome el siguiente código:convertir una matriz de listas a una matriz regular

foo <- list() 
foo[[1]] <- list(a=1, b=2) 
foo[[2]] <- list(a=11, b=22) 
foo[[3]] <- list(a=111, b=222) 
result <- do.call(rbind, foo) 
result[,'a'] 

En este caso, result[,'a'] muestra una lista. ¿Hay una manera más elegante tal que result es una matriz "regular" de vectores? Me imagino que hay formas manuales de resolver esto, pero me preguntaba si había un paso obvio que me estaba perdiendo.

Respuesta

9

do.call en las listas es muy elegante, y rápido. De hecho, do.call (rbind, my.list) una vez me salvó el culo cuando necesitaba combinar una gran lista. Fue, de lejos, la solución más rápida.

para resolver su problema, tal vez algo como:

do.call(rbind, lapply(foo, unlist)) 


> result.2 <- do.call(rbind, lapply(foo, unlist)) 
> result.2 
     a b 
[1,] 1 2 
[2,] 11 22 
[3,] 111 222 
> result.2[, 'a'] 
[1] 1 11 111 
> 
+1

Deseo '' do.call' + rbind' fue rápido. ¿Alguna vez has intentado usarlo con 10,000 marcos de datos en una lista? – hadley

+0

@hadley: Me parece recordar haber aprendido en una clase de estadísticas de computación que esta era la forma más rápida (después de muchos otros intentos fallidos) de vincular listas. Quizás estoy recordando algo equivocado. ¿Qué es más rápido? – Vince

+2

Puede administrar aproximadamente 4 veces más rápido si lo escribe con cuidado. 'rbind.fill' en la próxima versión de plyr incorporará mis últimos mejores esfuerzos. – hadley

1

Una posible solución es la siguiente (pero estoy interesado en las alternativas):

new.result <- matrix(unlist(result), ncol=ncol(result), 
       dimnames=list(NULL, colnames(result))) 
Cuestiones relacionadas