2009-10-03 10 views
8

régulière Prenez le code suivant:convertir une matrice de listes à une matrice

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

Dans ce cas, result[,'a'] présente une liste. Y a-t-il un moyen plus élégant tel que result est une matrice "régulière" de vecteurs? J'imagine qu'il y a des façons manuelles d'y parvenir, mais je me demandais s'il y avait une étape évidente qui me manquait.

Répondre

9

do.call sur les listes est très élégant et rapide. En fait, do.call (rbind, my.list) une fois sauvé mon cul quand j'avais besoin de combiner une énorme liste. C'était de loin la solution la plus rapide.

Pour résoudre votre problème, peut-être quelque chose comme:

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

Je souhaite rbind' était rapide '' do.call' +. Avez-vous déjà essayé de l'utiliser avec 10 000 trames de données dans une liste ?! – hadley

+0

@hadley: Il me semble me souvenir d'avoir appris dans une classe de statistiques de calcul que c'était le moyen le plus rapide (après bien d'autres tentatives ratées) de lier des listes. Peut-être que je me souviens de la mauvaise chose. Quoi de plus rapide? – Vince

+2

Vous pouvez gérer environ 4x plus rapidement si vous l'écrivez attentivement vous-même. 'rbind.fill' dans la prochaine version de plyr incorporera mes derniers efforts. – hadley

1

Une solution possible est la suivante (mais je suis intéressé par des alternatives):

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