尽管我的问题似乎很容易,但我已经为此苦苦挣扎了一段时间。我有一个包含 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 是必须的,因为我之前在做分析,之后会做图。原始矩阵也太大而无法暂时导出/写入。