在R中使用grepl

时间:2015-06-13 17:18:58

标签: r grepl

在哪些情况下,这两种不同的实施方式会产生不同的结果?

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

如果这些方法始终给出相同的结果,建议使用哪种方法?为什么?感谢

3 个答案:

答案 0 :(得分:3)

mtcars$cyl是一个数字列,所以最好将它与使用mtcars [mtcars $ cyl == 6,]的数字进行比较。

但是,等于运算符==grepl之间的区别在于==对于向量成员TRUE只会"6"等于greplString == 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 将匹配向量中任何位置为6的任何成员。

所以,例如:

grepl

等效fp = open('rankings.txt', 'r') 模式为“^ 6 $”。在http://www.regular-expressions.info/tutorial.html的正则表达式上有一个教程(许多之一)。

答案 1 :(得分:2)

嗯,我认为第一个区别在于grepl,即使您还不知道,也可以进行子集,例如6,但您可以尝试搜索开始或结束的行与6

如果您尝试使用普通的子集技术执行此操作,您将拥有一个空对象,因为,例如^6,不会被识别为正则表达式,而是一个符号为^的字符串, 6

我确信还有其他差异,但我相信专业用户会提供更详细的答案。

对于可能首选的人,可能有效率的原因:

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。当然,对于大数据集,我几乎不相信专业用户(或者需要速度的用户)会更喜欢这两种用户,但可能会依赖于数据表,或者用低级语言编写的dplyr这样的工具等等快。

答案 2 :(得分:1)

使用软件包microbenchmark,我们可以看到哪个更快

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搜索字符串是否存在于所有字符==检查表达式是否相等

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