Результат функции which() * всегда * упорядочен по R?

Я хочу заверить, что результат 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 ответ

Часть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 

Я нашел Advanced R Хэдли Уикхэма чрезвычайно ценным ресурсом, чтобы ответить на ваш вопрос, особенно главы о функциях и структурах данных. [ http://adv-r.had.co.nz/][1]

Другие вопросы по тегам