You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言for循环中if语句执行异常并报缺失值错误求助

R循环报错:missing value where TRUE/FALSE needed 解决方法

问题描述

此前正常运行的R代码,今日执行时触发如下错误:

Error in if (month(Z[i * 7 - 6, 0]) * 100 + day(Z[i * 7 - 6, 0]) < 801 || : missing value where TRUE/FALSE needed

循环内的print(i)能完整输出1到2350的所有i值,但最终触发上述报错。其中Z[i,0]为日期类型,出错代码如下:

for(i in 1:2350){
  if(month(Z[i*7-6,0])*100+day(Z[i*7-6,0])<801||(month(Z[i*7-6,0])*100+day(Z[i*7-6,0]))>=801+7){
    if(month(Z[i*7-6+1,0])*100+day(Z[i*7-6+1,0])>=1226){
      operation1<-paste0(" ",format(month(Z[i*7-6,0]),width=2)," ",format(day(Z[i*7-6,0]),width=2),"          10    1   5         2.00000   1.00     ",format(WellInput[k,2]*7,width=7)," 0.00 ",format(WellInput[k,3],width=8))
      operation2<-paste0(" ",format(month(Z[i*7-6+1,0]),width=2)," ",format(day(Z[i*7-6+1,0]),width=2),"          10    2   5         0.00000   0.00      0.0000 0.00                        0")        
      operation3<-"                17"
      mgt<-c(mgt,operation1,operation2,operation3)      
    }else if(month(Z[i*7-6+1,0])*100+day(Z[i*7-6+1,0])==0101){
      operation1<-paste0(" ",format(month(Z[i*7-6,0]),width=2)," ",format(day(Z[i*7-6,0]),width=2),"          10    1   5         2.00000   1.00     ",format(WellInput[k,2]*7,width=7)," 0.00 ",format(WellInput[k,3],width=8))
      operation3<-"                17"
      operation2<-paste0(" ",format(month(Z[i*7-6+1,0]),width=2)," ",format(day(Z[i*7-6+1,0]),width=2),"          10    2   5         0.00000   0.00      0.0000 0.00                        0")        
      mgt<-c(mgt,operation1,operation3,operation2)      
    }else{
      operation1<-paste0(" ",format(month(Z[i*7-6,0]),width=2)," ",format(day(Z[i*7-6,0]),width=2),"          10    1   5         2.00000   1.00     ",format(WellInput[k,2]*7,width=7)," 0.00 ",format(WellInput[k,3],width=8))
      operation2<-paste0(" ",format(month(Z[i*7-6+1,0]),width=2)," ",format(day(Z[i*7-6+1,0]),width=2),"          10    2   5         0.00000   0.00      0.0000 0.00                        0")
      mgt<-c(mgt,operation1,operation2)      
    }
  } else{
    if(month(Z[i*7-6+1,0])*100+day(Z[i*7-6+1,0])==801){
      operation4<-"  8  1           7        0         0.00001   0.99   "
      operation1<-paste0(" ",format(month(Z[i*7-6,0]),width=2)," ",format(day(Z[i*7-6,0]),width=2),"          10    1   5         2.00000   1.00     ",format(WellInput[k,2]*7,width=7)," 0.00 ",format(WellInput[k,3],width=8))
      operation2<-paste0(" ",format(month(Z[i*7-6+1,0]),width=2)," ",format(day(Z[i*7-6+1,0]),width=2),"          10    2   5         0.00000   0.00      0.0000 0.00                        0")        
      mgt<-c(mgt,operation4,operation1,operation2)      
    } else{
      operation3<-"  8  1           7        0         0.00001   0.99   "
      operation1<-paste0(" ",format(month(Z[i*7-6,0]),width=2)," ",format(day(Z[i*7-6,0]),width=2),"          10    1   5         2.00000   1.00     ",format(WellInput[k,2]*7,width=7)," 0.00 ",format(WellInput[k,3],width=8))
      operation2<-paste0(" ",format(month(Z[i*7-6+1,0]),width=2)," ",format(day(Z[i*7-6+1,0]),width=2),"          10    2   5         0.00000   0.00      0.0000 0.00                        0")
      mgt<-c(mgt,operation3,operation1,operation2) 
    }
  }
  print(i)
}

原因分析

  • 报错核心是if条件表达式返回了NA,R的if语句仅支持TRUE/FALSE值,无法处理NA。
  • 出现NA的大概率场景:当i=2350时,计算的索引i*7-6=16444、i*7-6+1=16445,如果数据集Z的行数不足16445,会取到超出范围的行返回NA日期;或者Z对应行的日期本身为缺失值(NA),导致month()和day()函数返回NA,最终计算出的日期编码(如801)为NA,代入if条件后触发报错。
  • 额外问题:原代码中==0101会被R解析为八进制数(十进制65),并非预期的1月1日(十进制101)。

解决方法与修改代码

步骤1:检查数据范围

先确认Z的行数是否满足需求:

max_idx <- 2350*7 -6 +1
if(nrow(Z) < max_idx){
  stop("Z的行数不足,请补充数据")
}

步骤2:修改循环代码(添加NA处理+优化重复计算)

max_idx <- 2350*7 -6 +1
if(nrow(Z) < max_idx){
  stop("Z的行数不足,请补充数据")
}

for(i in 1:2350){
  # 提取当前和下一个日期,先判断是否缺失
  current_date <- Z[i*7-6, 0]
  next_date <- Z[i*7-6+1, 0]
  
  if(is.na(current_date) || is.na(next_date)){
    print(paste("跳过i=",i,",日期缺失"))
    next
  }
  
  # 计算日期编码,避免重复调用month/day函数
  current_code <- month(current_date)*100 + day(current_date)
  next_code <- month(next_date)*100 + day(next_date)
  
  if(current_code <801 || current_code >=808){
    if(next_code >=1226){
      operation1<-paste0(" ",format(month(current_date),width=2)," ",format(day(current_date),width=2),"          10    1   5         2.00000   1.00     ",format(WellInput[k,2]*7,width=7)," 0.00 ",format(WellInput[k,3],width=8))
      operation2<-paste0(" ",format(month(next_date),width=2)," ",format(day(next_date),width=2),"          10    2   5         0.00000   0.00      0.0000 0.00                        0")        
      operation3<-"                17"
      mgt<-c(mgt,operation1,operation2,operation3)      
    }else if(next_code == 101){ # 修正八进制数问题,改为十进制101代表1月1日
      operation1<-paste0(" ",format(month(current_date),width=2)," ",format(day(current_date),width=2),"          10    1   5         2.00000   1.00     ",format(WellInput[k,2]*7,width=7)," 0.00 ",format(WellInput[k,3],width=8))
      operation3<-"                17"
      operation2<-paste0(" ",format(month(next_date),width=2)," ",format(day(next_date),width=2),"          10    2   5         0.00000   0.00      0.0000 0.00                        0")        
      mgt<-c(mgt,operation1,operation3,operation2)      
    }else{
      operation1<-paste0(" ",format(month(current_date),width=2)," ",format(day(current_date),width=2),"          10    1   5         2.00000   1.00     ",format(WellInput[k,2]*7,width=7)," 0.00 ",format(WellInput[k,3],width=8))
      operation2<-paste0(" ",format(month(next_date),width=2)," ",format(day(next_date),width=2),"          10    2   5         0.00000   0.00      0.0000 0.00                        0")
      mgt<-c(mgt,operation1,operation2)      
    }
  } else{
    if(next_code ==801){
      operation4<-"  8  1           7        0         0.00001   0.99   "
      operation1<-paste0(" ",format(month(current_date),width=2)," ",format(day(current_date),width=2),"          10    1   5         2.00000   1.00     ",format(WellInput[k,2]*7,width=7)," 0.00 ",format(WellInput[k,3],width=8))
      operation2<-paste0(" ",format(month(next_date),width=2)," ",format(day(next_date),width=2),"          10    2   5         0.00000   0.00      0.0000 0.00                        0")        
      mgt<-c(mgt,operation4,operation1,operation2)      
    } else{
      operation3<-"  8  1           7        0         0.00001   0.99   "
      operation1<-paste0(" ",format(month(current_date),width=2)," ",format(day(current_date),width=2),"          10    1   5         2.00000   1.00     ",format(WellInput[k,2]*7,width=7)," 0.00 ",format(WellInput[k,3],width=8))
      operation2<-paste0(" ",format(month(next_date),width=2)," ",format(day(next_date),width=2),"          10    2   5         0.00000   0.00      0.0000 0.00                        0")
      mgt<-c(mgt,operation3,operation1,operation2) 
    }
  }
  print(i)
}

内容的提问来源于stack exchange,提问作者Dogil Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 12:20:37