【问题标题】:Select rows of a matrix that meet a condition选择满足条件的矩阵行
【发布时间】:2011-07-20 10:52:20
【问题描述】:

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

【问题讨论】:

  • 每个答案的基本思想是,如果您有一个与某些索引长度相同的逻辑向量/矩阵(TRUE 和 FALSE),您将只选择为 TRUE 的情况。运行答案中[ ]之间的代码,你会看得更清楚。

标签: r select matrix submatrix


【解决方案1】:

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

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

【讨论】:

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

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

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

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

或按数字:

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

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

【讨论】:

  • 如果您需要保留矩阵,请执行m[m[,3] == 11,,drop=FALSE]
  • @neilfws 如果我想为一系列列定义一些值,解决方案是什么。例如df <- df[!which(df$ARID3A:df$YY1 == "U"),],在这里我想从我的 df 中删除那些列范围 (ARID3A: YY1) 包含值 U 的行。
  • 如果您根本不想指定列名,但想处理矩阵中的所有列,这将如何工作?
  • 嘿@neilfws,你怎么能在这个中添加&&语句?我需要同时获取两列值吗?
【解决方案3】:
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, ]

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

【讨论】:

    【解决方案4】:

    子集是个很慢的函数,个人觉得没啥用。

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

    • 如果一列有一个条件,假设列 A

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

    在不同列有多个条件的情况下,可以创建一个虚拟变量。假设条件是A = 10B = 5C &gt; 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 倍。

    【讨论】:

      【解决方案5】:

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

      如果数据框是数据。

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          猜你喜欢
          • 2022-07-30
          • 2017-02-20
          • 2021-01-03
          • 2013-08-10
          • 2019-04-24
          • 1970-01-01
          • 2020-02-11
          • 1970-01-01
          相关资源
          最近更新 更多