2013-03-03 71 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"),]