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

时间:2015-12-09 16:07:08

标签: r matrix indexing

亲爱的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

但我想知道是否有更优雅/直接的解决方案。我也不依赖于使用逻辑矩阵作为索引,如果这意味着更简单的解决方案。也许,我可以使用每列中要删除的行的索引向量对其进行子集化,在这种情况下将转换为c(3, 2, 4)

非常感谢!

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

2 个答案:

答案 0 :(得分:2)

我认为保留矩阵结构的唯一方法是使用更一般的问题编辑方式,即:

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

答案 1 :(得分:1)

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

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值。