1

マトリックス内のすべての値の値、行インデックス、および列インデックスの両方の関数をマトリックスに適用して、変換されたマトリックスを取得したいと思います。例えば

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ループはその仕事をすることができますが、それは効率的でもエレガントでもありません。助言がありますか?ありがとう

4

2 に答える 2

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
于 2013-03-08T05:16:41.813 に答える
0

これは、いくつかの迅速で汚い仕事のためだけに、applyの醜い使用法です。秘訣は、行(または列)インデックス用に列(または行)を追加することです。

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})
于 2013-03-08T05:52:49.887 に答える