获取R中由向量指示的所有列的元素等于x的行的索引

时间:2016-08-28 19:53:02

标签: r matrix

我们有一个矩阵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指示的任一列中都有零,而不是同时在所有列中都有。

3 个答案:

答案 0 :(得分:8)

怎么样

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)

答案 1 :(得分:3)

如果ind应该是一个向量,那么你应该引用它的元素,而不是整个元素。例如:

id

此答案假设您知道要提前搜索多少列。

答案 2 :(得分:1)

我们也可以用rowSums否定并获得索引

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

如果我们分解步骤

rowSums(M[, ind]!=0)
#[1] 1 2 0 1 0

第3个和第4个元素是唯一没有任何非零值的元素,因此rowSums返回0。否定输出返回TRUE为0,对于所有其他

返回FALSE
!rowSums(M[, ind]!=0)
#[1] FALSE FALSE  TRUE FALSE  TRUE

现在,使用which换行将返回TRUE元素的索引。