有效的方法做Regexp匹配模式向量

时间:2017-07-03 23:51:23

标签: r data.table

我正在尝试将data.table中的值与包含多个模式的向量进行匹配。我的演示代码是:

library(data.table)

sites <- c("www.google.com", "plus.google.com", "www.yahoo.com", "www.bbc.co.uk")
patterns <- c("bb", "goog")
x <- data.table(sites)

# Regexp version of the in operator, iterates over a group
`%match_in%` <- function (values, match_list) { 
   sapply(values,
       function (x, ml) { 
          any(sapply(ml, grepl, x, ignore.case=TRUE, perl=TRUE))
       } 
       ,match_list
)}

x[sites %match_in% patterns]

哪个正确返回:

             sites
1:  www.google.com
2: plus.google.com
3:   www.bbc.co.uk

但是因为它包含嵌套的sapply,所以使用更大的data.tables运行速度非常慢。

是否有更有效的方法可以使用更大的表?

1 个答案:

答案 0 :(得分:3)

如果您要搜索多个模式,为什么不将这些模式与or语法结合起来?正如@Marius建议的那样,如果您需要检查很多模式,可以使用paste0(patterns, collapse = "|")创建。

例如,

all_patterns = paste0(patterns, collapse = "|")

stringr::str_subset(sites, all_patterns)
[1] "www.google.com"  "plus.google.com" "www.bbc.co.uk" 

坚持使用data.table用例,也许

x[stringr::str_detect(sites, all_patterns)]
             sites
1:  www.google.com
2: plus.google.com
3:   www.bbc.co.uk