0

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

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

如果这些方法总是给出相同的结果,那么推荐哪种方法?为什么?谢谢

4

3 回答 3

3

mtcars$cyl是一个数字列,因此最好将其与使用 mtcars[mtcars$cyl == 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上有一个关于正则表达式的教程(其中之一)。

于 2015-06-13T17:33:13.927 回答
2

好吧,我认为第一个区别是grepl即使您不知道也可以使用子集,例如6,但是您可以尝试搜索以 开头或结尾的行6

如果您尝试使用普通的子集技术来执行此操作,您将有一个空对象,因为例如^6,它不被识别为正则表达式,而是被识别为带有符号^and的字符串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用低级语言编写的工具等更快。

于 2015-06-13T17:28:26.953 回答
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
于 2015-06-13T17:30:24.047 回答