我有一个矩阵和一个带矢量并返回矩阵的函数。我想将函数应用于矩阵的所有行并将所有结果一起rbind。例如
mat <- matrix(1:6, ncol=2)
f <- function (x) cbind(1:sum(x), sum(x):1)
do.call(rbind, apply(mat, 1, f))
这很有效,因为返回的矩阵具有不同的行数,因此apply返回一个列表。但如果他们碰巧有相同数量的行,那就不再适用了:
mat <- f(3)
apply(mat, 1, f)
apply返回一个矩阵,我无法得到我想要的结果。是否可以强制申请返回列表或是否有其他解决方案?
答案 0 :(得分:18)
这就是我喜欢plyr
套餐的原因。它有许多--ply
函数,它们都以相同的方式工作。第一个字母对应于您输入的内容,第二个方法对应于您输出的内容(列表为l
,数组为a
,数据帧为d
。
因此alply()
函数与apply()
的工作方式类似,但始终返回一个列表:
alply(mat, 1, f)
答案 1 :(得分:13)
在应用函数f之前,你必须拆分矩阵垫。
list_result <- lapply(split(mat,seq(NROW(mat))),f)
matrix_result <- do.call(rbind,list_result)