选择满足条件的矩阵行

R 中的矩阵:

     one two three four
[1,]   1   6    11   16
[2,]   2   7    12   17
[3,]   3   8    11   18
[4,]   4   9    11   19
[5,]   5  10    15   20

我想提取其行为第3列 = 11的子矩阵,即:

      one two three four
[1,]   1   6    11   16
[3,]   3   8    11   18
[4,]   4   9    11   19

我想这样做没有循环。我是新的 R,所以这可能是非常明显的,但 文档通常有些简洁。

517536 次浏览

如果你的矩阵叫做 m,只要使用:

R> m[m$three == 11, ]

如果使用 as.data.frame ()将矩阵转换为数据框架,则更容易做到这一点。在这种情况下,以前的答案(使用子集或 m $3)将起作用,否则它们将不起作用。

要在 矩阵上执行操作,可以按名称定义列:

m[m[, "three"] == 11,]

或者按号码:

m[m[,3] == 11,]

注意,如果只有一行匹配,结果是一个整数向量,而不是一个矩阵。

m <- matrix(1:20, ncol = 4)
colnames(m) <- letters[1:4]

下面的命令将选择上面矩阵的第一行。

subset(m, m[,4] == 16)

这将选择最后三个。

subset(m, m[,4] > 17)

在这两种情况下,结果都将是一个矩阵。 如果您想使用列名来选择列,那么您最好将其转换为一个数据框架

mf <- data.frame(m)

然后您可以选择

mf[ mf$a == 16, ]

或者,您可以使用子集命令。

子集是一个非常慢的函数,我个人认为它是无用的。

我假设您有一个 data.frame、 array 和名为 Mat的矩阵,其中 ABC作为列名; 然后您需要做的就是:

  • 在一个列上的一个条件的情况下,比如说列 A

    Mat[which(Mat[,'A'] == 10), ]
    

In the case of multiple conditions on different column, you can create a dummy variable. Suppose the conditions are A = 10, B = 5, and C > 2, then we have:

    aux = which(Mat[,'A'] == 10)
aux = aux[which(Mat[aux,'B'] == 5)]
aux = aux[which(Mat[aux,'C'] > 2)]
Mat[aux, ]

通过测试 system.time的速度优势,which方法比 subset方法快10倍。

我将使用 dplyr 包选择一种简单的方法。

如果数据框架是数据。

library(dplyr)
result <- filter(data, three == 11)

如果数据集被称为 data,那么满足以下条件的所有行都可以通过-接收列“ pm2.5”> 300的值

境监察及审核资料[资料[ pm2.5] > 300,]