【问题标题】:Vectorizing which operation across the rows of a matrix向量化跨矩阵行的操作
【发布时间】:2020-02-06 14:47:59
【问题描述】:

我想向量化(apply)矩阵X 上的which 操作,如以下for 循环所示,结果向量ind

X   = matrix( 1:20, 4, 5 )
V   = sample( 1:20, 4 )
ind = numeric()
for( i in 1:nrow(X) ) ind[i] = max( c(0, which(X[i,] < V[i]) ))

该操作在ind 中为X 中的每一行返回最大值小于VX-row-corresponding 元素所指示的值的元素的索引。

操作max 将所有符合条件的索引的向量映射到一个标量。或者,我会对返回的操作感到满意,例如所有索引的list(我可以lapplymax)。

【问题讨论】:

    标签: r vectorization


    【解决方案1】:

    如果您的矩阵像您分享的示例一样具有增加的值(我当然对此表示怀疑),但如果确实如此,您可以简单地做到,

    rowSums(X < V)
    #[1] 4 3 4 0
    

    但是,如果不是这种情况,那么一个简单的apply 就足够了,即

    apply(X < V, 1, function(i)max(which(i)))
    #[1]    4    3    4 -Inf
    

    记住所有的数学运算都是向量化的,所以&lt;是向量化的

    您可以照常替换-Inf

    【讨论】:

      【解决方案2】:
      apply(
          (X < V) * X
          , 1
          , which.max
      )
      

      【讨论】:

      • 这给出了错误的输出。 - 仅供参考,不是我的反对意见
      【解决方案3】:

      这是一个简单的 lapply 示例

      X   = matrix( 1:20, 4, 5 )
      V   = sample( 1:20, 4 )
      ind = numeric()
      for( i in 1:nrow(X) ) ind[i] = max( c(0, which(X[i,] < V[i]) ))
      
      mymax = function(matrix, sample) {
          whichlist = which(matrix < sample)
          max(0, whichlist)
      }
      ind2 = unlist(lapply(1:nrow(X), function(r) mymax(X[r,], V[r])))
      
      identical(ind, ind2)
      # [1] TRUE
      

      【讨论】:

        【解决方案4】:

        这是另一个答案,您首先在 X 的每一行中 sweep 向量 V,然后使用 apply 来确定每行的最大 TRUE 元素。

        set.seed(14)
        X   = matrix( 1:20, 4, 5 )
        V   = sample( 1:20, 4 )
        ind1 = numeric()
        for( i in 1:nrow(X) ) ind1[i] =  max(c(0, which(X[i,] < V[i]) ))
        
        
        
        ind2 <- apply(
          sweep(X, 1, V, "<"),
          1,
          function(x){
            max(
            which(
              x,
              arr.ind = TRUE)
            )
          }
        )
        
        
        > ind1
        [1] 2 5 2 4
        > ind2
        [1] 2 5 2 4
        

        【讨论】:

          猜你喜欢
          • 2011-01-25
          • 1970-01-01
          • 2014-01-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多