Код похож на этот
x <- 1:5
x[NA]
Почему он производит 5 НС?
Код похож на этот
x <- 1:5
x[NA]
Почему он производит 5 НС?
Ответ на этот вопрос имеет две стороны:
Как интерпретируется NA при индексировании матриц?
В одной из ссылок, предоставленной @alexis_laz, я нашел очень хорошо структурированное объяснение того, как TRUE
, FALSE
и NA
интерпретируются, когда матрицы индексирования:
Logical
указываютR
, какие элементы включать или исключать.У вас есть три варианта:
TRUE
,FALSE
иNA
Они служат для указания того, должен ли включаться индекс, представленный в этой позиции. Другими словами:
TRUE == "Include the elment at this index" FALSE == "Do not include the element at this index" NA == "Return NA instead of this index" # loosely speaking
Например:
x <- 1:6 x[ c(TRUE, FALSE, TRUE, NA, TRUE, FALSE)] # [1] 1 3 NA 5
Важной деталью является то, что режим хранения по умолчанию для изолированного значения NA
логичен (попробуйте typeof(NA)
). Вы можете выбрать режим хранения NA
, используя NA_integer_
, NA_real_
(для двойного), NA_complex_
или NA_character_
.
Почему 5 NA
, а не только 1?
Когда длина индексов меньше длины вектора x
, индексирование начнет также индексировать значения в x
, которые еще не были проиндексированы. Другими словами, R
автоматически "перерабатывает" индексы:
(...) Однако применяются стандартные правила утилизации. Таким образом, в предыдущем примере, если мы опустим последний
FALSE
, индексный вектор будет возвращен, первый элемент индекса будетTRUE
, и, следовательно, теперь будет включен 6-й элементx
x <- 1:6 x[c(TRUE, FALSE, TRUE, NA, TRUE)] # [1] 1 3 NA 5 6
Вспомните подробную информацию о режиме хранения из предыдущего раздела. Если вы наберете x[NA_integer_]
, то вы найдете другой результат.