2013-06-24 61 views
1

我使用以下方法從fiser精確測試中獲取p值。但是,我確實需要爲每一對打印值「n00,n01,n10,n11」。我如何將它打印爲表格而不是如下所示的矩陣以及p值?R:如何使用多個參數打印表格

fish <- function(y, x) { 
    n00 = sum((1-x)*(1-y)) 
         n01 = sum((1-x)*y) 
         n10 = sum(x*(1-y)) 
         n11 = sum(x*y) 
         a = matrix(c(n00, n01, n10, n11) 
            , nrow = 2) 
         pval = fisher.test(a)$p.value 
         return(pval) 
} 

chiArray <- function(x) apply(mat1, 1, fish, x) 
sapply(1:nrow(mat2), function(j) chiArray(mat2[j, ])) 
chisq.cna.mut.test <- sapply(1:nrow(mat2), function(j) chiArray(mat2[j, ])) 

我想輸出是:

# name1_mat1 name1_mat2 n00 n01 n10 n11 pvalue 
# name1_mat1 name2_mat2 n00 n01 n10 n11 pvalue 

的輸入是(MAT1)和本實施例的目的,考慮到MAT2是相同的MAT1。通過這個方式

# ID case1 case2 case3 
# name1 0 0 0 
# name2 1 0 1 
# name3 0 1 1 
+2

您能否提供可重現的示例並更好地格式化預期結果? –

+0

嗨羅馬,我按照你的建議編輯了我的帖子。輸入是一個二進制矩陣(0和1)。而我想成爲一個向量的輸出,而不是隻使用「sapply」函數的pvalues的矩陣 – user2308154

+0

您好@ user2308154,如果您認爲您的問題得到了令人滿意的回答,請您考慮接受下面的答案嗎? :-) –

回答

0

使用數據:

ID <- paste0("name", 1:5) 
mat1 <- 1*cbind(case1=runif(5)>0.5, case2=runif(5)>0.5, case3=runif(5)>0.5) 
mat2 <- 1*cbind(case1=runif(5)>0.5, case2=runif(5)>0.5, case3=runif(5)>0.5) 
rownames(mat1) <- ID 
rownames(mat2) <- ID 

並改變你的函數隨着p值返回所有n S:

fish <- function(y, x) 
{ 
    n00 = sum((1-x)*(1-y)) 
    n01 = sum((1-x)*y) 
    n10 = sum(x*(1-y)) 
    n11 = sum(x*y) 
    a = matrix(c(n00, n01, n10, n11), nrow = 2) 
    pval = fisher.test(a)$p.value 
    c(a, pval) 
} 

我想你想要什麼都可以以此達成:

result <- data.frame(mat1="", mat2="", n00=0, n01=0, n10=0, n11=0, pvalue=0, stringsAsFactors=FALSE) 

k <- 1 

for(j in 1:nrow(mat2)) for(i in 1:nrow(mat1)) 
{ 
    result[k,1] <- paste0(rownames(mat1)[i], "_mat1") 
    result[k,2] <- paste0(rownames(mat2)[j], "_mat2") 
    result[k,-(1:2)] <- fish(x=mat2[j, ], y=mat1[i,]) 
    k <- k + 1 
} 

例如:

> result 
     mat1  mat2 n00 n01 n10 n11 pvalue 
1 name1_mat1 name1_mat2 1 1 0 1 1.0000000 
2 name2_mat1 name1_mat2 0 2 0 1 1.0000000 
3 name3_mat1 name1_mat2 2 0 1 0 1.0000000 
4 name4_mat1 name1_mat2 1 1 1 0 1.0000000 
5 name5_mat1 name1_mat2 0 2 1 0 0.3333333 
6 name1_mat1 name2_mat2 0 1 1 1 1.0000000 
7 name2_mat1 name2_mat2 0 1 0 2 1.0000000 
8 name3_mat1 name2_mat2 1 0 2 0 1.0000000 
9 name4_mat1 name2_mat2 1 0 1 1 1.0000000 
10 name5_mat1 name2_mat2 1 0 0 2 0.3333333 
11 name1_mat1 name3_mat2 0 1 1 1 1.0000000 
12 name2_mat1 name3_mat2 0 1 0 2 1.0000000 
13 name3_mat1 name3_mat2 1 0 2 0 1.0000000 
14 name4_mat1 name3_mat2 1 0 1 1 1.0000000 
15 name5_mat1 name3_mat2 0 1 1 1 1.0000000 
16 name1_mat1 name4_mat2 0 1 1 1 1.0000000 
17 name2_mat1 name4_mat2 0 1 0 2 1.0000000 
18 name3_mat1 name4_mat2 1 0 2 0 1.0000000 
19 name4_mat1 name4_mat2 1 0 1 1 1.0000000 
20 name5_mat1 name4_mat2 1 0 0 2 0.3333333 
21 name1_mat1 name5_mat2 0 1 1 1 1.0000000 
22 name2_mat1 name5_mat2 0 1 0 2 1.0000000 
23 name3_mat1 name5_mat2 1 0 2 0 1.0000000 
24 name4_mat1 name5_mat2 1 0 1 1 1.0000000 
25 name5_mat1 name5_mat2 1 0 0 2 0.3333333 
+0

是的,它的工作原理!真棒!非常感謝! – user2308154