【问题标题】:Sum of some positions in a row - R连续一些位置的总和 - R
【发布时间】:2018-05-23 17:54:01
【问题描述】:

考虑一个通用矩阵 nxn - 例如:

A <- matrix(1:16, nrow = 4, ncol = 4)

如何计算“右下”三角形中各行的总和并在向量中显示信息?

【问题讨论】:

    标签: r matrix sum


    【解决方案1】:

    找到封装所需数据的掩码:

    > mask <- apply(lower.tri(A, diag = FALSE), 1, rev)
    > mask
          [,1]  [,2]  [,3]  [,4]
    [1,] FALSE FALSE FALSE FALSE
    [2,] FALSE FALSE FALSE  TRUE
    [3,] FALSE FALSE  TRUE  TRUE
    [4,] FALSE  TRUE  TRUE  TRUE
    

    将此掩码相乘并计算总和:

    > A * mask
         [,1] [,2] [,3] [,4]
    [1,]    0    0    0    0
    [2,]    0    0    0   14
    [3,]    0    0   11   15
    [4,]    0    8   12   16
    
    >  rowSums(A * mask)
    [1]  0 14 26 36
    

    【讨论】:

    • rowSums(A * lower.tri(A)[,ncol(A):1])怎么样
    【解决方案2】:
    A = matrix(1:16, 4)
    A
    #      [,1] [,2] [,3] [,4]
    # [1,]    1    5    9   13
    # [2,]    2    6   10   14
    # [3,]    3    7   11   15
    # [4,]    4    8   12   16
    
    sapply(1:NROW(A), function(i) sum(tail(A[i,], i - 1)))
    #[1]  0 14 26 36
    

    【讨论】:

      【解决方案3】:

      这里有一个解决方案。关键是使用lower.triupper.tri函数,然后使用apply对每一行或每一列进行排序。最后计算每一行的总和。

      # Create example data frame
      m <- matrix(1:16, 4)
      m
      #      [,1] [,2] [,3] [,4]
      # [1,]    1    5    9   13
      # [2,]    2    6   10   14
      # [3,]    3    7   11   15
      # [4,]    4    8   12   16
      
      # Calculate the sum 
      rowSums(m * apply(lower.tri(m), 1, sort))
      # [1] 0 14 26 36
      
      rowSums(m * apply(upper.tri(m), 2, sort))
      # [1] 0 14 26 36
      

      【讨论】:

        猜你喜欢
        • 2019-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多