【问题标题】:Finding the best string match with R使用 R 找到最佳字符串匹配
【发布时间】:2014-08-26 20:29:24
【问题描述】:

从这个L Hernandez开始

来自包含以下内容的向量:

[1] "HernandezOlaf "    "HernandezLuciano " "HernandezAdrian "

我试过这个:

'subset(ABC, str_detect(ABC, "L Hernandez") == TRUE)'

包含大写字母 L 的 Hernandez 名称是所需的输出。

想要的输出是HernandezLuciano

【问题讨论】:

    标签: r string string-matching fuzzy-search


    【解决方案1】:

    如果您只想在大写 L 之后使用全名,则可以修改以下内容:

    vec1[grepl("Hernandez", vec1) & grepl("L\\.*", vec1)]
    [1] "L Hernandez"       "HernandezLuciano
    

    vec1[grepl("Hernandez", vec1) & grepl("L[[:alpha:]]", vec1)]
    [1] "HernandezLuciano "
    

    表达式在“Hernandez”上查找匹配项,然后查看是否有大写“L”后跟任何字符或空格。第二个版本需要在大写“L”后加一个字母。

    顺便说一句,您似乎无法链接 grepls。

    vec1[grepl("Hernandez", vec1) & grepl("L\\[[:alpha:]]", vec1)]
    character(0)
    

    【讨论】:

      【解决方案2】:

      您可以使用agrep 函数进行近似字符串匹配。 如果您只是运行此函数,它会匹配每个字符串...

      agrep("L Hernandez", c("HernandezOlaf ",    "HernandezLuciano ", "HernandezAdrian "))
      [1] 1 2 3
      

      但是如果你稍微修改一下 "L Hernandez" -> "Hernandez L"

      agrep("Hernandez L", c("HernandezOlaf ",    "HernandezLuciano ", "HernandezAdrian "))
      [1] 1 2 3
      

      并更改最大距离

      agrep("Hernandez L", c("HernandezOlaf ",    "HernandezLuciano ", "HernandezAdrian "),0.01)
      [1] 2
      

      你会得到正确的答案。这只是一个想法,它可能对你有用:)

      【讨论】:

        【解决方案3】:

        这可能会有所帮助:

        vec1 <- c("L Hernandez", "HernandezOlaf ","HernandezLuciano ", "HernandezAdrian ")
        grep("L ?Hernandez|Hernandez ?L",vec1,value=T)
        #[1] "L Hernandez" "HernandezLuciano "
        

        更新

        variable <- "L Hernandez"
        
        v1 <- gsub(" ", " ?", variable) #replace space with a space and question mark 
        v2 <- gsub("([[:alpha:]]+) ([[:alpha:]]+)", "\\2 ?\\1", variable) #reverse the order of words in the string and add question mark
        

        您也可以使用strsplit 来拆分variable,就像@rawr 评论的那样

        grep(paste(v1,v2, sep="|"), vec1,value=T)
        #[1] "L Hernandez"       "HernandezLuciano "
        

        【讨论】:

        • 它有效,但我从这个开始。 vec1
        猜你喜欢
        • 2016-07-01
        • 2016-08-17
        • 1970-01-01
        • 1970-01-01
        • 2020-10-12
        • 1970-01-01
        • 2020-11-11
        • 2016-12-04
        • 1970-01-01
        相关资源
        最近更新 更多