选择满足条件的矩阵行

时间:2011-03-22 12:21:48

标签: r select matrix submatrix

在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

我想提取其行有第三列= 11的子矩阵。即:

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

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

6 个答案:

答案 0 :(得分:138)

如果使用as.data.frame()将矩阵转换为数据框,则更容易实现。在这种情况下,先前的答案(使用子集或m $ 3)将起作用,否则他们不会。

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

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

或按号码:

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

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

答案 1 :(得分:26)

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, ]

或者,您可以使用subset命令。

答案 2 :(得分:17)

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

如果数据框是数据。

shared_ptr

答案 3 :(得分:10)

子集是一个非常慢的功能,我个人觉得它没用。

我假设您有一个名为Mat的data.frame,数组,矩阵,ABC作为列名;那么你需要做的就是:

  • 如果一列上有一个条件,请说列A

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

如果不同列上有多个条件,则可以创建虚拟变量。假设条件为A = 10B = 5C > 2,那么我们就有:

    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倍。

答案 4 :(得分:5)

如果您的矩阵被称为m,请使用:

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

答案 5 :(得分:0)

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

data [data ['pm2.5']> 300,]