172

在带有矩阵的 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 新手,所以这可能很明显,但文档通常有点简洁。

4

6 回答 6

183

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

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

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

或按编号:

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

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

于 2011-03-22T13:04:37.210 回答
33

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

如果数据框是数据。

library(dplyr)
result <- filter(data, three == 11)
于 2015-06-10T19:20:30.070 回答
32
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, ]

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

于 2011-03-22T13:40:08.037 回答
12

子集是一个很慢的函数,我个人觉得没什么用。

我假设你有一个 data.frame、array、matrix ,MatA,作为列名;那么你需要做的就是:BC

  • 如果在一列上有一个条件,假设列 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 倍。

于 2011-08-31T16:23:55.740 回答
7

如果您的矩阵被调用m,只需使用:

R> m[m$three == 11, ]
于 2011-03-22T12:26:12.327 回答
0

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

数据[数据['pm2.5'] >300,]

于 2019-06-01T18:35:33.703 回答