【问题标题】:R apply on a matrix a function of columns and row indexR在矩阵上应用列和行索引的函数
【发布时间】:2013-03-08 05:00:49
【问题描述】:

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

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 循环可以完成这项工作,但它既不高效也不优雅。 有什么建议么? 谢谢

【问题讨论】:

  • 如果你的函数是矢量化的,那么f(mat, row(mat), col(mat)) 应该可以工作

标签: r matrix apply lapply


【解决方案1】:

试试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

【讨论】:

  • 谢谢!还要感谢@mnel
【解决方案2】:

这是 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})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    相关资源
    最近更新 更多