【问题标题】:How to apply fishers test between two data frame?如何在两个数据框之间应用渔民测试?
【发布时间】:2018-03-01 07:36:38
【问题描述】:

我有如下数据框:

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 测试

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) 应用 Fisher 测试,并在结果中获得 p 值。我可以通过只取那些列并应用下面的答案(S1,S2)的渔民测试来做到这一点。但我想一次完成所有事情。在我的原始数据中,我有很多这样的列。谢谢!!

【问题讨论】:

    标签: r dataframe statistics bioconductor


    【解决方案1】:

    最简单的路线是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 
    

    【讨论】:

    • 嗨 Sotos,如果我在 S3、S4、S5、S6 等数据帧中都有更多列并在 (S3,S4) 和 (S5,S6) 上应用渔民测试以及 ( S1,S2)。这种数据框的上述代码是否也适用?
    • 请根据任何新要求更新您的问题。
    • 感谢您的回复。是的,我更新了问题,请检查一下。
    【解决方案2】:

    您可以使用Rsapply() 功能。我假设,“类型”是一个列名。

    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,

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

    我定义了一个名为 group 的列表,让您有机会安排测试列。我的意思是,如果您想测试 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
    

    【讨论】:

    • 这看起来很棒,谢谢。想问一个问题。如果我在两个数据框中都有更多的列,如 S3、S4、S5、S6,并且想在 (S3,S4) 和 (S5,S6) 上应用渔民测试,这是否也适用于更多列?
    • 我不确定您是否理解正确,但您可以访问任何您想要的栏目。这只是设置的问题... 下面,编写了一种设置要放入 Fisher 测试中的列名的方法。考虑 df1 和 df2 有多个名为 S1、S2、S3、S4、S5 的列...c_name1 &lt;- "S3" c_name2 &lt;- "S4" p_values &lt;- sapply(1:nrow(df1), function(x) { a=cbind(df1[x,c_name1],df1[x,c_name2]) b=cbind(df2[x,c_name1],df2[x,c_name2]) fisher.test(rbind(a,b))$p.value }) final &lt;- cbind(df1$Type,as.data.frame(p_values)) colnames(final) &lt;- c("Type","Pvalue")
    猜你喜欢
    • 2018-03-21
    • 2019-12-10
    • 1970-01-01
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    相关资源
    最近更新 更多