在 R 中使用 grepl
Using grepl in R
这两种不同的实现方式在哪些情况下会产生不同的结果?
data(mtcars)
firstWay <- mtcars[grepl('6',mtcars$cyl),]
SecondWay <- mtcars[mtcars$cyl=='6',]
如果这些方法总是给出相同的结果,推荐使用哪种方法?为什么?谢谢
嗯,我认为第一个区别是使用 grepl
你可以子集,即使你还不知道,例如 6
,但你可以尝试搜索开始的行或以 6
.
结尾
如果您尝试使用正常的子集化技术来执行此操作,您将得到一个空对象,因为例如 ^6
不会被识别为正则表达式,而是被识别为带有符号 [=15= 的字符串] 和 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 K 所建议的那样,首先必须对 microbenchmark
进行进一步(和精确的)调查。当然,对于大数据集,我几乎不相信专业用户(或需要速度的用户)会更喜欢它们两者,但也许它会依赖于数据 table,或像 dplyr
这样的工具,以较低级别编写语言等多快
使用包微基准测试,我们可以看到哪个更快
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
mtcars$cyl
是一个数字列,因此您最好将它与使用 mtcars[mtcars$cyl == 6, ].
的数字进行比较
但是相等运算符 ==
和 grepl
之间的区别在于 ==
只会对等于 [=16 的向量成员 TRUE
=],而 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.
上有一个关于正则表达式的教程(其中之一)
这两种不同的实现方式在哪些情况下会产生不同的结果?
data(mtcars)
firstWay <- mtcars[grepl('6',mtcars$cyl),]
SecondWay <- mtcars[mtcars$cyl=='6',]
如果这些方法总是给出相同的结果,推荐使用哪种方法?为什么?谢谢
嗯,我认为第一个区别是使用 grepl
你可以子集,即使你还不知道,例如 6
,但你可以尝试搜索开始的行或以 6
.
如果您尝试使用正常的子集化技术来执行此操作,您将得到一个空对象,因为例如 ^6
不会被识别为正则表达式,而是被识别为带有符号 [=15= 的字符串] 和 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 K 所建议的那样,首先必须对 microbenchmark
进行进一步(和精确的)调查。当然,对于大数据集,我几乎不相信专业用户(或需要速度的用户)会更喜欢它们两者,但也许它会依赖于数据 table,或像 dplyr
这样的工具,以较低级别编写语言等多快
使用包微基准测试,我们可以看到哪个更快
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
mtcars$cyl
是一个数字列,因此您最好将它与使用 mtcars[mtcars$cyl == 6, ].
但是相等运算符 ==
和 grepl
之间的区别在于 ==
只会对等于 [=16 的向量成员 TRUE
=],而 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.