在变量中搜索字符串和 return 匹配的字符串

Search string in variable and return the matched string

我需要一些帮助来匹配存储在向量中的几个字符串和存储在数据框列中的地址 (data.table)。我的数据库很大,大约有 100 万条记录,因此我更喜欢使用 data.table.

下面是数据和向量的虚拟样本 -

my <- data.frame(add=c("50, nutan nagar Mum41","50, nutan Mum88 Maha","77, amar nagar Blr79 Bang","54, veer build Chennai3242","amar 755 Blr 400018"))

vec1 <- c("Mum","Blr","Chennai")

我需要使用变量 add 中的每个地址搜索 vec1 中的每个字符串。如果变量在地址中找到来自 vec1 的任何字符串,它应该 return 新列 result 中的匹配字符串。如果是多重匹配,它应该 return 第一个匹配值,即如果它在一个地址中找到 "Mum" 和 "Blr",它应该 return "Mum"。

根据虚拟数据,预期结果为 -

my$result <- c("Mum","Mum","Blr","Chennai","Blr")

我尝试使用 grep / grepl 但他们给出了错误 "argument 'pattern' has length > 1 and only the first element will be used"

我尝试使用 str_match 但对于在地址中找到的向量中的每个字符串都得到 TRUE / FALSE,而不是值本身。

我们怎样才能做到这一点?

基于 R 的可能解决方案:

vec1[sapply(as.data.frame(do.call(rbind,lapply(vec1, 
        function(x) {grepl(x,my$add)}))), function(y) {min(which(y))})]

returns:

[1] "Mum"     "Mum"     "Blr"     "Chennai" "Blr"   

希望对您有所帮助!

我们可以使用str_extract

library(stringr)
str_extract(my$add, paste(vec1, collapse="|"))
#[1] "Mum"     "Mum"     "Blr"     "Chennai" "Blr"   

或者用base R

regmatches(my$add, regexpr(paste(vec1, collapse="|"), my$add))
#[1] "Mum"     "Mum"     "Blr"     "Chennai" "Blr"