我有一个数据框
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测试。我想排除一些因素列,例如NA
或P
。
我使用以下代码通过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
答案 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))