代码之家  ›  专栏  ›  技术社区  ›  user1412

在变量中搜索字符串并返回匹配的字符串

  •  4
  • user1412  · 技术社区  · 7 年前

    我需要一些帮助来匹配存储在向量中的几个字符串和存储在数据帧(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 在地址中,它应该在新列中返回匹配的字符串 后果 .在多个匹配的情况下,它应该返回第一个匹配的值,即如果它在单个地址中找到“Mum”和“Blr”,它应该返回“Mum”。

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

    我尝试使用grep/grepl,但他们给出了错误“参数‘pattern’的长度大于1,并且只使用第一个元素”

    我试过使用 str_match

    2 回复  |  直到 6 年前
        1
  •  6
  •   akrun    7 年前

    我们可以使用 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"    
    
        2
  •  3
  •   Florian    7 年前

    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"   
    

    希望这有帮助!