Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
855 views
in Technique[技术] by (71.8m points)

r - Why does x[NA] yield an NA vector the same length as x?

The code is like this

x <- 1:5
x[NA]

Why does it produce 5 NAs?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...