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

Я хочу заверить, что результат 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 голос
/ 21 марта 2019

Part1:

Отвечая на часть вашего вопроса о том, как понимать функции на более глубоком уровне, если документации недостаточно, не вдаваясь в детали функции 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]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...