我们有一个矩阵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
指示的任一列中都有零,而不是同时在所有列中都有。
答案 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,对于所有其他
!rowSums(M[, ind]!=0)
#[1] FALSE FALSE TRUE FALSE TRUE
现在,使用which
换行将返回TRUE元素的索引。