Ошибка, как указано в комментариях, связана с проверкой 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