我有一个包含3064
行和27
列的矩阵,其中包含-0.5
和2.0
之间的值。我想提取至少具有一次值>=0.5
的每一行。作为答案,我希望在它的原始矩阵形式中排成一行。
考虑m
是我的矩阵,我试过了:
m[m[1:190,1:16]>0.5,1:16]
由于这个命令不接受超过190行的进程,我去了190行,但不知何故它出错了,因为它给了我行值< 0.5
是否可以编写任何可应用于整个矩阵的函数?
答案 0 :(得分:1)
library(fBasics)
m2 <- subset(x = m, subset = rowMaxs(m)>=0.5)
答案 1 :(得分:1)
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.5的值超过0。然后你得到你的输出:
m[rowSums(m >= 0.5) > 0,]
它适用于整个矩阵。请注意,如果至少有一个值大于0.5,则选择整行,因此某些值将小于0.5。
修改的
对于值为<0.5
的行,其想法是相同的:
m[rowSums(m < 0.5) > 0,]
答案 2 :(得分:1)
如果您的数据名称为 df
,您也可以尝试这样做df2<- df[apply(df, MARGIN = 1, function(x) any(x >= 0.5)), ]