在某些列上运行fishers测试

时间:2015-11-03 05:29:41

标签: r

我有一个数据框

SYMBOL INTENSITY1 CALL1     PVALUE1 INTENSITY2 CALL2    PVALUE2  INTENSITY3 CALL3     PVALUE3
1   CCL5         NA  <NA>          NA         NA  <NA>         NA 1125.518318     P 0.000943658
2 CYP2A6  141.73193     A 0.060419342   102.5146     A 0.08940508  227.369549     A 0.218983229
3 CYP2E1   57.67287     P 0.024710915   134.4076     P 0.06300000    6.090816     A 0.040000000
4   DDR1 3242.90209     P 0.000218932         NA  <NA>         NA 7015.297075     P 0.000218932
5  EPHB3   78.58733     A 0.234556513   453.3487     P 0.00222774  125.238085     A 0.418069378

我想在限定为PVALUE列的每一行上运行fishers测试。我想排除一些因素列,例如NAP

我使用以下代码通过Fisher方法

计算p值
Fisher.test <- function(p) {
  Xsq <- -2*sum(log(p))
  p.val <- pchisq(Xsq, df = 2*length(p), lower.tail = FALSE)
  return(c( p.value = p.val)) #
}

当我为具有所有数字列的数据框(i,e仅包含PVALUE列)执行此操作时,它可以正常工作。

data$Fisher's <- apply(data[,-1],1,function(x) Fisher.test(x))

如何为混合类型的数据执行此操作。感谢

Deisred输出:

    SYMBOL INTENSITY1 CALL1     PVALUE1 INTENSITY2 CALL2    PVALUE2  INTENSITY3 CALL3     PVALUE3        Fisher's
      CCL5       NA   <NA>       NA        NA     <NA>         NA   1125.518318   P       0.000943658  0.000943658
      CYP2A6  141.73193 A     0.060419342 102.5146  A      0.08940508  227.369549 A       0.218983229  0.03602191
      CYP2E1  57.67287  P  0.024710915    134.4076  P      0.06300000    6.090816 A       0.040000000  0.00358522
      DDR1    3242.90209 P 0.000218932         NA  <NA>         NA 7015.297075    P       0.000218932  0.0000008557
      EPHB3   78.58733   A 0.234556513    453.3487   P    0.00222774  125.238085  A       0.418069378  0.00982

1 个答案:

答案 0 :(得分:2)

您可以grep()获取与PVALUE列对应的数据框名称的索引,然后将调用中的数据框子集化为apply()

p.cols <- grep("PVALUE", names(data))
data$Fishers <- apply(data[, names(data)[p.cols]], 1, function(x) Fisher.test(x))