首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中找到两个向量之间的匹配字符串

在R中找到两个向量之间的匹配字符串
EN

Stack Overflow用户
提问于 2016-07-14 10:07:34
回答 2查看 5.2K关注 0票数 7

我在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-Search分隔:

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,这似乎不正确。

你有什么建议吗?我的错误可能在哪里,或者我可以使用哪一个图书馆?我在寻找类似于python的"fuzzywuzzy“的R

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-14 12:13:37

简单解决方案:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2016-07-14 10:20:17

原则上,您的解决方案可以很好地处理一些虚拟数据:

代码语言:javascript
复制
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,看看它是否有效:

代码语言:javascript
复制
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"
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38371321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档