如何在两个数据框之间应用渔民测试?
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
您可以使用 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
嗨@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
我有如下数据框:
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
您可以使用 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
嗨@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