使用布尔输出加快匹配固定字符串%in%/%like%的速度

比尔格

我想要一个逻辑向量,指示第二个列表中是否存在匹配项。%in%如果您需要精确匹配,可以使用运算符,但是我对任何匹配都感兴趣,因此我创建了%like%运算符:

table <- rownames(mtcars) 
table
#>  [1] "Mazda RX4"           "Mazda RX4 Wag"       "Datsun 710"         
#>  [4] "Hornet 4 Drive"      "Hornet Sportabout"   "Valiant"            
#>  [7] "Duster 360"          "Merc 240D"           "Merc 230"           
#> [10] "Merc 280"            "Merc 280C"           "Merc 450SE"         
#> [13] "Merc 450SL"          "Merc 450SLC"         "Cadillac Fleetwood" 
#> [16] "Lincoln Continental" "Chrysler Imperial"   "Fiat 128"           
#> [19] "Honda Civic"         "Toyota Corolla"      "Toyota Corona"      
#> [22] "Dodge Challenger"    "AMC Javelin"         "Camaro Z28"         
#> [25] "Pontiac Firebird"    "Fiat X1-9"           "Porsche 914-2"      
#> [28] "Lotus Europa"        "Ford Pantera L"      "Ferrari Dino"       
#> [31] "Maserati Bora"       "Volvo 142E"

x <- c('Porsche', 'Porsche 914-2', 'Porsche 911', 'Volvo')

x %in% table
#> [1] FALSE  TRUE FALSE FALSE

"%like%" <- function(x, table) sapply(x, function(x) 
  sum(grepl(pattern = x, x = table))>0, USE.NAMES = FALSE)

x %like% table
#> [1]  TRUE  TRUE FALSE  TRUE

不幸的是,%like%操作员非常慢:

library(microbenchmark)

x1 <- c('Porsche', 'Porsche 914-2', 'Porsche 911', 'Volvo')
x2 <- rep(x1, 10)
x3 <- rep(x1, 100)
table <- rownames(mtcars) 

"%like%" <- function(x, table) sapply(x, function(x) 
  sum(grepl(pattern = x, x = table))>0, USE.NAMES = FALSE)

microbenchmark(x1 %in% table, x1 %like% table, times = 1000)
#> Unit: microseconds
#>             expr    min      lq      mean  median      uq     max neval
#>    x1 %in% table  1.549  1.8635  2.248905  2.2545  2.5000   7.331  1000
#>  x1 %like% table 69.697 71.2110 73.235948 72.6555 74.0835 149.087  1000
microbenchmark(x2 %in% table, x2 %like% table, times = 1000)
#> Unit: microseconds
#>             expr     min       lq       mean   median       uq      max
#>    x2 %in% table   2.327   2.8795   3.330329   3.3055   3.6515    7.539
#>  x2 %like% table 573.005 581.0885 590.760082 584.2270 588.2580 1624.687
#>  neval
#>   1000
#>   1000
microbenchmark(x3 %in% table, x3 %like% table, times = 1000)
#> Unit: microseconds
#>             expr      min       lq       mean   median        uq       max
#>    x3 %in% table    9.195    9.950   11.79078   10.923   12.5675    36.341
#>  x3 %like% table 5612.931 5707.168 5973.83801 5737.892 5823.7875 11868.495
#>  neval
#>   1000
#>   1000

如何加速%like%操作员?

冰激凌巨嘴鸟

如果您能够接受的精确匹配,你可以使用fixed = Tgrepl加快速度

"%birger%" <- function(x, table) sapply(x, function(x) 
  sum(grepl(pattern = x, x = table))>0, USE.NAMES = FALSE)

'%birger.fixed%' <- function(x, table) sapply(x, function(x) 
  any(grepl(pattern = x, x = table, fixed = T)), USE.NAMES = FALSE)

all.equal(x %birger.fixed% table, x %birger% table)
# [1] TRUE

microbenchmark(x %birger.fixed% table, x %birger% table, times = 1000, unit = 'relative')

# Unit: relative
#                    expr      min       lq     mean   median       uq      max neval
#  x %birger.fixed% table 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000  1000
#        x %birger% table 2.059546 2.011009 1.903589 1.913446 1.857798 1.336424  1000

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用布尔掩码在熊猫DataFrame中用nan替换“任何字符串”?

如何加快熊猫申请字符串匹配

如何使用布尔搜索语法进行Java字符串匹配?

用布尔表达式分配字符串

有条件时使用匹配输出寄存器中的字符串(Ansible)

如何加快字符串与字符串列表的匹配?

用布尔AND计数行中出现的字符串

将float转换为字符串时如何加快此代码的速度?

加快“最接近”的字符串匹配算法

如何在固定字符串附近查找匹配项

SQL字符串与Like匹配

使用选择字符串匹配多个单行模式并写入输出

加快循环过滤字符串的速度

如何在模型中使用布尔值来包装数据库中的字符串值?

使用布尔键/值对将字符串转换为字典格式

如何匹配字符类中的字符串“ like”的开头?

加快匹配字符串python

熊猫:加快许多字符串搜索的速度

匹配固定字符串第2部分

获取固定长度的子字符串匹配模式

使用布尔类型与字符串类型“ true” /“ false”的优缺点是什么?

在iOS中如何使用布尔结果对正则表达式检查字符串

如何使用javascript将固定的字符串与数字匹配?

空字符串的XSLT布尔值输出true

在新方法中使用布尔结果时出错 - 需要字符串,找到布尔值

匹配字符串但只输出它下面的行+不是匹配的字符串本身

使用布尔值从用户字符串 java 输入验证

使用正则表达式和 pexpect 查找匹配字符串后存储输出

无法使用布尔值获得特定输出