Как ведут себя НА в R - PullRequest
2 голосов
/ 19 июня 2020

Поведение NA в R часто сбивает с толку. Например, NA + 1 возвращает NA, а NA^0 возвращает 1. У этого поста две цели:

  1. Ответить: почему АН ведет себя так? время и подтвердите это понимание

Ответы [ 2 ]

2 голосов
/ 19 июня 2020

Давайте взглянем на это философски. NA - индикатор пропущенного значения. Значит, ценности нет. Если вы не знаете число x, то x + 1 также неизвестен.

Однако для любого числа x x ^ 0 = 1, поэтому мы можем игнорировать ввод x для фактического вычисления вывод.

2 голосов
/ 19 июня 2020

В документации NA определяется как:

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

Проще говоря, они просто говорят вам, что значение отсутствует. Тип NA является логическим, а c вы можете определить по:

typeof(NA)
#> [1] "logical"

Создано 19.06.2020 с помощью пакета реплекс (v0. 3.0)

Обратите внимание, это не означает, что отсутствующее значение имеет тип логического. Это может быть любой тип, в конце концов, он отсутствует.

Вычисления с NA обычно возвращают NA (за исключением некоторых случаев).

Математика с NA

Числа c вычисления с NA обычно возвращают NA.

NA + 1
#> [1] NA

Создано 19.06.2020 с помощью пакета REPEX (v0.3.0)

Но не NA^0

NA^0
#> [1] 1

Создано 19.06.2020 пакетом REPEX (v0.3.0)

Чтобы лучше понять это, нужно помнить одну вещь в R: все, что происходит в R, является функциональным вызовом. Таким образом, вы можете переписать приведенное выше следующим образом.

`^`(NA,0)
#> [1] 1

Базовые функции (обычно), пытается принудить один вектор atomi c к другому, если в случае, если они имеют разный тип. Один из примеров этого приведен ниже, в котором LHS 1, который имеет тип numeri c, приводится к символьному типу.

1 == "1"
#> [1] TRUE

Создано 19.06.2020 Пакет (v0.3.0)

Когда это происходит, NA приводится к NA_ineger_, а затем становится идентификатором, т.е. любое число, возведенное в степень нуля, равно 1. Как и ожидалось, при попытке NA_character_ выдается ошибка.

NA_integer_^0
#> [1] 1
NA_real_^0
#> [1] 1
NA_complex_^0
#> [1] 1+0i
NA_character_^0
#> Error in NA_character_^0: non-numeric argument to binary operator

Создано 19.06.2020 пакетом REPEX (v0.3.0)

Логика с NA

Часто мы хотим проверить, является ли конкретная переменная (скажем, x) NA или нет, и интуитивно мы запускаем следующее, ожидая, что она вернется ИСТИНА или ЛОЖЬ.

x == NA
#> NA

Создано 2020-06-19 пакетом REPEX (v0.3.0)

Это может кажется неожиданным, но это имеет смысл, поскольку x может быть чем угодно (например, вектором, NA, целым числом и т. д. c), поэтому результат неоднозначен. Далее возникает очевидный вопрос: что произойдет, если мы сравним NA==NA. Это тоже приводит к NA, но результат неоднозначен, поскольку нет смысла сравнивать два отсутствующих значения. То же самое и с другими операторами, такими как >, <, !=, &, |, ||, &&. Чтобы проверить, является ли значение NA, используйте is.na().

NA == NA
#> [1] NA

Создано 19.06.2020 пакетом REPEX (v0.3.0)

Но в случае некоторых идентификаторов, которые являются ИСТИННЫМИ (или ЛОЖНЫМИ) независимо от значений, результатом будет ИСТИНА (или ЛОЖЬ). Например:

  1. Результат выражения a AND b будет ИСТИНА тогда и только тогда, когда оба a и b ИСТИНА. Во всех остальных случаях это ЛОЖЬ. 1
FALSE && NA
#> [1] FALSE

Создано 19.06.2020 пакетом REPEX (v0.3.0)

Результатом выражения a OR b будет ЛОЖЬ тогда и только тогда, когда оба a и b - ЛОЖЬ. Во всех остальных случаях это ИСТИНА. 2
TRUE || NA
#> [1] TRUE

Создано 19.06.2020 пакетом REPEX (v0.3.0)

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