我要保证,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 发布于 2019-03-21 12:48:29
Part1:
如果文档还不够,请回答一部分关于如何在更深层次上理解函数的问题,而不讨论函数()的细节。
由于match()不是一个基元函数(用C编写),即使用R的基本构建块编写,所以我们可以通过打印函数本身来检查幕后发生了什么。请注意,使用backticks可以检查具有保留名称的函数,例如+,因此在本例中是可选的。这个密集的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>Part2:
因此,在放弃尝试以上述方式理解哪个函数和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在回答您的问题时是一个非常有价值的资源,特别是关于函数和数据结构的章节。[http://adv-r.had.co.nz/][1]
https://stackoverflow.com/questions/55013328
复制相似问题