в R делает NA == NA? - PullRequest
       5

в R делает NA == NA?

0 голосов
/ 19 ноября 2018

identical(NA, NA) возвращает TRUE, но следующие фильтры кода NA выходят за рамки даты:

library(tidyverse)
filter(starwars, birth_year == birth_year)

Если NA равно NA, звездные войны отфильтрованный фрейм данных выше должен включать годы рождения NA. Почему не так?

1 Ответ

0 голосов
/ 19 ноября 2018

NA равно identical для NA, но не равно ему.Если вы запустите NA==NA, ответ будет NA, потому что оператор равенства не применяется к NA.Из документации identical:

Вызов идентификатора - это способ проверить точное равенство в операторах if и while, а также в логических выражениях, использующих && или ||.Во всех этих приложениях вы должны быть уверены, что получите одно логическое значение.

В этих ситуациях пользователи часто используют операторы сравнения, такие как == или! =.Это выглядит естественно, но это не то, для чего эти операторы предназначены для R. Они возвращают объект, подобный аргументам.Если вы ожидали, что x и y будут иметь длину 1, но случилось так, что одного из них не было, вы не получите ни одного FALSE.Точно так же, если один из аргументов равен NA, результат также равен NA.В любом случае выражение if (x == y) .... не будет работать должным образом.

И из документации для ==:

Пропущенные значения (NA) и значения NaN считаются несопоставимыми даже с самими собой, поэтому сравнения с ними всегда приводят к NA.Пропущенные значения могут также возникать при сравнении символьных строк, и одна из них недопустима в текущей локали.

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

Альтернативой в этой ситуации является добавление | is.na(birth_year).

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