2015-03-13 53 views
0

我有一个矩阵,其中3064行和27列包含-0.52.0之间的值。我想提取至少有一次值为>=0.5的每一行。作为答案,我希望在其原始矩阵形式中有整行。基因表达数据矩阵过滤

考虑m是我的矩阵,我想:

m[m[1:190,1:16]>0.5,1:16] 

由于这个命令不接受更多的则190行的过程中,我去了190行,但不知何故,就错了,因为它给了我行其中也有的值< 0.5

是否可以编写任何函数,可以应用于整个矩阵?

+4

如果您需要至少有一个值大于等于0.5的行,请尝试' m [rowSums(m> = 0.5)> 0,]' – akrun 2015-03-13 10:22:57

+0

我想要矩阵,而不包含值为“<0的行”。5“ – 2015-03-13 10:30:19

+0

但是你的描述'我想提取每一行,在他的行中至少有一次值大于等于0.5。'在帖子中与你在评论中提到的内容相反。无论如何,请考虑显示一个小例子'(10行,5列)以及基于此的预期结果 – akrun 2015-03-13 10:31:31

回答

1

,你也可以尝试这样的,如果你的数据名称是DF

df2<- df[apply(df, MARGIN = 1, function(x) any(x >= 0.5)), ] 
1
library(fBasics) 
m2 <- subset(x = m, subset = rowMaxs(m)>=0.5) 
+0

这里x是什么? – 2015-03-13 10:52:09

+0

这只是参数的名称。它出来了(只使用'subset(m,subset = ...)',但看'?subset'可以更好地理解参数在R中的传递。 – 2015-03-13 10:58:44

1

什么mm=m[1:190,1:16]>0.5给你是布尔的指示,其中m[1:190,1:16]值大于0.5的矩阵。

然后当你做m[mm],它认为mm作为一个向量,并给你相应的值。东西是dim(m) = 3064*27dim(m[1:190,1:16]) = 190*16。这意味着mm的前27个值将用于获得第一行m,同时它们对应于mm第二行的一部分。

因此为了仅元素大于0.5,则需要应用matrixm[1:190,1:16]具有相同的尺寸,即:

`m[1:190,1:16][m[1:190,1:16]>0.5, 1:16] 

但你在这里做什么是m[mm, 1:16],所以你考虑每个个别值为mm作为行号,而它是190 * 16矩阵。这意味着你指定了190*16=3040行,它不会与更多的工作,因为m只有3064行。

你想要的是一个长度为190(甚至3064我猜)指定要采取的行的向量。你可以用rowSums(m >=0.5)>0得到这个向量,这意味着每行有超过0的值大于0.5。然后你得到你的输出:

m[rowSums(m >= 0.5) > 0,] 

它会工作的整个矩阵。请注意,如果至少有一个值大于0.5,则选择整行后,某些值将小于0.5。

编辑

对于值<0.5行的想法是一样的:

m[rowSums(m < 0.5) > 0,]