【问题标题】:apply over rows and columns conditioned to the value of other matrix without a loop R在没有循环的情况下应用于其他矩阵的值的行和列 R
【发布时间】:2013-09-06 08:53:50
【问题描述】:

如果其他矩阵的值满足某些条件,我正在尝试按矩阵中的元素执行操作。我知道如何通过使用行和列的for 循环来解决它,但我确信在 R 中有更有效的方法来解决它。我尝试过使用apply(...,c(1,2),FUN),但不知道如何解决cond 的元素来检查它的值:

m <- matrix(rnorm(9),3,3)
cl <- c('a','b','c')
cond <- matrix(sample(cl,9,replace=T),3,3)
res.m <- apply(m, c(1,2), function(x) if (cond == 'a' ) { x*10 } if (cond == 'b' ) { x*-10 } else  { 0 }

【问题讨论】:

    标签: r apply


    【解决方案1】:

    这是一个非常简单的方法。使用命名向量来设置条件。

    首先,这是我正在处理的数据:

    set.seed(1)
    m <- matrix(rnorm(9),3,3)
    cl <- c('a','b','c')
    cond <- matrix(sample(cl,9,replace=T),3,3)
    m
    #            [,1]       [,2]      [,3]
    # [1,] -0.6264538  1.5952808 0.4874291
    # [2,]  0.1836433  0.3295078 0.7383247
    # [3,] -0.8356286 -0.8204684 0.5757814
    
    cond
    #      [,1] [,2] [,3]
    # [1,] "b"  "a"  "a" 
    # [2,] "c"  "b"  "b" 
    # [3,] "c"  "a"  "a"
    

    第二,一个简洁的解决方案。

    m * c(a = 10, b = -10, c = 0)[cond]
    #          [,1]      [,2]      [,3]
    # [1,] 6.264538 15.952808  4.874291
    # [2,] 0.000000 -3.295078 -7.383247
    # [3,] 0.000000 -8.204684  5.757814
    

    基本上,c(a = 10, b = -10, c = 0)[cond] 使用您的“cond”矩阵创建一个向量,您可以使用该向量将原始矩阵乘以。

    【讨论】:

      【解决方案2】:

      你可以试试这个:

      m[conda] <- m[conda <- cond == 'a'] * 10
      m[condb] <- m[condb <- cond == 'b'] * -10
      m[!conda & !condb] <- 0
      

      【讨论】:

      • 这个解决方案对我不起作用。我得到Error: object 'conda' not found。想法?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 2019-12-06
      • 2014-02-19
      • 2016-06-04
      • 1970-01-01
      相关资源
      最近更新 更多