在运行if else循环时管理数据帧中的NA值

时间:2018-05-01 07:31:04

标签: r if-statement na

我有两个数据框,我想运行此代码。 两个数据帧都具有相同的大小。 psd.csv有一些空白的值。

目标是我希望NANA数据框中保持为nmsd

此代码显示以下错误:

  

中的错误      

if(psd [i,j] ==" NA")nmsd [i,j] = psd [i,j] else if if(psd [i,:缺少值需要TRUE / FALSE

   for(j in 1:500){
     for(i in 1:3418){
       if(psd[i,j]=="NA")
         nmsd[i,j] = psd[i,j]
       else if(psd[i,j]>=0 && psd[i,j]<=0.3)
         nmsd[i,j]=psd[i,j]+0.3*(1-psd[i,j])
       else if(psd[i,j]>0.3 && psd[i,j]<=0.4) 
         nmsd[i,j]=psd[i,j]+0.1*(1-psd[i,j])
       else if(psd[i,j]>0.4 && psd[i,j]<=0.6) 
         nmsd[i,j]=psd[i,j]+0.2*(1-psd[i,j])
       else if(psd[i,j]>0.6 && psd[i,j]<=0.9) 
         nmsd[i,j]=psd[i,j]+0.3*(1-psd[i,j])
       else(psd[i,j]>0.9 && psd[i,j]<=1) 
         nmsd[i,j]=psd[i,j]+0.1*(1-psd[i,j])
          }
         }

1 个答案:

答案 0 :(得分:0)

评论中所述的错误来自NA检查:您必须使用is.na()而不是=="NA"。此外,在上一个else中,if缺失了nmsd

但是,您应该对您的计算进行矢量化。请注意,您的psd + coeff*(1-psd)定义为coeff。唯一的问题是psd取决于findInterval的相对元素的间隔。我们可以使用coeff找到合适的if else,而无需处理大量set.seed(5678) psd<-matrix(runif(500*3418),nrow=3418,ncol=500) #we insert some NA value psd[sample(length(psd),1000)]<-NA 条件。

我们模拟了一些数据:

intervals<-c(0,0.3,0.4,0.6,0.9)
coeff<-c(0.3,0.1,0.2,0.3,0.1)

然后我们说明区间的极值和相对系数:

res<-psd+coeff[findInterval(psd,intervals)]*(1-psd)

然后,结果就是:

if else

我们可以使用nmsd<-matrix(0,nrow=3418,ncol=500) for(j in 1:500){ for(i in 1:3418){ if(is.na(psd[i,j])) nmsd[i,j] = psd[i,j] else if(psd[i,j]>=0 && psd[i,j]<=0.3) nmsd[i,j]=psd[i,j]+0.3*(1-psd[i,j]) else if(psd[i,j]>0.3 && psd[i,j]<=0.4) nmsd[i,j]=psd[i,j]+0.1*(1-psd[i,j]) else if(psd[i,j]>0.4 && psd[i,j]<=0.6) nmsd[i,j]=psd[i,j]+0.2*(1-psd[i,j]) else if(psd[i,j]>0.6 && psd[i,j]<=0.9) nmsd[i,j]=psd[i,j]+0.3*(1-psd[i,j]) else if(psd[i,j]>0.9 && psd[i,j]<=1) nmsd[i,j]=psd[i,j]+0.1*(1-psd[i,j]) } } 计算最终结果(我修改了您的代码以使其正常工作):

identical(res,nmsd)
#[1] TRUE

看到结果是一样的,但矢量化解决方案更快更清洁:

mapDispatchToProps