1

我有一个带有 id 字段和三个不同且不相关的 p 值的 data.frame。我想在每列应用 benjamini-hochberg 校正。我一直在使用p.adjustas 函数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 的信息?

4

2 回答 2

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))
于 2012-12-04T19:16:02.523 回答
1

为什么不:

dat2 <- dat  # only needed if you want to protect original data.
dat2[2:4] <- lapply(dat2[2:4], p.adjust, method="BH")
于 2012-12-04T19:58:35.137 回答