2011-06-05 57 views
10

我有一个矩阵和一个函数,它接受一个向量并返回一个矩阵。我想将该函数应用于矩阵的所有行,并将所有结果混合在一起。例如,强制适用于返回列表

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

由于返回的矩阵具有不同的行数,所以适用返回一个列表,因此可以很好地工作。但是,如果他们碰巧有行相同的数字,这并不工作了:

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

申请返回一个矩阵从中我无法得到我想要的结果。是否有可能强制适用于返回列表或有其他解决方案?

回答

13

您必须在应用函数f之前拆分矩阵垫。

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

这工作。我不知道拆分功能。谢谢! – mosaic 2011-06-05 08:07:02

+0

由于seq(0)给出c(1,0),所以当你必须处理空矩阵时,会遇到问题。 – meow 2015-01-27 15:43:53

17

这就是为什么我喜欢plyr包。它有一些--ply函数,都以相同的方式工作。第一个字母对应于输入内容,第二个方法对应于输出内容(列表为l,数组为a,数据框为d)。

所以alply()功能的工作原理类似apply()但总是返回一个列表:

alply(mat, 1, f)