在 R 中查找两个向量之间的匹配字符串
Find matching strings between two vectors in R
我在 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
但结果returns所有街道名称。
我也尝试使用 agrep,它重新调整了一个 Out of memory
-错误。
当我尝试d_vector %in% muc$name
时,它只返回一个 TRUE 和数百个 FALSE,这似乎不对。
您对我的错误可能出在哪里或我可以使用哪个库有什么建议吗?
我正在寻找类似 python 的 "fuzzywuzzy" for R[=16=]
原则上,您的解决方案适用于一些虚拟数据:
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"
简单的解决方案:
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
我在 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
但结果returns所有街道名称。
我也尝试使用 agrep,它重新调整了一个
Out of memory
-错误。当我尝试
d_vector %in% muc$name
时,它只返回一个 TRUE 和数百个 FALSE,这似乎不对。
您对我的错误可能出在哪里或我可以使用哪个库有什么建议吗? 我正在寻找类似 python 的 "fuzzywuzzy" for R[=16=]
原则上,您的解决方案适用于一些虚拟数据:
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"
简单的解决方案:
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