2011-06-05 12 views
10

Tengo una matriz y una función que toma un vector y devuelve una matriz. Quiero aplicar la función a todas las filas de la matriz y reunir todos los resultados. Por ejemploFuerza aplicar para devolver una lista

mat <- matrix(1:6, ncol=2) 
f <- function (x) cbind(1:sum(x), sum(x):1) 
do.call(rbind, apply(mat, 1, f)) 

Esto funciona perfectamente ya que las matrices devueltas tienen diferentes números de filas, de modo que apply devuelve una lista. Pero si sucede que tiene el mismo número de filas esto ya no funciona:

mat <- f(3) 
apply(mat, 1, f) 

aplican devuelve una matriz de la que no puedo conseguir el resultado que quiero. ¿Es posible forzar la aplicación para devolver una lista o hay otra solución?

Respuesta

13

Tiene que dividir el tapete de matriz antes de aplicar la función f.

list_result <- lapply(split(mat,seq(NROW(mat))),f) 
matrix_result <- do.call(rbind,list_result) 
+0

Esto funciona. No sabía sobre la función de división. ¡Gracias! – mosaic

+0

Esto tiene problemas cuando tiene que manejar matrices vacías porque seq (0) da c (1,0). – meow

17

Es por eso que amo el paquete plyr. Tiene una serie de funciones --ply que funcionan todas de la misma manera. La primera letra corresponde a lo que tiene como entrada y el segundo método corresponde a lo que tiene como resultado (l para listas, a para matrices, d para marcos de datos).

Por lo tanto la función alply() funciona de forma similar a apply() pero siempre devuelve una lista:

alply(mat, 1, f) 
Cuestiones relacionadas