选择满足条件的矩阵行


144

在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
每个答案中的基本思想是,如果您的逻辑矢量/矩阵(与TRUE和FALSE)的长度与某些索引相同,则将仅选择TRUE的情况。运行[ ]答案之间的代码,您将更加清楚地看到这一点。
2011年

Answers:


159

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

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

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

或按号码:

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

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


19
如果您需要保留矩阵,请这样做m[m[,3] == 11,,drop=FALSE]
Joris Meys 2011年

@neilfws如果我想为一系列列定义一些值,那么解决方案是什么。例如df <- df[!which(df$ARID3A:df$YY1 == "U"),],在这里我想从我这里DF一系列列删除那些行(ARID3A:YY1)的值为ü
新手

如果您根本不想指定列名称,而是想对矩阵中的所有列进行操作,这将如何工作?
user5359531 2016年

嘿@neilfws,您怎么能在此添加&&语句?我需要同时获取两个列的值吗?
调试XD

28
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命令。


21

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

如果数据帧是数据。

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

11

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

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

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


6

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

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

@juba如果我想为一系列列定义一些值,那么解决方案是什么。例如df <- df[!which(df$ARID3A:df$YY1 == "U"),],在这里我想从我的df中删除这些行,其中一系列列(ARID3A:YY1)包含值U
Newbie

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.