Результат функции 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]