我有一个包含3064行和27列的矩阵,其中包含-0.5和2.0之间的值。我希望提取至少有一次值为>=0.5的每一行。作为回答,我想要整行在它的原矩阵形式。
假设m是我的矩阵,我试过:
m[m[1:190,1:16]>0.5,1:16]由于这个命令不接受190行以上的进程,所以我选择了190行,但不知怎么出错了,因为它给了我值也小于0.5的行。
是否可以编写任何可用于整个矩阵的函数?
发布于 2015-03-13 10:54:01
如果数据名为df,也可以这样做。
df2<- df[apply(df, MARGIN = 1, function(x) any(x >= 0.5)), ]发布于 2015-03-13 10:37:29
library(fBasics)
m2 <- subset(x = m, subset = rowMaxs(m)>=0.5)发布于 2015-03-13 10:38:52
mm=m[1:190,1:16]>0.5给出的是一个布尔矩阵,表示m[1:190,1:16]的哪个值大于0.5。
然后,当您执行m[mm]时,它将mm看作一个向量并给出相应的值。事情是dim(m) = 3064*27而不是dim(m[1:190,1:16]) = 190*16。这意味着mm的前27个值将用于获得m的第一行,而它们对应于mm的第二行的一部分。
因此,为了只有大于0.5的元素,需要将matrix应用于具有相同维度的m[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,]https://stackoverflow.com/questions/29029710
复制相似问题