簡體   English   中英

僅搜索某些記錄的矩陣

[英]Searching a matrix for only certain records

首先讓我說我對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個數據集。

誰能指出我正確的方向?

你想要正則表達式。 它們區分大小寫(如下所示)。

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

我無法從您發布的代碼中看出,但如果您的數據已經存在於data.frame中,則可以直接執行此操作。 如果沒有,首先運行dataset <- data.frame(dataset)

從那里:

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

應該返回你想要的東西。 For循環在R中非常低效。一旦你閱讀了R教程, R inferno就會告訴你如何避免一些常見的陷阱。

此特定行的工作方式是過濾數據框,只返回符合條件的行。 您可以輸入?[到您的R interpeter中以獲取更多信息。

正如其他海報所說,重復子集[操作很慢。 相反,優選在整個矢量上運行的函數。

我假設您的兩個條件都會影響REC.TYPE 我的解決方案使用%in%函數:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM