2016-01-27 103 views
2

我有一個函數tryCatch輸出是這樣的:for循環rownames輸入到函數

> s1 <- tryCatch(survdiff(Surv(as.numeric(as.character(ClinicalDataHep$new_death))[ind_clin],ClinicalDataHep$death_event[ind_clin])~event_rna[ind_gene,ind_tum]), error = function(e) return(NA)) 
> s1 
Call: 
survdiff(formula = Surv(as.numeric(as.character(ClinicalDataHep$new_death))[ind_clin], 
    ClinicalDataHep$death_event[ind_clin]) ~ event_rna[ind_gene, 
    ind_tum]) 

           N Observed Expected (O-E)^2/E (O-E)^2/V 
event_rna[ind_gene, ind_tum]=0 72  41  41.1 0.000223 0.00278 
event_rna[ind_gene, ind_tum]=1 4  4  3.9 0.002345 0.00278 

Chisq= 0 on 1 degrees of freedom, p= 0.958 

從這個輸出,可以計算出的p值是這樣的:

> p.val <- 1 - pchisq(s1$chisq, length(s1$n) - 1) 
> p.val 
[1] 0.9579535 

我想在第一個函數中做一個for循環,它採用所有可能的ind_gene中的TryCatch,它是從rownames(matrix_cpm_spike_liver)定義的,獲得所有不同rownames的p值。的ind_gene 例子:

> head(rownames(matrix_cpm_spike_liver)) 
[1] "hsa-let-7a-2-3p" "hsa-let-7a-3p" "hsa-let-7a-5p" "hsa-let-7b-3p" "hsa-let-7b-5p" 
[6] "hsa-let-7c-3p" 

喜歡的東西:做披着一切功能,並使用sapply

for (i in rownames(matrix_cpm_spike_liver)) 
{TryCatch... 
} 
+0

我需要更多信息。你可以使用無意義的數據並提供一個更好的例子嗎? – polka

回答

2

的一種方式。這樣你就不必更改你的代碼了。爲了使循環成功,我們必須處理tryCatch發生錯誤的情況。這是通過p值上的ifelse完成的。

mycatch <- function(ind_gene){ 
    s1 <- tryCatch(survdiff(Surv(as.numeric(as.character(
     ClinicalDataHep$new_death) 
    )[ind_clin], ClinicalDataHep$death_event[ind_clin]) ~ 
     event_rna[ind_gene,ind_tum]), 
    error = function(e) return(NA)) 

    p.val <- ifelse(is.na(s1), # Condition 
        NA,  # Return if s1 = NA 
        1 - pchisq(s1$chisq, length(s1$n) - 1)) 
    p.val 
} 

sapply(rownames(matrix_cpm_spike_liver), mycatch) 

請注意我是如何分割你的代碼行的 - 通常認爲不需要太長的代碼行是一種好的做法。因爲我偶爾會將它粘貼到TeX文檔中,所以我使用了最大值65,但正如您在上面的灰色框中看到的那樣,它們可以更寬。

+0

謝謝,這很有幫助:然而,sapply給了我這個:sapply(rownames(matrix_cpm_spike_liver),mycatch)s1中的錯誤$ chisq:$運算符對原子向量無效 – user2300940

+0

但是函數工作:> p.val < - 1 - pchisq(s1 $ chisq,length(s1 $ n) - 1) > p.val [1] 0.9579535 – user2300940

+0

@ user2300940我無法重現您的錯誤,因爲我沒有您的數據。也許是一個可重複的樣本?否則,由於's1'似乎不是一個遞歸對象,因此可以使用's1 [[「chisq」]]'而不是's1 $ chisq'來解決錯誤,參見'?「$」'。 – Therkel