2013-03-03 95 views
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个数据集重复此操作时。

任何人都可以指向正确的方向吗?

+1

你的问题会更加有意义给他人。现在我们必须猜测'数据集'是什么。这使得问题更加本地化,​​对未来的搜索者不太有用。 – 2013-03-03 07:29:47

+2

这里真正杀死你的是你一直在重写数据集。不要这样做! – 2013-03-03 08:30:58

回答

4

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

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

在你的情况,我会做

​​
+0

Roman,我认为OP的问题更为根本。他不需要使用'for'循环,而需要使用'['来提取他想要的行。就他的问题而言,你可以假设他试图完全匹配字符串“SAO”或“FL-15”。 – Wilduck 2013-03-03 06:33:07

+0

我认为你是对的。我已经添加了替代方案。 – 2013-03-03 06:52:20

4

我无法从您发布的代码告诉,但如果您的数据已经在data.frame,你可以直接做到这一点。如果没有,首先运行dataset <- data.frame(dataset)

从那里:

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

应该回到你在找什么。 For循环在R中效率非常低。读完R教程后,R inferno会告诉您如何避免一些常见的陷阱。

此特定行的工作方式是仅通过返回符合条件的行来过滤数据框。您可以输入?[到您的R interpeter获取更多信息。

+2

For循环很好,你只需要设置一切。虽然,真正的好处来自矢量化。请参阅http://stackoverflow.com/a/3131278/322912 – 2013-03-03 06:32:48

+0

对于循环和应用,花费相似的时间,是的。但矢量化要比任何一个都快得多。我发布的代码版本相当于矢量化。不要检查每行中的相等性,而是检查相等性是否为矢量操作。 – Wilduck 2013-03-03 06:35:02

+0

无论如何,+1参考R地狱。 OP很聪明,可以欣赏它的讯息。 – 2013-03-03 20:19:54

3

正如其他海报所说,重复子集[操作是缓慢的。相反,对整个矢量进行操作的函数是可取的。

我假设你的标准影响REC.TYPE。我的解决方案使用功能%in%:如果你提供了一个小的可重复的例子

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