2015-06-13 63 views
0

在哪些情況下,這兩種不同的實現方式會產生不同的結果?在R中使用grepl

data(mtcars) 
firstWay <- mtcars[grepl('6',mtcars$cyl),] 
SecondWay <- mtcars[mtcars$cyl=='6',] 

如果這些方法總是給出相同的結果,那麼推薦使用它們,爲什麼?謝謝

回答

1

使用封裝微基準測試,我們可以看到這是更快

library(microbenchmark) 
m <- microbenchmark(mtcars[grepl('6',mtcars$cyl),], mtcars[mtcars$cyl=='6',], times=10000) 

    Unit: microseconds 
         expr  min  lq  mean median  uq  max neval 
mtcars[grepl("6", mtcars$cyl), ] 229.080 234.738 247.5324 236.693 239.417 6713.914 10000 
     mtcars[mtcars$cyl == "6", ] 214.902 220.210 231.0240 221.956 224.471 7759.507 10000 

看起來==速度更快,所以如果可能的話,你應該使用

然而,功能不這樣做完全一樣的事情。 grepl搜索字符串是否存在於所有wheras ==檢查表達式是否相等

grepl("6", mtcars$disp) 

[1] TRUE TRUE FALSE FALSE TRUE FALSE TRUE TRUE FALSE TRUE TRUE FALSE FALSE FALSE FALSE TRUE FALSE 
[18] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 

mtcars$disp == "6" 

[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
[18] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
1

嗯,我認爲第一個區別在於grepl,即使你還不知道,你可以子集,例如6,但你可以嘗試搜索以6開始或結束的行。

如果你嘗試用正常的子集技術來做到這一點,你就會有一個空的對象,因爲,例如^6,不被識別爲一個正則表達式,但與符號^6的字符串。

我相信還有其他差異,但我確信專業用戶會提供更詳細的答案。

對於側OS哪一個可能是優選的,也許可以有效率的原因:

system.time(mtcars[grepl('^6',mtcars$cyl),]) 
    user system elapsed 
    0.029 0.002 0.035 
system.time(mtcars[mtcars$cyl=='6',]) 
    user system elapsed 
    0.031 0.002 0.046 

該小例子可以只是一個引導件和作爲@Nickķ建議第一進一步(和精確的)調查有用microbenchmark完成。當然,對於大數據集,我幾乎不相信專業用戶(或需要速度的人)會喜歡他們兩個,但可能會依賴於數據表,或者使用低級語言編寫的工具dplyr等等。

+0

'system.time'對於像這樣的真正快速的表達式並不是很有用。根據@ CactusWoman的回答,'microbenchmark'要好得多。 –

3

mtcars$cyl是數字列,所以你會更好使用mtcars相對於一個數[mtcars $缸== 6,]。

但相等運算==grepl和之間的不同之處在於==只會TRUE爲其等於"6"載體的成員,而grepl將匹配,其具有6內的任何地方的矢量的任何成員。

因此,舉例來說:

String             ==  grepl 
6              TRUE TRUE 
123456             FALSE TRUE 
6ABC              FALSE TRUE 
This is a long sentence which happens to have a 6 in it FALSE TRUE 
Whereas this long sentence does not      FALSE FALSE 

等效grepl模式將是 「^ $ 6」。在http://www.regular-expressions.info/tutorial.html上有一個正則表達式的教程(很多)。