【问题标题】:Add columns of a matrix based on values of another vector根据另一个向量的值添加矩阵的列
【发布时间】:2016-02-19 07:00:50
【问题描述】:

假设我有以下矩阵:

 mat <- matrix(1:20, ncol=5)
      [,1] [,2] [,3] [,4] [,5]
[1,]    1    5    9   13   17
[2,]    2    6   10   14   18
[3,]    3    7   11   15   19
[4,]    4    8   12   16   20

和下面的向量

counts=c(2,1,2)

我需要通过添加基于该向量计数的每个值的列来折叠此矩阵。这意味着前两列最相加,第三列保持相等并对最后两列求和。我得到的矩阵一定是这样的

      [,1] [,2] [,3] 
[1,]    6    9   30
[2,]    8   10   32
[3,]    10  11   34
[4,]    12  12   36

鉴于在我的情况下我有一个非常大的矩阵和一个具有不同值的计数向量,我该如何以自动方式执行此操作?

【问题讨论】:

    标签: r matrix collapse


    【解决方案1】:

    一种方法是通过“counts”向量复制“counts”序列,将其用于split“mat”的列序列以返回list,使用@987654324循环遍历list @,使用列索引到subset 每个list 元素的“垫子”并获取rowSums

    mat2 <- sapply(split(1:ncol(mat), rep(seq_along(counts), counts)), 
               function(i) rowSums(mat[,i,drop=FALSE]))
    dimnames(mat2) <- NULL
    mat2
    #     [,1] [,2] [,3]
    #[1,]    6    9   30
    #[2,]    8   10   32
    #[3,]   10   11   34
    #[4,]   12   12   36
    

    【讨论】:

      【解决方案2】:

      另一个想法,在概念上类似于 akrun 的:

      t(rowsum(t(mat), rep(seq_along(counts), counts)))
      #      1  2  3
      #[1,]  6  9 30
      #[2,]  8 10 32
      #[3,] 10 11 34
      #[4,] 12 12 36
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多