注意:我的目的与问题grep using a character vector with multiple patterns
中提到的目的不同我想在df$txt
中搜索包含在约{600}城市名称的向量locations
中的任何城市。请继续使用purrr :: map查看下面的示例以查看所需的输出。
我不想知道这些条款是否一般存在,我想知道哪些城市包含在哪些条目中。
locations <- c("paris","london","dortmund","cairo","orlando","dublin") #originally have 6000 locations
df <- data.frame(id=1:5,txt=c("orlandox",
"cologne and dortmund",
"here in cairo",
"florida",
"in paris "),
stringsAsFactors = F)
我使用这个功能:
MatchLocation <- function(txt,locs,exact=TRUE){
sapply(locs,
function(x) grep(ifelse(exact==TRUE,
paste0("\\b",x,"\\b"),
x),txt)) %>%
unlist() %>%
names()
}
我将它与purrr :: map一起使用以获得所需的结果:
> map(df$txt,~MatchLocation(.,locations))
[[1]]
NULL
[[2]]
[1] "dortmund"
[[3]]
[1] "cairo"
[[4]]
NULL
[[5]]
[1] "paris"
问题是
位置向量包含大约60000个城市,因此搜索一个条目大约需要900毫秒,而df $ txt大约需要25000个条目,因此需要数小时。
我也尝试了grep(paste(locations,collapse = "|"),df$txt, value = T)
和stringr::str_extract()
,但它并没有产生太大的影响。
任何要实现的建议都会让这更快?