Управление значениями NA во фреймах данных во время работы цикла else - PullRequest
0 голосов
/ 01 мая 2018

У меня есть два фрейма данных, где я хочу запустить этот код. Оба кадра данных имеют одинаковый размер. psd.csv имеет некоторые значения, которые являются пробелами.

Цель состоит в том, чтобы я хотел, чтобы NA оставался как NA во фрейме данных nmsd.

Этот код показывает следующую ошибку:

Ошибка в

if (psd [i, j] == "NA") nmsd [i, j] = psd [i, j], в противном случае 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 голосов
/ 01 мая 2018

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