2016-09-28 4 views
1

Я попытался объединить 2 dataframes: Eset2 и Essential. Они разделяют 1 общий столбец, который содержит имена генов, и оба кадра имеют уникальные строки.Ошибка проскальзывания R tryCatch

Итак, я решил найти нужные значения (RMA, ANNOT) в Eset2 и привязать их к строке в Essential с соответствующим именем гена.

Но иногда я не смог бы найти, поскольку в Essential есть уникальные гены. Таким образом, будет ошибка: мой поиск соответствующей строки в Eset2 будет отображаться числовым (0).

Поэтому я решил использовать tryCatch. Однако это не помогает. Вместо того, чтобы вводить NA для RMA и ANNOT, когда поиск не нашел такого гена в Eset2, сценарий помещает значения из предыдущего успешно найденного гена.

for (i in 1:nrow(essential)) { 
     temp <- tryCatch(
     # eset2$GENENAMEand essential[,4] contain gene names 
     eset2[eset2$GENENAME == essential[i,4],]$RMA, 
     error = function(e) { 
     print("This is the 'error' part1") 
     return(NA)} 
    ) 
     essential$rma[i] <- temp 

     temp <- tryCatch(
     eset2[eset2$GENENAME == essential[i,4],]$ANNOT, 
     error = function(e) { 
     print("This is the 'error' part2") 
     return(NA)} 
    ) 
     essential$long_name[i] <- temp 
    } 

Я решил проблему с помощью вместо этого:

 for (i in 1:nrow(essential)) { 
      temp <- try(eset2[eset2$SYMBOL == essential[i,4],]$rma) 
      if (length(temp) != 0) { 
       essential$rma[i] <- temp 
      } 
      else { 
       essential$rma[i] <- NA 
      } 
      temp <- try(eset2[eset2$SYMBOL == essential[i,4],]$GENENAME) 
      if (length(temp) != 0) { 
       essential$long_name[i] <- temp 
      } 
      else { 
       essential$long_name[i] <- NA 
      } 
      } 

Интересно, если я использую tryCatch неправильно. я пытался делать так:

  temp <- eset2[eset2$GENENAME == essential[i,4],]$ANNOT 

Но это не помогло. Вы видите, почему мой tryCatch не прошел?

ответ

0

Я считаю, что причина, по которой блок ошибки никогда не оценивается, заключается в том, что подмножество фрейма данных, оценивающее значение numeric(0), не является ошибкой. Вместо этого, вы просто должны явно проверить numeric(0) и заменить NA, когда вы столкнулись с его:

for (i in 1:nrow(essential)) { 
    temp <- eset2[eset2$GENENAME == essential[i,4],]$RMA 
    essential$rma[i] <- ifelse(length(temp) == 0, NA, temp) 

    temp <- eset2[eset2$GENENAME == essential[i,4],]$ANNOT 
    essential$long_name[i] <- ifelse(length(temp) == 0, NA, temp) 
} 

Кстати, есть, вероятно, способ векторизации цикла for вы использовали, возможно, уменьшая весь цикл вниз к несколько строк кода R. Но этот ответ, надеюсь, проливает свет на то, почему блок ошибок никогда не попадал, и что вы можете сделать в качестве альтернативы.

Смежные вопросы