我在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))
到目前为止我尝试过的
result <- unique(grep(paste(d_vector, collapse="|"), muc$Name, value=TRUE, ignore.case = TRUE)) result
但是结果会返回所有的街道名称。
Out of memory-Error。d_vector %in% muc$name时,它只返回一个TRUE和数百个FALSE,这似乎不正确。你有什么建议吗?我的错误可能在哪里,或者我可以使用哪一个图书馆?我在寻找类似于python的"fuzzywuzzy“的R
发布于 2016-07-14 12:13:37
简单解决方案:
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发布于 2016-07-14 10:20:17
原则上,您的解决方案可以很好地处理一些虚拟数据:
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"https://stackoverflow.com/questions/38371321
复制相似问题