简体   繁体   English

使用 if 和 for 在 R 中创建一个向量 - 返回“NA”?

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

I'm a newbie to R so apologies in advance我是 R 的新手,所以提前道歉

I am working with R's mtcars dataset and am trying to fill an empty vector using the following code:我正在使用 R 的 mtcars 数据集,并尝试使用以下代码填充空向量:

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.虽然我确实从 mtcars$disp 向量中取回了所有超过 200 的值,但我也得到了很多 NA 值。 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. PS - 有人告诉我有一种方法可以使用 for/while 循环而不是 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娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜。娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜。娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜。娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜。娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜。 301.0 不适用 不适用 304.0 不适用351.0 NA NA NA NA NA NA NA 360.0 NA NA NA NA NA NA NA NA NA NA NA NA NA 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阿娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜。娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜娜和后裔娜娜娜娜娜娜娜娜娜 460.0

Let's have a look at mtcars$disp :让我们看看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.当您使用for (io in mtcars$disp) ,这些disp值是io正在采用的值。 You have if(io > 200) , so nothing happens in your loop until we get to the first value > 200, which is 258.0.你有if(io > 200) ,所以在你的循环中没有任何反应,直到我们得到第一个值 > 200,即 258.0。 And then you run emptyvec[io] = io , which is equivalent to emptyvec[258] = 258 .然后你运行emptyvec[io] = io ,它等价于emptyvec[258] = 258 At this point, you've told emptyvec to fill it 258th element, so everything up to that point defaults to NA .此时,您已经告诉emptyvec填充它的第 258 个元素,因此到那时为止的所有内容都默认为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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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