我想确保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
答案 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]