which()函数的结果是否始终在R中排序?

时间:2019-03-05 23:40:14

标签: r r-base

我想确保which(..., arr.ind = TRUE)的结果始终是有序的,特别是:以(col, row)升序排列。我在which函数文档中没有看到这样的评论,而根据我所做的一些实验,似乎就是这种情况。如何检查/了解是否是这种情况?

示例。当我运行下面的代码时,输​​出是一个矩阵,其中结果按(col, row)列升序排列。

> set.seed(1)
> vals <- rnorm(10)
> valsall <- sample(as.numeric(replicate(10, vals)))
> mat <- matrix(valsall, 10, 10)
> which(mat == max(mat), arr.ind = TRUE)
      row col
 [1,]   1   1
 [2,]   3   1
 [3,]   1   2
 [4,]   2   2
 [5,]  10   2
 [6,]   1   6
 [7,]   2   8
 [8,]   4   8
 [9,]   1   9
[10,]   6   9 

1 个答案:

答案 0 :(得分:1)

第1部分:

如果文档不够用,那么在没有深入了解功能which()的情况下,回答了关于如何更深入地了解功能的问题的一部分。

由于match()不是原始函数(用C编写),即使用R的基本构造块编写,因此我们可以通过打印函数本身来检查幕后情况。请注意,使用反引号允许检查具有保留名称的功能,例如+,因此在此示例中为可选。如此密集的R代码阅读起来可能非常累人,但我发现它非常有教育意义,并且确实可以偶尔解决一些心理难题。

> print(`which`)
function (x, arr.ind = FALSE, useNames = TRUE) 
{
    wh <- .Internal(which(x))
    if (arr.ind && !is.null(d <- dim(x))) 
        arrayInd(wh, d, dimnames(x), useNames = useNames)
    else wh
}
<bytecode: 0x00000000058673e0>
<environment: namespace:base>

第2部分:

因此,在放弃尝试以上述方式理解which和arrayInd函数之后,我将以常识进行尝试。检查对我有意义的矩阵/数组的每个值的最有效方法是在某个时候将其转换为一维对象。从矩阵到原子矢量的强制转换,或者任何尺寸的缩减都将始终导致将每个尺寸的完整列连接在一起,因此对我来说,很自然的,高级功能也将遵循这一基本规则。

> testmat <- matrix(1:10, nrow = 2, ncol = 5)
> testmat
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    3    5    7    9
[2,]    2    4    6    8   10
> as.numeric(testmat)
 [1]  1  2  3  4  5  6  7  8  9 10 

我发现Hadley Wickham的Advanced R是回答您的问题的极有价值的资源,尤其是有关函数和数据结构的章节。 [http://adv-r.had.co.nz/][1]