我有这样的数据集:
contingency_table<-tibble::tibble(
x1_not_happy = c(1,4),
x1_happy = c(19,31),
x2_not_happy = c(1,4),
x2_happy= c(19,28),
x3_not_happy=c(14,21),
X3_happy=c(0,9),
x4_not_happy=c(3,13),
X4_happy=c(17,22)
)
实际上,还有许多其他变量来自两年不同的民意调查。
然后,我使用此代码在每个2X2意外事件矩阵中应用Fisher测试:
matrix1_prueba <- contingency_table[1:2,1:2]
matrix2_prueba<- contingency_table[1:2,3:4]
fisher1<-fisher.test(matrix1_prueba,alternative="two.sided",conf.level=0.9)
fisher2<-fisher.test(matrix2_prueba,alternative="two.sided",conf.level=0.9)
我想通过函数或循环使用短代码来运行此任务。输出必须是带有每个问题的p_values的向量。
谢谢,
弗雷德里克
答案 0 :(得分:0)
所以这很有趣。您需要认识到的主要事情是您需要组合您的数据。 R中有许多功能可以为您做到这一点。主要工作是combn()
Link
因此,在问题的语言中,我们希望您的所有组合一次只能获得2个link2
从那里,你只需要做一些循环结构来让你的测试工作,并从对象中提取p值。
list_tables <- lapply(combn(contingency_table,2,simplify=F), fisher.test)
unlist(lapply(list_tables, `[`, 'p.value'))
这应该会产生你的答案。
修改强>
鉴于仅对邻接data.frame列的更新要求,以下修改应该有效。
full_list <- combn(contingency_table,2,simplify=F)
full_list <- full_list[sapply(
full_list, function(x) all(startsWith(names(x), substr(names(x)[1], 1,2))))]
full_list <- lapply(full_list, fisher.test)
unlist(lapply(full_list, `[`, 'p.value'))
这与以前的代码大致相同,但现在我们必须找到具有相同问题前缀名称的数据的子集。这仅在前缀完全相同(X3 != x3
)时才有效。我认为这是一个比尝试使用列索引更好的解决方案,并且不保证始终彼此相邻。 sapply
代码就是这样做的。最终输出应该是您需要的问题。