我有两个数据框,我想在其中运行此代码。 两个数据框的大小相同。psd.csv
有一些值是空白的。
目标是我希望NA
在数据框中也保持NA
nmsd
。
此代码显示以下错误:
中的错误
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