R中的ggmap:如何从地理编码中提取单个位置特征?

时间:2018-08-31 15:10:21

标签: r ggmap street-address

我正在尝试清理用户输入的地址,因此我认为使用GGMAP提取所使用的经度/纬度和地址将是清理所有内容的一种方式。但是,它吐出的地址有时在地址中带有口语化的名称,这使其很难解析各个位置方面。

这是我正在使用的代码

for(i in 1:nrow(Raw_Address))
   {
     result <- try(geocode(Raw_Address$Address_Total[i], output = "more", source = "google"))
     Raw_Address$lon[i] <- as.numeric(result[1])
     Raw_Address$lat[i] <- as.numeric(result[2])
     Raw_Address$geoAddress[i] <- as.character(result[3])

   }

我尝试将“ latlona”更改为“ more”,并通过结果编号,但只能返回不同的经度/纬度。在文档中没有显示结果向量的地方。

基本上,我想要街道名称,城市,州,邮政编码,经度和纬度。

编辑:这是数据示例

用户输入:1651 SE TIFFANY AVE。圣港LUCIE FL

GGMAP输出:马丁卫生系统-蒂法尼大街1651号,蒂法尼大街,圣港。露西,佛罗里达州34952,佛罗里达州

由于俗称,这很难解析。我可以使用stringr包尝试进行解析,但可能不会包含所有内容。但是它返回一个不同的地址,而某些用户拼写错误的“ Tiffany”或拼出“ Saint”而不是“ St。”。

1 个答案:

答案 0 :(得分:0)

purrr::map_dfr不会使用for循环,而是会在向量上进行迭代,并将得到的数据帧重新绑定为单个,这在这里很方便。例如,

library(tidyverse)

libraries <- tribble(
    ~library,                      ~address,
    "Library of Congress",         "101 Independence Ave SE, Washington, DC 20540",
    "British Library",             "96 Euston Rd, London NW1 2DB, UK",
    "New York Public Library",     "476 5th Ave, New York, NY 10018", 
    "Library and Archives Canada", "395 Wellington St, Ottawa, ON K1A 0N4, Canada"
)

library_locations <- map_dfr(libraries$address, ggmap::geocode, 
                             output = "more", source = "dsk")

这将输出很多消息,例如告诉您geocode在呼叫什么。

#> Information from URL : http://www.datasciencetoolkit.org/maps/api/geocode/json?address=101%20Independence%20Ave%20SE,%20Washington,%20DC%2020540&sensor=false

以及一些警告,提示因素已迫使角色:

#> Warning in bind_rows_(x, .id): Unequal factor levels: coercing to character
#> Warning in bind_rows_(x, .id): binding character and factor vector,
#> coercing into character vector

应该是的,因此您可以全部忽略它们。 (如果您真的希望,可以编写更多代码以使它们消失,但最终会遇到同样的情况。)

合并结果数据框,您将获得所有链接到原始数据集的位置数据:

full_join(libraries, library_locations)
#> Joining, by = "address"
#> # A tibble: 4 x 15
#>   library address      lon   lat type  loctype north south    east     west
#>   <chr>   <chr>      <dbl> <dbl> <chr> <chr>   <dbl> <dbl>   <dbl>    <dbl>
#> 1 Librar… 101 In…  -77.0    38.9 stre… rooftop  38.9  38.9 -77.0    -77.0  
#> 2 Britis… 96 Eus…   -0.125  51.5 stre… rooftop  51.5  51.5  -0.124   -0.126
#> 3 New Yo… 476 5t…  -74.0    40.8 stre… rooftop  40.8  40.8 -74.0    -74.0  
#> 4 Librar… 395 We… -114.     60.1 coun… approx…  83.1  41.7 -52.3   -141.   
#> # … with 5 more variables: street_number <chr>, route <chr>,
#> #   locality <chr>, administrative_area_level_1 <chr>, country <chr>

您可能会注意到,由于任何原因,Data Science Toolkit都未能对加拿大图书馆和档案馆进行地理编码,这完全是失败的-它被标记为国家/地区而不是地址。地理编码器有时会出现故障。从这里,将不需要的子集排除掉。

如果您想获得更多的信息,可以使用geocode的{​​{1}}方法,但这会返回您需要解析的列表,这需要更多的工作