仅搜索某些记录的矩阵

时间:2013-03-03 06:18:03

标签: r search matrix

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

我有一个大矩阵,大约300,000 x 14.它基本上是一个20年的15分钟数据数据集。但是,我只需要我名为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个数据集重复此操作。

有人能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:4)

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

从那里:

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

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

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

答案 2 :(得分:3)

正如其他海报所说,重复子集[操作很慢。相反,优选在整个矢量上运行的函数。

我认为您的两个条件都会影响REC.TYPE。我的解决方案使用函数%in%

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