Различные длины вектора при использовании NA - PullRequest
2 голосов
/ 22 января 2020

Я получаю интересные результаты от следующих и не знаю почему.

match(3, 1:2)

возвращает NA

c(1, 3)[NA]

возвращает NA NA

c(1, 3)[match(3, 1:2)]

возвращает NA

Что здесь происходит? Почему второй и третий результаты имеют разную длину? Интуитивно понятно, что замена match(3, 1:2) его результатом NA должна дать тот же результат, но это не так. Что вызывает это?

1 Ответ

2 голосов
/ 22 января 2020

Есть эффект утилизации. В случае match, если совпадений нет, по умолчанию nomatch = NA_integer

c(1, 3)[match(3, 1:2)]
#[1] NA

, в то время как OP использовал NA_logical_, не указывая тип, и он просто перерабатывает NA в length вектора, т.е. 2. Если мы сделаем преобразование типа, получим тот же вывод

c(1, 3)[as.logical(match(3, 1:2))]
#[1] NA NA

То же самое можно повторить в обратном порядке

c(1, 3)[NA_integer_]
#[1] NA

Причина в том, что упоминается в ?NA

NA - логическая константа длины 1, которая содержит индикатор пропущенного значения. NA может быть приведен к любому другому векторному типу, кроме raw. Существуют также константы NA_integer_, NA_real_, NA_complex_ и NA_character_ других атомных c векторных типов, которые поддерживают пропущенные значения: все это зарезервированные слова в языке R.

Логические вычисления обрабатывают NA как пропущенную TRUE Значение / FALSE и т. Д. Может возвращать TRUE или FALSE, если выражение не зависит от операнда NA.

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