BH多重校正到data.frame中的不同列

时间:2012-12-04 19:12:53

标签: r

我有一个带有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的信息?

2 个答案:

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