根据数据帧列条件在For循环外更新向量

时间:2018-07-10 16:23:01

标签: r for-loop

我正在尝试使用R中的for循环和ifelse语句更新向量,但是由于我不清楚的原因,只有向量的第一个元素正在更新。

为简化问题,我创建了一个简单的数据框:

State Year Prop  Norm
OR 2010 0.77 0.9404467
OR 2011 0.75 0.9217675
OR 2012 0.82 1.0000000
OR 2013 0.79 0.9631936
OR 2014 0.79 0.9685990
OR 2015 0.78 0.9494104
OR 2016 0.91 1.1120710
OR 2017 0.93 1.1323377
VA 2010 0.90 0.9269292
VA 2011 0.92 0.9425468
VA 2012 0.97 1.0000000
VA 2013 0.93 0.9523327
VA 2014 0.92 0.9466566
VA 2015 0.89 0.9191078
VA 2016 0.94 0.9668455
VA 2017 0.92 0.9483394

我要做的事情很简单:对于“标准”列中的每个条目,如果值大于1,请在我在循环外部创建的向量上将其标记为“是”,否则,将其标记为“否”。这是我尝试输入的代码:

over_1 = c(rep(NA, length(props$Norm)))
for (i in props$Norm) {
    if(i > 1){
        over_1[i] = "YES"}
    else{
       over_1[i] = "NO"
        }
 }

这就是返回的内容:

[1] "YES" NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    
NA    NA    NA    NA    NA   
[18] NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    
NA    NA    NA    NA    NA    NA   
[35] NA    NA    NA    NA    NA    NA 

我能够通过使用更复杂的sapply函数来解决它:

sapply(props$Norm, function(x) ifelse(x > 1, "YES", "NO")) 

但是希望我的for循环有所帮助,因为它使我发疯。

谢谢!

2 个答案:

答案 0 :(得分:1)

只需ifelse(props$Norm, "YES", "NO")就可以实现您的目标。顺便说一句,我认为for循环在R中并不常见,因为该语言具有矢量化的特征。

也就是说,如果您确实想在for循环中解决此问题,则必须弄清楚i在迭代中代表什么。 for (i in props$Norm)iprops$Norm中的数字,例如0.9404467、0.9483394,...因此,为over_1[i]分配“是”或“否”是不正确的。

一种正确的方法是:

for (i in seq_len(length(props$Norm))) {
    if (props$Norm[i] > 1) {
        over_1[i] = "YES"}
    else {
        over_1[i] = "NO"
    }
}

答案 1 :(得分:0)

为帮助您停止发疯,问题在于我是Norm的值,然后您将该值用作索引。您需要将for循环更改为从1到向量的长度。

over_1 = c(rep(NA, length(props$Norm)))
for (i in 1:length(props$Norm)) {
  if(props$Norm[i] > 1){
    over_1[i] = "YES"}
  else{
    over_1[i] = "NO"
  }
}