获取向量表示的所有列中元素等于x的行的索引,单位为R

获取向量表示的所有列中元素等于x的行的索引,单位为R,r,matrix,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=c(2,4) > ind [1] 2 4 其列索引的向量ind,例如 > M [,1] [,2] [,3] [,4]

让我们有一个矩阵
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=c(2,4)
> ind
[1] 2 4
其列索引的向量
ind
,例如

> 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=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]
    为零的位置
  • 行和(.)
    -确定每行中有多少个真值
  • ==长度(ind)
    -将其与使用的列数进行比较
如果需要数字索引,请将其包装在
which()

数据:

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)

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

ind = c(2,4)

x = 0

M = the matrix

which(M[,ind[1]] == x & M[,ind[2]] == x)

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

我们还可以使用
行和进行求反,并获取索引

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

如果我们打破台阶

rowSums(M[, ind]!=0)
#[1] 1 2 0 1 0
第三个和第四个元素是唯一没有任何非零值的元素,因此
行和
为其返回0。对输出求反将为0返回TRUE,对所有其他值返回FALSE

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

现在,使用
which
包装返回真元素的索引。

谢谢,这是一个改进,但是在我的情况下,我事先不知道关于M、ind或x的任何信息。需要稍微改进,以便解决
ind
向量长度为1:
的情况(行和(M[,ind,drop=FALSE]==0)=长度)(ind))