如何在两个数据框架之间应用渔民测试?

时间:2017-09-20 09:47:51

标签: r dataframe statistics bioconductor

我有以下数据框:

DF1:

Type    S1  S2  
  CC    198 38
  Ch    163 43
   H    83  22
   J    24  14
  OS    33  7
   O    61  25
   R    100 24
   W    126 47

DF2:

Type  S1    S2      
 CC  82     40
 Ch  117    35
 H   197    56
 J   256    64
 OS  247    71
 O   219    53
 R   180    54
 W   154    31

我为“CC”应用了渔民测试

fisher.test(matrix(c(198,82,38,40), nrow=2, ncol=2))

p-value = 0.0004191

但要为所有其他人做这件事,这是时间的过程。我想一次对所有其他类型应用fishers测试,结果应如下所示:

Type    Pvalue
CC  0.0004191
Ch  0.6978
H   0.8885
J   0.0226
OS  0.5491
O   0.07202
R   0.5013
W   0.02091

我从以下答案中得到了上述内容的答案。但我现在用更多的数据来编辑它。如果数据如下所示:

DF1:

Type    S1  S2  S3  S4  S5  S6
  CC    198 38  64  172 123 114
  Ch    163 43  67  140 108 98
   H    83  22  32  74  55  51
   J    24  14  17  21  23  15
  OS    33  7   11  30  23  17
   O    61  25  35  51  39  47
   R    100 24  41  84  57  67
   W    126 47  57  118 106 68

DF2:

  Type  S1  S2  S3  S4  S5  S6
   CC   82  40  56  66  70  51
   Ch   117 35  53  98  85  67
    H   197 56  88  164 138 114
    J   256 64  103 217 170 150
   OS   247 71  109 208 170 148
    O   219 53  85  187 154 118
    R   180 54  79  154 136 98
    W   154 31  63  120 87  97

我想对(S3,S4)和(S5,S6)应用渔民测试并获得结果中的p值。我可以通过只采取那些列和应用渔民测试,如下面的答案(S1,S2)。但我想一次做到这一切。在我的原始数据中,我有很多这样的列。谢谢!!

2 个答案:

答案 0 :(得分:2)

最简单的路线是rbind两个数据框,在Type上拆分并对列表的每个元素进行测试,即

full_df <- rbind(df1, df2)
lapply(split(full_df, full_df$Type), function(i) fisher.test(as.matrix(i[-1])))

或者只是获取p.value

sapply(split(full_df, full_df$Type), function(i) fisher.test(as.matrix(i[-1]))$p.valu)
#              CC           Ch            H            J            O           OS            R            W 
#    0.0004191119 0.6978356887 0.8884858252 0.0225999709 0.0720173867 0.5491422972 0.5012970020 0.0209138164 

答案 1 :(得分:1)

您可以使用sapply()的{​​{1}}功能。我假设“Type”是一个列名。

R

你好@raju,

关于您的第二个问题(多组案例),可以使用以下代码。

我定义了一个名为group的列表,让您有机会安排测试列。我的意思是,如果你想测试说S1和S6,那么这个设置也是可能的。您需要做的就是添加另一个名为 group4 的组,并为其指定一个新的向量 c(“S1”,“S6”)

p_values <- sapply(1:nrow(df1), function(x) 
                   fisher.test(rbind(df1[x,-1],df2[x,-1]))$p.value)

# -1 inside the data frame (df1[x,-1] and df2[x,-1])   is for canceling out the Type column. If it is a rowname, then you don't need to add that...     


final <- cbind(df1$Type,as.data.frame(p_values)) 

colnames(final) <- c("Type","Pvalue")           

           Type       Pvalue
        1   CC 0.0004191119
        2   Ch 0.6978356887
        3    H 0.8884858252
        4    J 0.0225999709
        5   OS 0.5491422972
        6    O 0.0720173867
        7    R 0.5012970020
        8    W 0.0209138164