r语言 - 在运行 else 循环时管理数据帧中的 NA 值



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

目标是我希望NA在数据框中也保持NAnmsd

此代码显示以下错误:

中的错误

if (psd[i, j] == "NA"( nmsd[i, j] = psd[i,j] else 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])
}
}

如注释中所述,错误来自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

最新更新