2013-06-24 5 views
1

Я использую следующий способ получения значений p из точного теста fiser. Однако мне нужно распечатать для каждой пары значения «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

Привет, Роман, я отредактировал свой пост выше, как вы предложили. Ввод представляет собой двоичную матрицу (0s и 1s). И выход я хочу быть вектором, а не матрицей только значений, которые я получаю с помощью функции «sapply» – 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 

и изменение функции возвращать все 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