如何在R中的字符向量中准确检测城市名称?

vmjh9lq9  于 8个月前  发布在  其他
关注(0)|答案(1)|浏览(57)

我有一个名称的特征向量,并希望准确地识别每个元素是否包含一个城市名称。为了实现这一点,我最初使用了下面的代码:

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

然而,这段代码错误地推断出name vector中的所有元素都包含城市名称。有没有更好的方法来准确地检测R中字符向量的每个元素中的城市名称?您的见解和代码示例将不胜感激。谢谢你,谢谢!

h43kikqp

h43kikqp1#

在这种情况下,一种方法可以是利用固有的state.abb,其中包含状态缩写,并使用gsubpaste(..., collapse = "|")map的数据集us.cities$name中删除这些缩写。然后使用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

# or if you want it 1/0, add `+`:
+grepl(paste0(cities_only, collapse = "|"), name)
# [1] 1 1 0

(Note trimws修剪与此gsub关联的白色空间)

相关问题