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
相关产品推荐
相关产品推荐

