【问题标题】:Find matching strings between two vectors in R在 R 中查找两个向量之间的匹配字符串
【发布时间】:2016-07-14 10:07:34
【问题描述】:

我在 R 中有两个向量。我想找到它们之间的部分匹配。

我的数据

第一个来自名为 muc 的数据集,其中包含 6400 个街道名称。 muc$name 看起来像:

muc$name = c("Berberichweg", "Otto-Klemperer-Weg", "Feldmeierbogen" , "Altostraße",...)

另一个向量是d_vector。它包含大约 1400 个名称。

d_vector = "Abel", "Abendroth", "von Abercron", "Abetz", "Abicht", "Abromeit", ...

我想查找所有街道名称,其中包含街道名称中某处来自 d_vector 的名称。

首先,我在导入csv数据(作为变量d)后做了一些通用的修改:

d_vector <- unlist(d$name) d_vector <- as.vector(as.matrix(d_vector))

到目前为止我尝试了什么

  • 然后我尝试用 grep 找到一个解决方案,将 d_vector 变成包含一个长字符串,用 | 分隔对于 RegEx 搜索:

result <- unique(grep(paste(d_vector, collapse="|"), muc$Name, value=TRUE, ignore.case = TRUE)) result

但结果返回所有街道名称。

  • 我还尝试使用 agrep,它重新调整了 Out of memory-Error。

  • 当我尝试d_vector %in% muc$name时,它只返回了一个 TRUE 和数百个 FALSE,这似乎不太正确。

您对我的错误可能在哪里或我可以使用哪个库有什么建议吗? 我正在为 R 寻找类似 python 的“fuzzywuzzy”之类的东西

【问题讨论】:

    标签: r pattern-matching string-matching


    【解决方案1】:

    原则上,您的解决方案适用于一些虚拟数据:

    streets = c("Berberichweg", "Otto-Klemperer-Weg", "Feldmeierbogen", 
                "Konrad-Adenauer-Platz", "anotherThing")
    patterns = c("weg", "platz")
    
    unique(grep(paste(patterns, collapse="|"), streets, value=TRUE, ignore.case = TRUE))
    [1] "Berberichweg"          "Otto-Klemperer-Weg"    "Konrad-Adenauer-Platz"
    

    我认为d_vector 的某些方面不太到位。尝试检查 class(d_vector)dput(d_vector) 并将其粘贴到此处。

    您也可以尝试使用sapply 看看是否可行:

    matches =sapply(patterns, function(p) grep(p, streets, value=TRUE, ignore.case = TRUE))
    # $weg
    # [1] "Berberichweg"       "Otto-Klemperer-Weg"
    # 
    # $platz
    # [1] "Konrad-Adenauer-Platz"
    
    unique(unlist(matches))
    # [1] "Berberichweg"          "Otto-Klemperer-Weg"    "Konrad-Adenauer-Platz"
    

    【讨论】:

    • 嘿迪,谢谢你的帮助。 sapply-apply 方法返回向量中的所有 6400 个街道名称。 class(d_vector) 是字符,dput(d_vector) 将所有名称作为连接字符串返回 d_vector
    • 这是一个很好的解决方案,可以解决在作者单位等字符串中识别国家的问题。我从这里开始:stackoverflow.com/questions/5318076/…,然后使用您的解决方案,将国名向量作为参考向量。简单得多,效果也很好(约 75% 匹配)。谢谢。
    【解决方案2】:

    简单的解决方案:

    streets = c("Berberichweg", "Otto-Klemperer-Weg", "Feldmeierbogen" , "Altostraße")
    streets = tolower(streets) #Lowercase all
    names = c("Berber", "Weg")
    names = tolower(names)
    
    sapply(names, function (y) sapply(streets, function (x) grepl(y, x)))
    
    #                   berber   weg
    #berberichweg        TRUE  TRUE
    #otto-klemperer-weg  FALSE TRUE
    #feldmeierbogen      FALSE FALSE
    #altostraße          FALSE FALSE
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      相关资源
      最近更新 更多