【问题标题】:For loop identifying inexistent NAs in RFor循环识别R中不存在的NA
【发布时间】:2019-03-30 09:21:09
【问题描述】:

我有一个名为 z 的大数据框,它有 107310 行和 8 列。它通过此函数时没有 NA:z<-z[complete.cases(z),] 以消除所有包含 NA 的行。

如果特定列的值高于另一个特定列的值,我创建了以下 for 循环以删除所有行。

首先,我尝试了以下代码:

  for(row in 1:nrow(z)){
   i <- z[row, 1]
  j <- z[row, 2]
  ci<- z[row, 6]
  cj<- z[row, 7]
  year <- z[row, 8]
      if(cj>ci){
    z<-z[-row,]}
}

循环会运行,但会停在指示以下错误的某行:

“错误:需要 TRUE/FALSE 的地方缺少值”

即使没有 NA,我也调整了循环以避免错误,使 if 语句中的值始终为数字:

for(row in 1:nrow(z)){
  i <- z[row, 1]
  j <- z[row, 2]
  ci<- z[row, 6]
  cj<- z[row, 7]
  year <- z[row, 8]
  temp<-ci-cj
  temp<-ifelse(!is.na(temp),temp,0)
  if(temp<=0){
    z<-z[-row,]}
}

但是,循环在消除所有包含 cj>ci 的行之前仍会停止。它为 i 和 j 生成的最后一个值为 NA,而为 ci 和 cj 生成的最后一个值为 NA_real,即使这些值在数据集中不是 NA。

有人知道发生了什么吗? 谢谢

【问题讨论】:

  • 你不只是在做z[z[,6]&gt;=z[,7],]有什么特别的原因吗?
  • 您定义在帧最大时要循环的行数。如果删除了任何行,最终循环将转到比z 当前包含的行号更高的行号。 (1:nrow(z) 只评估一次。)也许你可以使用row &lt;- 1; while (row &lt; nrow(z)) { ...; if (temp&lt;=0) z &lt;- z[-row,] else row &lt;- row + 1; }
  • 非常感谢!!是的,我绝对可以按照 iod 所说的去做,效果很好。另外,感谢 yoy r2evans,它的解释很有意义。对不起初学者的错误。

标签: r for-loop if-statement na


【解决方案1】:

您可以使用两步流程来避免 for 循环。首先使用ifelse 标记出不受欢迎的情况,然后使用subset 删除它们,如下所示:

z$flag <- ifelse(z$col6 < z$col7, 1, 0)
new_z <- subset(z, flag == 0)

这是假设第 6 列和第 7 列分别命名为“col6”和“col7”。

【讨论】:

  • 确实如此。我的问题并不聪明,我确实可以按照建议的方式避免 for 循环,或者像这样:zz[,7]),]。这一切都奏效了。尽管如此,我仍然不知道为什么在循环中建立了 NA。非常感谢! .
猜你喜欢
  • 2020-12-16
  • 1970-01-01
  • 2017-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多