2

尽管我的问题似乎很容易,但我已经为此苦苦挣扎了一段时间。我有一个包含 P 值的对称矩阵。现在我想从矩阵中删除不包含超过确定阈值的值的所有行/列。

示例矩阵:

test <- c(1.0000000000, 0.001996328, 0.000176308, 0.0002305861, 0.1514324000,
0.0019963281, 1.000000000, 0.007106454, 0.409054300, 0.001210349,
0.0001763080, 0.007106454, 1.000000000, 0.217609400, 0.185434400,
0.0002305861, 0.409054269, 0.217609401, 1.000000, 1.972118e-09,
0.1514324468, 0.001210349, 0.185434396, 1.972118e-09, 1.000000)
m <- matrix(test, nrow=5, ncol=5)
genes <- c("geneA", "geneB", "geneC", "geneD", "geneE")
rownames(m) <- genes
colnames(m) <- genes
m

这将导致:

            geneA        geneB       geneC       geneD        geneE
      geneA 1.0000000000 0.001996328 0.000176308 2.305861e-04 1.514324e-01
      geneB 0.0019963280 1.000000000 0.007106454 4.090543e-01 1.210349e-03
      geneC 0.0001763080 0.007106454 1.000000000 2.176094e-01 1.854344e-01
      geneD 0.0002305861 0.409054300 0.217609400 1.000000e+00 1.972118e-09
      geneE 0.1514324000 0.001210349 0.185434400 1.972118e-09 1.000000e+00

现在我想删除所有不包含 -0.001 和 0.001 之间的值的行/列。所以在这个样本矩阵行和列“基因B”应该被删除。

我尝试的一些代码片段如下所示:

test <- finalPScore[(abs(finalPScore[]) < 0.001)]

但是“test”是一个数字,包含实际数字。

test <- finalPScore[(abs(finalPScore[]) < 0.001),(abs(finalPScore[]) < 0.001)]

错误消息:“(下标)逻辑下标太长”我还尝试了通过名称的方法:

test <- (abs(finalPScore[]) < 0.001)
for(i in colnames(test)) { if(test[,i] == 1) { print( i ) } }

但随后它只检查每一列的第一行......

blub <- rownames(finalPScore[abs(finalPScore[]) < 0.001])

根本不起作用。

无论如何,在我看来,我错过了一些非常简单但重要的东西。你能帮我解决这个问题吗?

PS:R 是必须的,因为我之前在做分析,之后会做图。原始矩阵也太大而无法暂时导出/写入。

4

3 回答 3

5

这是我的看法。此行查找我们要保留的列(行):

keep = (colSums(abs(m) < 0.001) > 0)

检查结果:

genes[keep]
m[keep,keep]
于 2013-11-04T18:07:32.257 回答
1

可能有更好的方法来做到这一点,但这里有一种方法:

Y <- sort(unique(rownames(which(abs(m) < 0.001, arr.ind=TRUE))))
m[Y, Y]
#              geneA       geneC        geneD        geneE
# geneA 1.0000000000 0.000176308 2.305861e-04 1.514324e-01
# geneC 0.0001763080 1.000000000 2.176094e-01 1.854344e-01
# geneD 0.0002305861 0.217609400 1.000000e+00 1.972118e-09
# geneE 0.1514324000 0.185434400 1.972118e-09 1.000000e+00
于 2013-11-04T18:06:26.697 回答
1

我会这样做:

首先,编写一个体现测试知识的辅助函数:我称它为keepers。

keepers <- function(M, dim) apply(M, dim, function(X) abs(min(X)) < 0.001)

并按如下方式应用:

> m[keepers(m, 1), keepers(m,2)]
             geneA       geneC        geneD        geneE
geneA 1.0000000000 0.000176308 2.305861e-04 1.514324e-01
geneC 0.0001763080 1.000000000 2.176094e-01 1.854344e-01
geneD 0.0002305861 0.217609400 1.000000e+00 1.972118e-09
geneE 0.1514324000 0.185434400 1.972118e-09 1.000000e+00

请注意,我编写了此函数,以便通过设置dim值将其应用于列和行。您可以制作一个更复杂的函数,将两者结合起来并返回一个矩阵,但这会更难理解(这是一个成本),而且没有必要。

使用这种类型的函数的一个优点是该解决方案适用于高阶数组(鉴于您的数据,我认为 3d 数组很常见)。

于 2013-11-04T19:27:42.530 回答