让我们有一个矩阵M,例如

> M
     [,1] [,2] [,3] [,4]
[1,]   15    0    0    9
[2,]    0    1    8   24
[3,]    4    0    0    0
[4,]    3    2    0    0
[5,]    0    0   56    0


其列索引为ind的向量,例如

> ind=c(2,4)
> ind
[1] 2 4


和值x,例如x=0

如何获得矩阵M的行的索引,该矩阵在ind指示的所有列中的元素都等于x

以下代码返回正确的行索引:

> which(M[,2]==0 & M[,4]==0)
[1] 3 5


但是我需要一个使用向量ind的解决方案,可能会很长。我试过了:

> which(M[,ind]==0)
[1]  1  3  5  8  9 10


但是相反,我在ind所指示的任一列中都得到了零,而不是同时在所有列中得到零。

最佳答案

怎么样

rowSums(M[, ind] == 0) == length(ind)
# [1] FALSE FALSE  TRUE FALSE  TRUE


让我们逐步分解代码:


M[, ind] == 0-获取显示M[, ind]为零的逻辑矩阵
rowSums(.)-确定每行有多少个TRUE值
. == length(ind)-将其与使用的列数进行比较


并且,如果需要数字索引,请将其包装在which()中。

which(rowSums(M[, ind] == 0) == length(ind))
# [1] 3 5


数据:

M <- structure(c(15L, 0L, 4L, 3L, 0L, 0L, 1L, 0L, 2L, 0L, 0L, 8L,
0L, 0L, 56L, 9L, 24L, 0L, 0L, 0L), .Dim = c(5L, 4L), .Dimnames = list(
    NULL, c("V1", "V2", "V3", "V4")))
ind <- c(2, 4)

09-10 01:34
查看更多