2009-10-03 34 views
8

prendere il codice seguente:convertire una matrice di liste ad una matrice regolare

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'] 

In questo caso, result[,'a'] mostra un elenco. Esiste un modo più elegante in modo che result sia una matrice "regolare" di vettori? Immagino che ci siano modi manuali per farlo, ma mi stavo chiedendo se ci fosse un passo ovvio che mi mancava.

risposta

9

do.call sulle liste è molto elegante, e veloce. Infatti do.call (rbind, my.list) mi ha salvato una volta il culo quando avevo bisogno di combinare una lista enorme. Era di gran lunga la soluzione più veloce.

per risolvere il problema, forse qualcosa di simile:

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

auguro 'do.call' +' rbind' era veloce. Hai mai provato a usarlo con 10.000 frame di dati in un elenco ?! – hadley

+0

@hadley: Mi sembra di ricordare di aver appreso in una classe statistica di calcolo che questo era il modo più veloce (dopo molti altri tentativi falliti) di legare le liste. Forse sto ricordando la cosa sbagliata. Cos'è più veloce? – Vince

+2

Puoi gestire circa 4 volte più velocemente se lo scrivi attentamente da solo. 'rbind.fill' nella prossima versione di plyr incorporerà i miei ultimi migliori sforzi. – hadley

1

Una possibile soluzione è la seguente (ma sono interessati a soluzioni alternative):

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