我正在尝试将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运行速度非常慢。
是否有更有效的方法可以使用更大的表?
答案 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