2016-01-13 47 views
1

我嘗試使用grepl嘗試子集數據框時遇到了一些意外的行爲(至少對我來說)。下面是一些例子來說明這個問題:意外的正則表達式匹配在R

> myVec <- c("ISB*", "ISNB*") 
> myDF <- data.frame(Source = rep(myVec, 5, 2), Value = 1:10) 
> print(myDF) 
    Source Value 
1 ISB*  1 
2 ISNB*  2 
3 ISB*  3 
4 ISNB*  4 
5 ISB*  5 
6 ISNB*  6 
7 ISB*  7 
8 ISNB*  8 
9 ISB*  9 
10 ISNB* 10 
> myDF.b <- myDF[grepl("ISB*", myDF$Source), ] 
> print(myDF.b) 
    Source Value 
1 ISB*  1 
2 ISNB*  2 
3 ISB*  3 
4 ISNB*  4 
5 ISB*  5 
6 ISNB*  6 
7 ISB*  7 
8 ISNB*  8 
9 ISB*  9 
10 ISNB* 10 
> myDF.nb <- myDF[grepl("ISNB*", myDF$Source), ] 
> print(myDF.nb) 
    Source Value 
2 ISNB*  2 
4 ISNB*  4 
6 ISNB*  6 
8 ISNB*  8 
10 ISNB* 10 

當我做是myDF的子集創建myDF.b,我用grepl("ISB*", myDF$Source), ]。現在,我期望的是它只抓取了ISB*行,但它抓住了所有這些行。我意識到ISNB*包含的所有字母與ISB*的順序相同,但我很驚訝地看到中間的N沒有使grepl與匹配它。我期望ISB*NISB*匹配,但不會與中間的N匹配。

這是正常行爲還是有我缺少的論據?先謝謝你。

回答

3

我們需要轉義*,因爲它是一個特殊字符,意思是零個或多個。

myDF[grepl("ISB\\*", myDF$Source), ] 

或者作爲@Pierre Lafortune提到的,fixed=TRUE都可以使用(這將是更快)

myDF[grepl("ISB*", myDF$Source, fixed=TRUE), ] 
+0

該死,這是顯而易見的。我現在覺得很愚蠢。謝謝! – giraffehere

+2

另外,'fixed = TRUE' –

+0

它工作'myDF [grepl(「ISB *」,myDF $源,固定= TRUE),]' –