which(arr.ind = TRUE) 不适用于 %in%

which(arr.ind = TRUE) doesn't work with %in%

以下面的矩阵为例,我想找到一些值的数组索引。

set.seed(123)
mat <- matrix(sample(1:5, 15, TRUE), 5, 3)

#      [,1] [,2] [,3]
# [1,]    3    5    5
# [2,]    3    4    3
# [3,]    2    1    3
# [4,]    2    2    1
# [5,]    3    3    4

如果它是单个值,比如 2,那么我可以使用 which(..., arr.ind = TRUE) 来查找坐标。

which(mat == 2, arr.ind = TRUE)

#      row col
# [1,]   3   1
# [2,]   4   1
# [3,]   4   2

但是,如果我想找到与一组值匹配的位置,比如说 c(1, 2),代码会给我一个向量索引。

which(mat %in% 1:2, arr.ind = TRUE)

# [1]  3  4  8  9 14

如何将其转换为 2 列形式以指示矩阵中的行和列?

原因是==保留了矩阵的结构,但%in%丢失了。

mat == 2
#       [,1]  [,2]  [,3]
# [1,] FALSE FALSE FALSE
# [2,] FALSE FALSE FALSE
# [3,]  TRUE FALSE FALSE
# [4,]  TRUE  TRUE FALSE
# [5,] FALSE FALSE FALSE

mat %in% 2
# [1] FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE

您可以使用arrayInd()将向量索引转换为矩阵中相应的行和列

arrayInd(which(mat %in% 1:2), dim(mat))

或将 mat %in% 1:2 转回矩阵以使 which(arr.ind = TRUE) 起作用。

which(array(mat %in% 1:2, dim(mat)), arr.ind = TRUE)

两者输出

#      row col
# [1,]   3   1
# [2,]   4   1
# [3,]   3   2
# [4,]   4   2
# [5,]   4   3