R在矩阵上应用列和行索引的函数

时间:2013-03-08 05:00:49

标签: r matrix apply lapply

我想在矩阵上应用矩阵中每个值的值,行索引和列索引的函数,并获得转换后的矩阵。 例如

mat<-matrix(c(1,2,3,4),2,2)    
mat
     [,1] [,2]
[1,]    1    3
[2,]    2    4

f<-function(x,i,j){x+i+j}
mat2 <- my.apply(f,mat)
mat2
     [,1] [,2]
[1,]    3    6
[2,]    5    8

上面的示例仅用于说明目的,f可能要复杂得多。

apply不能完成这项工作,因为处理额外参数的方式。

apply(mat,1:2,f,seq_along(mat[,1]),seq_along(mat[1,]))
, , 1

     [,1] [,2]
[1,]    3    4
[2,]    5    6

, , 2

     [,1] [,2]
[1,]    5    6
[2,]    7    8

我找不到lapply家族的方式。 for循环可以完成这项工作,但它不会高效也不优雅。 有什么建议? 谢谢

2 个答案:

答案 0 :(得分:10)

尝试mapply

mat <- matrix(c(1, 2, 3, 4), 2, 2)
mat
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4


matrix(mapply(function(x, i, j) x + i + j, mat, row(mat), col(mat)), nrow = nrow(mat))
##      [,1] [,2]
## [1,]    3    6
## [2,]    5    8

答案 1 :(得分:0)

这是一个丑陋的应用,只是为了一些快速和肮脏的工作。诀窍是为行(或列)索引添加一个额外的列(或行)。

mat <- matrix(c(1, 2, 3, 4), 2, 2)
t(apply(cbind(mat, 1:nrow(mat)), 1, function(x){x[1:ncol(mat)] + 1:ncol(mat) + x[ncol(mat)+1]}))
##     [,1] [,2]
##[1,]    3    5
##[2,]    6    8

如果您已经有一个功能f(x, i, j),您也可以尝试:

apply(cbind(mat, 1:nrow(mat)), 1, function(x){a = numeric(); for(j in 1:ncol(mat)){a[j] = f(x[j], x[ncol(mat)+1], j)}; a})