【问题标题】:Searching a matrix for only certain records仅在矩阵中搜索某些记录
【发布时间】:2013-03-03 06:18:02
【问题描述】:

首先让我说我对 R 比较陌生,并且通常认为自己是一个新手程序员...所以不要以为我知道自己在做什么 :)

我有一个大矩阵,大约 300,000 x 14。它本质上是一个包含 15 分钟数据的 20 年数据集。但是,我只需要我命名为 REC.TYPE 的列包含字符串“SAO”或“FL-15”的行。

我非常低效的解决方案是逐行搜索矩阵,测试 REC.TYPE 列,如果该行不符合我的条件,则基本上删除该行。本质上...

   j <- 1
   for (i in 1:nrow(dataset)) {
      if(dataset$REC.TYPE[j] != "SAO  " && dataset$RECTYPE[j] != "FL-15") {
        dataset <- dataset[-j,]  }
      else {
        j <- j+1  }
   }

在看到我的代码在一小时内只通过了大约 10% 的矩阵并且每一行都变慢之后......我认为必须有一种更有效的方法来只提取我需要的记录......尤其是当我需要对另外 8 个数据集重复此操作。

谁能指出我正确的方向?

【问题讨论】:

  • 如果您提供一个可重复的小示例,您的问题对其他人会更有意义。现在我们必须猜测dataset 是什么。这会使问题更加本地化,​​对未来的搜索者帮助不大。
  • 真正杀死你的是你一直在重写数据集。不要那样做!

标签: r search matrix


【解决方案1】:

我无法从您发布的代码中看出,但如果您的数据已经在 data.frame 中,您可以直接执行此操作。如果没有,请先运行dataset &lt;- data.frame(dataset)

从那里:

dataset[dataset$REC.TYPE == "SAO  " | dataset$RECTYPE == "FL-15",]

应该返回您要查找的内容。 For 循环在 R 中效率极低。一旦您阅读了 R 教程,R inferno 将告诉您如何避免一些常见的陷阱。

此特定行的工作方式是过滤数据框,仅返回符合条件的行。您可以在您的 R 解释器中输入 ?[ 以获取更多信息。

【讨论】:

  • For 循环就好了,你只需要设置一切。不过,真正的好处来自矢量化。见stackoverflow.com/a/3131278/322912
  • For 循环和应用需要相似的时间,是的。但是矢量化比任何一个都快得多。我发布的代码版本相当于矢量化。不是检查每一行的相等性,而是将相等性作为向量运算来检查。
  • 无论如何,+1 参考 R inferno。 OP 很聪明,能够欣赏它的信息。
【解决方案2】:

你想要正则表达式。它们区分大小写(如下所示)。

x <- c("ABC", "omgSAOinside", "TRALAsaoLA", "tumtiFL-15", "fl-15", "SAOFL-15")
grepl("SAO|FL-15", x)
[1] FALSE  TRUE FALSE  TRUE FALSE  TRUE

在你的情况下,我会这样做

subsao <- grepl("SAO", x = dataset$REC.TYPE)
subfl <- grepl("FL-15", x = dataset$RECTYPE)
#mysubset <- subsao & subfl # will return TRUE only if SAO & FL-15 occur in the same line
mysubset <- subsao | subfl # will return TRUE if either occurs in the same line
dataset[mysubset, ]

【讨论】:

  • Roman,我认为OP的问题更根本。他需要使用[ 来提取他想要的行,而不是使用for 循环。就他的问题而言,您可以假设他正在尝试完全匹配字符串“SAO”或“FL-15”。
【解决方案3】:

正如其他发帖者所说,重复子集[ 操作很慢。相反,对整个向量进行操作的函数更可取。

我假设您的两个标准都会影响REC.TYPE。我的解决方案使用函数%in%

dataset <- dataset[dataset$REC.TYPE %in% c("SAO","FL-15"),]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多