2010-03-18 9 views
8

Supongamos que tengo una matriz foo de la siguiente manera:la conversión de una matriz a una lista

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

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

me gustaría convertirlo en una lista que se parece a

[[1]] 
[1] 1 15 

[[2]] 
[1] 2 16 

[[3]] 
[1] 3 17 

Puede hacerlo como siguiente manera:

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

estoy interesado en una altern método educativo que no es tan complicado. Tenga en cuenta que si solo hace apply(foo, 1, function(x) list(c(x[1], x[2]))), devuelve una lista dentro de una lista, que espero evitar.

Respuesta

14

Aquí es una solución más limpia:

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

que se aprovecha del hecho de que una trama de datos es realmente sólo una lista de vectores de igual longitud (mientras que una matriz es realmente un vector que se muestra con las columnas y filas ... puedes ver esto llamando a foo [5], por ejemplo).

También puede hacer esto, aunque no es una gran mejora:

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

Su 'as.list() método' es perfecto. Y también mucho más rápido que mi método (0.847 s v. 2.45 s). – andrewj

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

¿Debería funcionar esto también para la matriz NxN? –

Cuestiones relacionadas