我有一个这样的数据集:
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。
谢谢,
弗雷德里克
所以这有点有趣。你需要认识到的主要事情是你想要数据的组合。R中有许多函数可以为您做到这一点。主要工作部件是combn()
链路
因此,在问题的语言中,我们希望您的tibble的所有组合一次获取2链接2
从那里,你只需要做一些循环结构就可以让你的测试工作,并从对象中提取p值。
list_tables <- lapply(combn(contingency_table,2,simplify=F), fisher.test)
unlist(lapply(list_tables, `[`, 'p.value'))
这应该会产生你的答案。
编辑
考虑到仅对相邻数据.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
代码正是这样做的。最终的输出应该是解决问题所需要的。