我有以下数据框:
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)。但我想一次做到这一切。在我的原始数据中,我有很多这样的列。谢谢!!
答案 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