以下面的矩阵为例,我想找到一些值的数组下标。
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