我需要一些帮助来匹配存储在向量中的少数字符串与存储在数据帧列(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")
我需要使用变量添加中的每个地址搜索 vec1 中的每个字符串。如果变量在地址中找到 vec1 中的任何字符串,则应在新列结果中返回匹配的字符串。如果多次匹配,它应该返回第一个匹配的值,即Incase它找到&#34; Mum&#34;和&#34; Blr&#34;在一个地址中,它应该返回&#34;妈妈&#34;。
根据虚拟数据,预期结果为 -
my$result <- c("Mum","Mum","Blr","Chennai","Blr")
我尝试使用grep / grepl,但是他们给出了错误&#34;参数&#39;模式&#39;长度> 1,只使用第一个元素&#34;
我尝试使用str_match
但是对于地址中找到的向量中的每个字符串都得到TRUE / FALSE,而不是值本身。
我们如何实现这一目标?
答案 0 :(得分:5)
我们可以使用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"
答案 1 :(得分:3)
基础R的可能解决方案:
vec1[sapply(as.data.frame(do.call(rbind,lapply(vec1,
function(x) {grepl(x,my$add)}))), function(y) {min(which(y))})]
返回:
[1] "Mum" "Mum" "Blr" "Chennai" "Blr"
希望这有帮助!