2010-03-18 7 views
8

Supposons que j'ai une matrice foo comme suit:convertir une matrice à une liste

foo <- cbind(c(1,2,3), c(15,16,17)) 

> foo 
    [,1] [,2] 
[1,] 1 15 
[2,] 2 16 
[3,] 3 17 

Je voudrais en faire une liste qui ressemble à

[[1]] 
[1] 1 15 

[[2]] 
[1] 2 16 

[[3]] 
[1] 3 17 

Vous pouvez le faire en suit:

lapply(apply(foo, 1, function(x) list(c(x[1], x[2]))), function(y) unlist(y))

Je suis intéressé par un Altern méthode active qui n'est pas aussi compliquée. Notez, si vous faites juste apply(foo, 1, function(x) list(c(x[1], x[2]))), il renvoie une liste dans une liste, que j'espère éviter.

Répondre

14

est ici une solution plus propre:

as.list(data.frame(t(foo))) 

Cela profite du fait qu'une trame de données est vraiment juste une liste de vecteurs de longueur égale (alors qu'une matrice est vraiment un vecteur qui est affiché avec des colonnes et des lignes ... vous pouvez le voir en appelant foo [5], par exemple).

Vous pouvez aussi le faire, bien qu'il ne soit pas beaucoup d'une amélioration:

lapply(1:nrow(foo), function(i) foo[i,]) 
+0

Votre méthode 'as.list()' est parfait. Et aussi beaucoup plus rapide que ma méthode (0.847 s v. 2.45 s). – andrewj

6
library(plyr) 
alply(foo, 1) 
+0

Est-ce que cela devrait également fonctionner pour la matrice NxN? –

Questions connexes