Почему x [NA] дает вектор NA такой же длины, как x?

Код похож на этот

x <- 1:5
x[NA]

Почему он производит 5 НС?

Ответ 1

Ответ на этот вопрос имеет две стороны:

Как интерпретируется 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_], то вы найдете другой результат.