2016-09-28 184 views
1

我嘗試連接2個數據框:Eset2和Essential。它們共享1個包含基因名稱的共同列,並且這兩個框架都有唯一的行。R tryCatch跳過錯誤

因此,我決定在Eset2中查找我需要的值(RMA,ANNOT),並將它們綁定到Essential中與相應基因名稱對應的行。

但是有時我不能查找,因爲Essential中有獨特的基因。所以,會出現一個錯誤:我在Eset2中搜索相應的行會變成數字(0)。

所以我決定使用tryCatch。 但是,它沒有幫助。當搜索在Eset2中沒有找到這樣的基因時,不是將NA用於RMA和ANNOT,而是從之前成功發現的基因中提取值。

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代碼。但是,這個答案有希望揭示爲什麼錯誤塊不會被擊中,以及你可以做什麼作爲替代。