对于循环识别 R 中不存在的 NA

For loop identifying inexistent NAs in R

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

如果 specific 列的值高于另一个 specific 列的值,我创建了以下 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。

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

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

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

这是假设第 6 和第 7 列被命名为 'col6' 和 'col7'。