我的数据框看起来像这样:
Spec. Month SampleMethod Prey1 Prey2
AR April Opp 37.2 23.2
AR April Clu 40.1 19.2
AR April Hom 2.4 70.1
MR April Opp 34.2 27.2
MR April Clu 48.1 13.2
MR April Hom 10.4 5.4
AR May Opp 32.2 21.2
AR May Clu 42.1 11.2
AR May Hom 8.9 71.1
我想做的是对每个物种的SampleMethod的每个组合进行Fisher精确检验(例如“Clu”与“Opp”;“Opp”与“Hom”;“Hom”vs 。“Clu”)。我知道如何通过选择每一对并使每对成为新数据帧然后运行Fisher测试来做到这一点。但是,我想在这一个数据框架中以有效的方式完成。例如,我如何指定我想从物种“AR”的“四月”月中选择“Opp”样本方法,并将其与来自Spec的“四月”月份的“Clu”SampleMethod进行比较。 “AR”。我基本上试图这样做,然后对这两个选定的行进行Fisher精确测试。然后,我必须在6个不同的月份重复7种不同的物种,所以任何有关如何做到这一点的帮助都会很棒。
答案 0 :(得分:0)
通过使用嵌套的sapply
函数,我们将针对Spec.
和Month
的每个组合对数据子集执行Fisher精确测试,并对每个成对组合执行每个子集中SampleMethod
。
以下代码会返回列表中的所有结果,其中包含Spec.
和Month
的每个组合的元素,以及每对SampleMethod
的子元素。这些子元素包含测试的输出。
FT.list = sapply(split(DF, list(DF$Spec., DF$Month)), function(dat) {
# If there are at least two rows in a data subset, then proceed with Fisher Test
if(nrow(dat)>=2) {
# Get all pairwise combinations of SampleMethod
SMs = combn(unique(dat$SampleMethod), 2, simplify=FALSE)
# Name each element of SMs so that sapply will return the names in each list element
names(SMs) = lapply(SMs, paste, collapse=", ")
# For each pair of SampleMethod, run Fisher's Exact Test
sapply(SMs, function(methods) {
dat = dat[dat$SampleMethod %in% methods, ]
fisher.test(dat[, grep("Prey", names(dat))])
}, simplify=FALSE)
}
})