首页 文章

当使用R中的另一个矩阵索引矩阵时,保留结构

提问于
浏览
1

亲爱的StackOverflowers,

我在R中有一个整数矩阵,我想将其子集化,以便在每列中删除1个指定的单元格 . 因此,例如,4x3矩阵变为3x3矩阵 . 我试过通过创建相同维度的第二个逻辑矩阵来做到这一点 .

(subject.matrix <- matrix(1:12, nrow = 4))
     [,1] [,2] [,3]
[1,]    1    5    9
[2,]    2    6   10
[3,]    3    7   11
[4,]    4    8   12
(query.matrix <- matrix(c(T, T, F, T, T, F, T, T, T, T, T, F), nrow = 4))
      [,1]  [,2]  [,3]
[1,]  TRUE  TRUE  TRUE
[2,]  TRUE FALSE  TRUE
[3,] FALSE  TRUE  TRUE
[4,]  TRUE  TRUE FALSE

问题在于,当我用第二个矩阵索引第一个矩阵时,它被简化为整数向量 .

subject.matrix[query.matrix]
[1]  1  2  4  5  7  8  9 10 11

我试过添加drop = F,但无济于事 . 我知道,我可以将生成的矢量包装成3x3矩阵 . 所以预期的结果将是:

matrix(subject.matrix[query.matrix], nrow = 3)
     [,1] [,2] [,3]
[1,]    1    5    9
[2,]    2    7   10
[3,]    4    8   11

但我想知道是否还有's a more elegant/direct solution. I' m也没有附加到使用逻辑矩阵作为索引,如果这意味着更简单的解决方案 . 也许,我可以使用每列中要删除的行的索引向量对其进行子集化,在这种情况下将转换为 c(3, 2, 4) .

非常感谢!

根据@LyzandeR建议进行编辑:我的最终目标是获取结果矩阵的列总和 . 因此,用NA替换冗余值似乎是最好的方法 .

2 回答

  • 1

    我认为你可以保留矩阵结构的唯一方法是使用更通用的方法来编辑你的问题,即:

    matrix(subject.matrix[query.matrix], ncol = ncol(subject.matrix))
    

    如果您打算多次使用它,您甚至可以将其转换为函数:

    subset.mat <- function(mat, index, cols=ncol(mat)) {
      matrix(mat[index], ncol = cols)
    }
    

    输出:

    > subset.mat(subject.matrix, query.matrix)
         [,1] [,2] [,3]
    [1,]    1    5    9
    [2,]    2    7   10
    [3,]    4    8   11
    

    另外(抱歉只读了你的更新评论)你可能会考虑在矩阵中使用NA而不是将它们分组,这样你就可以按照你的说法计算列总和:

    subject.matrix[!query.matrix] <- NA
    subject.matrix
    #    [,1] [,2] [,3]
    #[1,]    1    5    9
    #[2,]    2   NA   10
    #[3,]   NA    7   11
    #[4,]    4    8   NA
    
  • 2

    这有点蛮力,但我认为你能够把它推断成更通用的东西:

    new.matrix = matrix(ncol = ncol(subject.matrix), nrow = nrow(subject.matrix) - 1)
    for(i in 1:ncol(subject.matrix)){
      new.matrix[,i] = subject.matrix[,i][query.matrix[,i] == TRUE]
    }
    new.matrix
    
          [,1] [,2] [,3]
    [1,]    1    5    9
    [2,]    2    7   10
    [3,]    4    8   11
    

    本质上,我只是初始化一个空矩阵,然后迭代遍历subject.matrix的每一列,只获取query.matrix的TRUE值 .

相关问题