3

首先让我说我对 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 个数据集。

谁能指出我正确的方向?

4

3 回答 3

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, ]
于 2013-03-03T06:25:32.530 回答
4

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

从那里:

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

应该返回你正在寻找的东西。For循环在 R 中非常低效。一旦你通读了 R 教程,R inferno会告诉你如何避免一些常见的陷阱。

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

于 2013-03-03T06:26:23.903 回答
3

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

我假设您的两个标准都会影响REC.TYPE. 我的解决方案使用以下功能%in%

dataset <- dataset[dataset$REC.TYPE %in% c("SAO","FL-15"),]
于 2013-03-03T06:42:24.323 回答