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

How to apply fishers test between two data frame?

我有如下数据框:

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

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

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)一样应用渔民测试来做到这一点。但我想一次完成。在我的原始数据中,我有很多这样的列。谢谢!!

最简单的方法是 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 

您可以使用 Rsapply() 功能。我假设 "Type" 是一个列名。

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

嗨@raju,

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

我定义了一个名为组的列表,让您有机会安排测试列。我的意思是,如果您想测试 S1 和 S6,也可以使用此设置。您需要做的就是添加另一个名为 group4 的组,并为其分配一个新向量 c("S1","S6").

group <- list(group1= c("S1","S2"),group2=c("S3","S4"),group3=c("S5","S6"))

for(i in 1:length(group)) {

    p_values <- sapply(1:nrow(df1), function(x) {

    a=cbind(df1[x,group[[i]][1]],df1[x,group[[i]][2]])

    b=cbind(df2[x,group[[i]][1]],df2[x,group[[i]][2]]) 

    fisher.test(rbind(a,b))$p.value }) 

    p <- as.data.frame(p_values)
    colnames(p) <- paste("PValue-Group-",i,sep="")

    if (i==1) {

        Type<-as.data.frame(df1$Type)
        colnames(Type) <- "Type"
        final <- cbind(Type,p) 

    }else{

        final <- cbind(final,p) 

    }

}

   Type PValue-Group-1 PValue-Group-2 PValue-Group-3
1   CC   0.0004191119   0.0005763285     0.31383253
2   Ch   0.6978356887   0.6504086114     0.52187626
3    H   0.8884858252   0.4619796458     0.64343778
4    J   0.0225999709   0.1457729970     0.49159715
5   OS   0.5491422972   0.3829413140     0.73695562
6    O   0.0720173867   0.1166177467     0.08215306
7    R   0.5012970020   0.9066133264     0.03416412
8    W   0.0209138164   0.7377283808     0.01096746