亲爱的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替换冗余值似乎是最好的方法。
答案 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值。