我想在矩阵上应用矩阵中每个值的值,行索引和列索引的函数,并获得转换后的矩阵。 例如
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
循环可以完成这项工作,但它不会高效也不优雅。
有什么建议?
谢谢
答案 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})