在哪些情況下,這兩種不同的實現方式會產生不同的結果?在R中使用grepl
data(mtcars)
firstWay <- mtcars[grepl('6',mtcars$cyl),]
SecondWay <- mtcars[mtcars$cyl=='6',]
如果這些方法總是給出相同的結果,那麼推薦使用它們,爲什麼?謝謝
在哪些情況下,這兩種不同的實現方式會產生不同的結果?在R中使用grepl
data(mtcars)
firstWay <- mtcars[grepl('6',mtcars$cyl),]
SecondWay <- mtcars[mtcars$cyl=='6',]
如果這些方法總是給出相同的結果,那麼推薦使用它們,爲什麼?謝謝
使用封裝微基準測試,我們可以看到這是更快
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
嗯,我認爲第一個區別在於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
等等。
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上有一個正則表達式的教程(很多)。
'system.time'對於像這樣的真正快速的表達式並不是很有用。根據@ CactusWoman的回答,'microbenchmark'要好得多。 –