Why does x[NA] yield an NA vector the same length as x?
Asked Answered
r
T

1

12

The code is like this

x <- 1:5
x[NA]

Why does it produce 5 NAs?

Tribadism answered 7/7, 2016 at 7:53 Comment(4)
Good question. Try to answer yourself by seeing what x[TRUE], x[FALSE], class(NA) and x[NA_integer_] return.Cram
x[c(NA,TRUE)] might also be enlightening, in that it shows explicitly the vector recycling both an NA and non-NA value.Reciprocate
See similar posts here and hereExtender
Why was this given a bounty?Shapely
H
13

The answer to this question has two sides:

How is NA interpreted when indexing matrices?

In one of the links provided by @alexis_laz, I found a very well structured explanation of how TRUE, FALSE and NA are interpreted when indexing matrices:

Logical indices tell R which elements to include or exclude.

You have three options: TRUE, FALSE and NA

They serve to indicate whether or not the index represented in that position should be included. In other words:

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

For example:

x <- 1:6
x[ c(TRUE, FALSE, TRUE, NA, TRUE, FALSE)]
# [1]  1  3 NA  5

An important detail is that the default storage mode for an isolated NA value is logical (try typeof(NA)). You can choose the storage mode of the NA by using NA_integer_, NA_real_ (for double), NA_complex_ or NA_character_.

Why 5 NA and not just 1?

When the length of the indices is smaller than the length of vector x, the indexing will start over to also index the values in x that have not been indexed yet. In other words, R will automatically "recycle" the indices:

(...) However, standard recycling rules apply. So in the previous example, if we drop the last FALSE, the index vector is recycled, the first element of the index is TRUE, and hence the 6th element of x is now included

x <- 1:6
x[c(TRUE, FALSE, TRUE, NA, TRUE)]
#  [1]  1  3 NA  5  6

Recall the detail about the storage mode from the previous section. If you type x[NA_integer_], then you will find a different result.

Hotblooded answered 19/7, 2016 at 11:54 Comment(2)
What new info does this add to the answer in the 2nd link provide by alexis_laz?Andre
It doesn't add any info. The question was awaiting an answer and I put together the info provided in the commentsHotblooded

© 2022 - 2024 — McMap. All rights reserved.