例如,如果我们有一个矩阵或说数组具有以下格式
我们怎样才能找到内部或列之间只有10到20之间数字的索引?
M = array(c(1,1,12,34,0,19,15,1,0,17,12,0,21,1,11,1), dim=c(4,4))
而且,我也不允许使用for或while循环来执行此操作。 另一件事是矩阵或阵列可能具有多于2个维度。如果该方法也可以应用于多维矩阵或数组,那对我来说会更好。谢谢。
我不需要尝试查找限定单个元素的索引,而是需要找到所有元素都在间隔之间的行或列。
在这个例子中,我希望得到一个结果,告诉我第3行是一行,该行中的所有数字都在10到20之间。
答案 0 :(得分:3)
使用which(..., arr.ind = TRUE)
。这里我假设之间的意味着10和20是非包容性的
which(M > 10 & M < 20, arr.ind = TRUE)
# row col
# [1,] 3 1
# [2,] 2 2
# [3,] 3 2
# [4,] 2 3
# [5,] 3 3
# [6,] 3 4
这也适用于三维数组(及更高版本)。
## Three dimensions
dim(M) <- c(2, 4, 2)
which(M > 10 & M < 20, arr.ind = TRUE)
# dim1 dim2 dim3
# [1,] 1 2 1
# [2,] 2 3 1
# [3,] 1 4 1
# [4,] 2 1 2
# [5,] 1 2 2
# [6,] 1 4 2
## Four dimensions
dim(M) <- rep(2, 4)
which(M > 10 & M < 20, arr.ind = TRUE)
# dim1 dim2 dim3 dim4
# [1,] 1 2 1 1
# [2,] 2 1 2 1
# [3,] 1 2 2 1
# [4,] 2 1 1 2
# [5,] 1 2 1 2
# [6,] 1 2 2 2
## ... and so on
注意:要包含10和20,只需使用M >= 10 & M <= 20
数据:强>
M <- structure(c(1, 1, 12, 34, 0, 19, 15, 1, 0, 17, 12, 0, 21, 1,
11, 1), .Dim = c(4L, 4L))
更新:在编辑中,您可以找到所有值介于10到20之间的行号
which(rowSums(M >= 10 & M <= 20) == ncol(M))
# [1] 3