简体   繁体   中英

Creating a vector in R with if and for - Returning "NA"?

I'm a newbie to R so apologies in advance

I am working with R's mtcars dataset and am trying to fill an empty vector using the following code:

emptyvec = c()

for (io in mtcars$disp) {
  if(io > 200) {
    emptyvec[io] = io
  }
}

While I do get back all values over 200 from the mtcars$disp vector, I also get a lot of NA values too. Is there any reason for that? I have tried multiple ways to fix it but so far, but nothing seems to work. I feel like I am missing something obvious but cannot see it.

I have shown the output from the console below.

PS - I've been told there is a way to do this using the for/while loops rather than if. Is that possible? This is a question from an assignment at college. I know there are easier ways, but I'd love to know what I am doing wrong with this specifically so I can improve.

Thanks!

 NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA
 NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA

NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 225.0 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 258.0 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 275.8 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 301.0 NA NA 304.0 NA NA NA NA NA NA NA NA NA NA NA NA NA 318.0 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 350.0 351.0 NA NA NA NA NA NA NA NA 360.0 NA NA NA NA NA NA NA NA NA NA NA NA NA NA N A NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 400.0 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 440.0 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 460.0 NA NA NA NA NA NA NA NA NA NA NA 472.0

Let's have a look at mtcars$disp :

mtcars$disp
 [1] 160.0 160.0 108.0 258.0 360.0 225.0 360.0 146.7 140.8 167.6 167.6 275.8 275.8 275.8 472.0 460.0 440.0  78.7
[19]  75.7  71.1 120.1 318.0 304.0 350.0 400.0  79.0 120.3  95.1 351.0 145.0 301.0 121.0

When you use for (io in mtcars$disp) , these disp values are the values io is taking. You have if(io > 200) , so nothing happens in your loop until we get to the first value > 200, which is 258.0. And then you run emptyvec[io] = io , which is equivalent to emptyvec[258] = 258 . At this point, you've told emptyvec to fill it 258th element, so everything up to that point defaults to NA .

You probably mean to do this:

emptyvec = c()

## loop over the indices of the vector: 1, 2, 3, ...
## not over the values: 160, 160, 108, ...
for (io in 1:length(mtcars$disp)) { 
  if(mtcars$disp[io] > 200) { ## reference the ioth value
    emptyvec[io] = mtcars$disp[io]
  }
}

But a better way would use vectorization and subsets:

result = mtcars$disp
result[result <= 200] = NA

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM