我有两个数据框,我想运行此代码。
两个数据帧都具有相同的大小。
psd.csv
有一些空白的值。
目标是我希望NA
在NA
数据框中保持为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])
}
}
答案 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