如何在两个数据帧之间应用fishers测试?

如何在两个数据帧之间应用fishers测试?,r,dataframe,statistics,bioconductor,R,Dataframe,Statistics,Bioconductor,我有如下数据帧: 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: df2: 我为“CC”申请了fishers测试 但要为所有其他人做到这一点,这是一个耗时的过程。我希望一次对所有其他类型应用fishers测试,结果如下所示: Type Pvalue CC 0.0004191 Ch 0.6978 H 0.8

我有如下数据帧:

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:

df2:

我为“CC”申请了fishers测试

但要为所有其他人做到这一点,这是一个耗时的过程。我希望一次对所有其他类型应用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
我从下面的答案中得到了上述事情的答案。但我现在用更多的数据编辑这个。如果数据如下所示,该怎么办

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:

df2:


我还想对(S3,S4)和(S5,S6)应用fishers测试,并得到结果中的p值。我可以通过只选择那些列并应用fishers测试来完成,如下面的答案(S1,S2)。但我想一次做完所有的事。在我的原始数据中,我有很多这样的列。谢谢

最简单的方法是
rbind
两个数据帧,在
类型上拆分,并对列表中的每个元素应用测试,即

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

最简单的方法是
rbind
两个数据帧,在
类型上拆分,并对列表的每个元素应用测试,即

full_df <- rbind(df1, df2)
lapply(split(full_df, full_df$Type), function(i) fisher.test(as.matrix(i[-1])))
您可以使用
R
sapply()
功能。我假设,“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
p\u值您可以使用
R
sapply()
功能。我假设,“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

p_值这看起来很棒,谢谢。我想问一个问题。如果我在两个数据帧中都有更多的列,如S3、S4、S5、S6,并且希望对(S3、S4)和(S5、S6)应用fishers测试,那么这对更多的列也有效吗?我不确定您是否正确理解,但您可以访问您想要的任何列。这只是设置的问题。。。下面,编写了一种设置要放入fisher测试中的列名的方法。考虑DF1和DF2有多个列称为S1、S2、S3、S4、S5……代码>c_名称1这看起来很棒,谢谢。我想问一个问题。如果我在两个数据帧中都有更多的列,如S3、S4、S5、S6,并且希望对(S3、S4)和(S5、S6)应用fishers测试,那么这对更多的列也有效吗?我不确定您是否正确理解,但您可以访问您想要的任何列。这只是设置的问题。。。下面,编写了一种设置要放入fisher测试中的列名的方法。考虑DF1和DF2有多个列称为S1、S2、S3、S4、S5……code>c_name1 Hi Sotos,如果我在S3、S4、S5、S6这两个数据帧中都有更多的列,并对(S3、S4)和(S5、S6)以及(S1、S2)应用fishers测试会怎么样。上述代码是否也适用于此类数据框?请使用任何新要求更新您的问题。谢谢您的回复。是的,我更新了问题,请检查。嗨,Sotos,如果我在S3、S4、S5、S6这两个数据框中都有更多的列,并且对(S3、S4)和(S5、S6)以及(S1、S2)应用fishers测试会怎么样。上述代码是否也适用于此类数据框?请使用任何新要求更新您的问题。谢谢您的回复。是的,我更新了问题,请检查一下。
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 
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
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