2013-03-08 4 views
1

Я хотел бы применить к матрице функцию как значения, индекса строки и индекса столбца для каждого значения в матрице, так и получить преобразованную матрицу. НапримерR применить к матрице функцию столбцов и индекс строки

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 может выполнять эту работу, но он не будет эффективным и элегантным. Любые предложения? Благодаря

+3

Если функция векторизации то 'F (мат, ряд (мат), Col (мат))' должна работать – mnel

ответ

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 
+0

Спасибо! Спасибо также @mnel – user2147028

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}) 
Смежные вопросы