2016-04-29 41 views
1

我有一個數據幀,它有214列長和很多行長,我想用4列中的值對每行執行fisher精確測試。Fisher對大數據框值和繞過錯誤的精確測試

從我的數據幀相關的信息的例子子的樣子:

Variant DB.count.1 DB.count.2 pop.count.1 pop.count.2 
A   23   62   35    70 
B   81   4    39    22 
C   51   42   49    52 
D   NA   NA   65    8 
E   73   21   50    33 
F   72   13   81    10 
G   61   32   75    21 
H   NA   NA   42    22 
I   NA   NA   60    20 
J   80   12   72    24 

我試圖用一個for循環:

  1. 創建於各行的列聯表的Fisher精確測試以比較DB.counts和pop.counts
  2. 使用此列聯表執行費舍爾精確測試以確定DB.counts和pop.counts之間是否有差異
  3. 輸出p值產生新的一列在我的數據框

正如你可以看到有一些位置,因此在一些應急表「NA」的價值觀,顯然,這將導致一個錯誤,這是確定,但我希望代碼在遇到此錯誤(例如「。」)時將值輸出到列。或「錯誤」並跳到下一行/應急表。

即我想的輸出,看起來像這樣:

Variant DB.count.1 DB.count.2 pop.count.1 pop.count.2 fishers 
A   23   62   35    70    0.4286 
B   81   4    39    22    <0.0001 
C   51   42   49    52    0.3921 
D   NA   NA   65    8    error 
E   73   21   50    33    0.0143 
F   72   13   81    10    0.5032 
G   61   32   75    21    0.0744 
H   NA   NA   42    22    error 
I   NA   NA   60    20    error 
J   80   12   72    24    0.0425 

我現在有(基於R loop over Fisher test - Error message)的代碼是:

df$fishers" <- for (i in 1:nrow(df)) 
{ 
table <- matrix(c(df[i,4], df[i,5], df[i,2], df[i,3]), ncol = 2, byrow = TRUE) 
fisher.test(table, alternative="greater") 
} 

這似乎創造了應急表的方式我想,但是繞過錯誤並將p-vlaue打印到新列的問題依然存在。我嘗試過使用try和tryCatch,但一直沒有成功。

我是R初學者,所以真的很感激任何關於如何改善我的問題或對我的問題的建議的意見!謝謝!

編輯1:我現在已經嘗試使用下面的data.table包,並且從沒有「NA」值的數據集中得到了我所需要的,但是如何跳過錯誤並使代碼繼續?謝謝!!!

library(data.table) 
dt <- data.table(df) 

dt[, p.val := fisher.test(matrix(c(pop.count.1, pop.count.2, DB.count.1, DB.count.2), ncol=2), workspace=1e9)$p.value, by=Variant] 

df <- as.data.frame(dt) 
+0

'申請( dd [,-1],1,函數(x)tryCatch(format.pval(fisher.test(matrix(x,2))$ p.value,eps = .001),error = function(e)'error' ))工作? – rawr

+0

謝謝,但不幸的是,這給了df $ fishers中的每一行錯誤:( – emily

+0

從您的數據集中刪除NA記錄 - 'no.na.df < - df [complete.cases(df),]' –

回答

1

您可以在您的循環的if-else聲明是這樣的:

res <- NULL 
for (i in 1:nrow(df)){ 
    table <- matrix(c(df[i,4], df[i,5], df[i,2], df[i,3]), ncol = 2, byrow = TRUE) 
# if any NA occurs in your table save an error in p else run the fisher test 
    if(any(is.na(table))) p <- "error" else p <- fisher.test(table, alternative="greater")$p.value 
    # save all p values in a vector 
    res <- c(res,p) 
} 
df$fishers <- res 

或者把代碼中的功能和使用應用,而不是一個循環:

foo <- function(y){ 
    # include here as.numeric to be sure that your values are numeric: 
    table <- matrix(as.numeric(c(y[4], y[5], y[2], y[3])), ncol = 2, byrow = TRUE) 
    if(any(is.na(table))) p <- "error" else p <- fisher.test(table, alternative="greater")$p.value 
    p 
} 
df$fishers <- apply(df, 1, foo) 
+0

非常感謝你! – emily

+0

@emily如果工作適當,請考慮將答案標記爲已接受。 – Jimbou