R:如何通过两个因子列对数据进行子集化,然后针对每个子集运行Fisher精确检验?

时间:2015-12-22 22:53:01

标签: r subset

我的数据框看起来像这样:

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种不同的物种,所以任何有关如何做到这一点的帮助都会很棒。

1 个答案:

答案 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)

  }
})