根据阈值过滤对称矩阵

Mar*_*les 2 r matrix

虽然我的问题似乎很容易,但我现在已经有一段时间了.我有一个包含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
Run Code Online (Sandbox Code Playgroud)

这将导致:

            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
Run Code Online (Sandbox Code Playgroud)

现在我想删除所有不包含介于-0.001和0.001之间的值的行/列.所以在这个样本矩阵中,行和列"基因B"应该被删除.

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

test <- finalPScore[(abs(finalPScore[]) < 0.001)]
Run Code Online (Sandbox Code Playgroud)

但是"test"是一个数字,包含实际数字.

test <- finalPScore[(abs(finalPScore[]) < 0.001),(abs(finalPScore[]) < 0.001)]
Run Code Online (Sandbox Code Playgroud)

错误信息:"(下标)逻辑下标太长"我也通过名称尝试了一种方法:

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

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

blub <- rownames(finalPScore[abs(finalPScore[]) < 0.001])
Run Code Online (Sandbox Code Playgroud)

根本不起作用.

无论如何,在我看来,我错过了一些非常简单而又重要的东西.你能帮帮我吗?

PS:R是必须的,因为我之前正在进行分析,之后会进行分析.此外,原始矩阵太大,无法暂时导出/写入.

And*_*lin 5

这是我对此的看法.该行找到我们要保留的列(行):

keep = (colSums(abs(m) < 0.001) > 0)
Run Code Online (Sandbox Code Playgroud)

检查结果:

genes[keep]
m[keep,keep]
Run Code Online (Sandbox Code Playgroud)