我有一个名称字符向量,想要准确识别每个元素是否包含城市名称。为了实现这一点,我最初使用了下面的代码:
name <- c( "Business Applications for New York" ,"Proprietors' Farm Income in New York" ,"Farm Business (Included in Nonfinancial Corporate and Noncorporate Business Sectors); Nonresidential Structures, Current Cost Basis, Transactions")
library(maps)
city=c()
for (j in 1:length(name)) {
testresult=c()
for (i in 1:length(us.cities$name)) {
testresult[i] = agrepl(us.cities$name[i], name[j], max.distance=3, ignore.case=TRUE,fixed = T)
}
if (sum(testresult>0)) {
city[j]=1
} else{
city[j]=0 }
}
city
但是,此代码错误地得出结论:名称向量中的所有元素都包含城市名称。有没有更好的方法来准确检测 R 中字符向量的每个元素中的城市名称?您的见解和代码示例将不胜感激。谢谢!
这种情况下的一种方法可能是利用固有的
state.abb
(其中包含州缩写),并使用 map
和 us.cities$name
从 gsub
的数据集 paste(..., collapse = "|")
中删除这些缩写。然后使用 grepl
查看是否有匹配项:
cities_only <- trimws(gsub(paste(state.abb, collapse = "|"), "", us.cities$name))
# See comparison:
head(us.cities$name)
# [1] "Abilene TX" "Akron OH" "Alameda CA" "Albany GA" "Albany NY" "Albany OR"
head(cities_only)
# [1] "Abilene" "Akron" "Alameda" "Albany" "Albany" "Albany"
grepl(paste0(cities_only, collapse = "|"), name)
# [1] TRUE TRUE FALSE
(注意
trimws
修剪与此gsub
相关的空白)