我有一個數據幀,它有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循環:
- 創建於各行的列聯表的Fisher精確測試以比較DB.counts和pop.counts
- 使用此列聯表執行費舍爾精確測試以確定DB.counts和pop.counts之間是否有差異
- 輸出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)
'申請( dd [,-1],1,函數(x)tryCatch(format.pval(fisher.test(matrix(x,2))$ p.value,eps = .001),error = function(e)'error' ))工作? – rawr
謝謝,但不幸的是,這給了df $ fishers中的每一行錯誤:( – emily
從您的數據集中刪除NA記錄 - 'no.na.df < - df [complete.cases(df),]' –