我有一个带有id字段的data.frame和三个不同且无关的p值。我想在每一栏都应用benjamini-hochberg核心。
我一直在使用p.adjust
作为函数p.adjust(data[,2], "BH")
,但我遇到了麻烦,因为我必须在应用更正之前对每列进行排序,之后我丢失了id信息。我的数据如下:
id p1 p2 p3
1 ENSG00000179094 1.000000e+00 1.000000e+00 1.000000e+00
2 ENSG00000164306 1.000000e+00 1.000000e+00 1.000000e+00
3 ENSG00000147180 1.000000e+00 8.778847e-02 1.000000e+00
4 ENSG00000172932 4.370119e-01 1.766703e-04 1.000000e+00
5 ENSG00000137252 1.000000e+00 2.562124e-02 1.000000e+00
6 ENSG00000144644 1.654108e-02 1.000000e+00 1.000000e+00
7 ENSG00000197273 3.316301e-01 5.341301e-01 1.000000e+00
8 ENSG00000169221 1.000000e+00 1.000000e+00 1.000000e+00
9 ENSG00000108309 8.689368e-01 2.350522e-03 1.000000e+00
10 ENSG00000172382 1.000000e+00 9.028471e-01 2.697276e-02
11 ENSG00000099937 1.000000e+00 1.000000e+00 9.988716e-01
12 ENSG00000259431 1.000000e+00 1.000000e+00 7.268023e-01
...
有没有最简单的方法或程序包来执行此操作而不会丢失来自ID的信息?
答案 0 :(得分:3)
您可以使用 numcolwise ,仅将函数应用于data.frame的数字列。
library(plyr)
cbind(dat$id,numcolwise(p.adjust)(dat))
dat$id p1 p2 p3
1 ENSG00000179094 1.000000 1.000000000 1.0000000
2 ENSG00000164306 1.000000 1.000000000 1.0000000
3 ENSG00000147180 1.000000 0.790096230 1.0000000
4 ENSG00000172932 1.000000 0.002120044 1.0000000
5 ENSG00000137252 1.000000 0.256212400 1.0000000
6 ENSG00000144644 0.198493 1.000000000 1.0000000
7 ENSG00000197273 1.000000 1.000000000 1.0000000
8 ENSG00000169221 1.000000 1.000000000 1.0000000
9 ENSG00000108309 1.000000 0.025855742 1.0000000
10 ENSG00000172382 1.000000 1.000000000 0.3236731
11 ENSG00000099937 1.000000 1.000000000 1.0000000
12 ENSG00000259431 1.000000 1.000000000 1.0000000
使用其他参数:
cbind(dat$id,numcolwise(p.adjust)(dat, method = 'bonferroni', n = 20))
答案 1 :(得分:1)
为什么不:
dat2 <- dat # only needed if you want to protect original data.
dat2[2:4] <- lapply(dat2[2:4], p.adjust, method="BH")