选择满足条件的矩阵行

pet*_*108 128 select r 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
Run Code Online (Sandbox Code Playgroud)

我想提取其行有第三列= 11的子矩阵.这是:

      one two three four
 [1,]   1   6    11   16
 [3,]   3   8    11   18
 [4,]   4   9    11   19
Run Code Online (Sandbox Code Playgroud)

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

nei*_*fws 145

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

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

m[m[, "three"] == 11,]
Run Code Online (Sandbox Code Playgroud)

或者通过数字:

m[m[,3] == 11,]
Run Code Online (Sandbox Code Playgroud)

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

  • 如果你需要保留矩阵,那么`m [m [,3] == 11,,drop = FALSE]` (18认同)

Joh*_*ohn 26

m <- matrix(1:20, ncol = 4) 
colnames(m) <- letters[1:4]
Run Code Online (Sandbox Code Playgroud)

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

subset(m, m[,4] == 16)
Run Code Online (Sandbox Code Playgroud)

这将选择最后三个.

subset(m, m[,4] > 17)
Run Code Online (Sandbox Code Playgroud)

在两种情况下,结果都是矩阵.如果要使用列名来选择列,那么最好将其转换为带有的数据帧

mf <- data.frame(m)
Run Code Online (Sandbox Code Playgroud)

然后你可以选择

mf[ mf$a == 16, ]
Run Code Online (Sandbox Code Playgroud)

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


小智 19

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

如果数据帧是数据.

library(dplyr)
result <- filter(data, three == 11)
Run Code Online (Sandbox Code Playgroud)


Moh*_*sri 11

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

我假设你有一个data.frame,阵列,矩阵称为MatA,B,C列名; 那么你需要做的就是:

在不同列的多个条件的情况下,您可以创建一个虚拟变量.假设条件是A = 10,B = 5C > 2,则有:

    aux = which(Mat[,'A'] == 10)
    aux = aux[which(Mat[aux,'B'] == 5)]
    aux = aux[which(Mat[aux,'C'] > 2)]
    Mat[aux, ]
Run Code Online (Sandbox Code Playgroud)

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


jub*_*uba 5

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

R> m[m$three == 11, ]
Run Code Online (Sandbox Code Playgroud)

  • 这适用于数据帧,但不适用于矩阵. (3认同)