[英]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.