矩阵的行选择符合条件矩阵的行选择符合条件(Select rows of a matrix that

2019-05-12 19:09发布

在具有矩阵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所以这可能是非常明显的,但文档往往有些简洁。

Answer 1:

这是比较容易做,如果你使用as.data.frame转换您的矩阵的数据帧()。 在这种情况下,以前的答案(使用子集或M $为三个)会的工作,否则他们不会。

要对矩阵进行操作,你可以定义名称的列:

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

或数字:

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

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



Answer 2:

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

或者,你可以使用子命令。



Answer 3:

我会选择使用dplyr包一个简单的方法。

如果数据帧的数据。

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


Answer 4:

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

我想你有一个data.frame,阵列,矩阵称为MatABC列名; 那么所有你需要做的是:

  • 在对一列一个条件的情况下,可以说A列

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

在对不同列中的多个条件的情况下,你可以创建一个虚拟变量。 假设条件为A = 10B = 5 ,和C > 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方法比快10倍subset的方法。



Answer 5:

如果你的矩阵称为m ,只需使用:

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


文章来源: Select rows of a matrix that meet a condition