The code is like this
x <- 1:5
x[NA]
Why does it produce 5 NAs?
The code is like this
x <- 1:5
x[NA]
Why does it produce 5 NAs?
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 tellR
which elements to include or exclude.You have three options:
TRUE
,FALSE
andNA
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 isTRUE
, and hence the 6th element ofx
is now includedx <- 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.
© 2022 - 2024 — McMap. All rights reserved.
x[TRUE]
,x[FALSE]
,class(NA)
andx[NA_integer_]
return. – Cramx[c(NA,TRUE)]
might also be enlightening, in that it shows explicitly the vector recycling both anNA
and non-NA
value. – Reciprocate