2017-08-16 3 views
2

Ich habe einen Datensatz, der Lat/Long-Informationen für verschiedene Punktstandorte enthielt, und ich möchte wissen, welche Stadt und Staat mit jedem Punkt verknüpft sind.Extrahieren von Stadt- und Bundesstaatinformationen aus einer Google-Straßenadresse

Nach dieser example I verwendet, um die revgeocode Funktion von ggmap eine Adresse für jeden Ort zu erhalten, werden die Datenrahmen Herstellung unter:

df <- structure(list(PointID = c(1787L, 2805L, 3025L, 3027L, 3028L, 
3029L, 3030L, 3031L, 3033L), Latitude = c(38.36648102, 36.19548585, 
43.419774, 43.437222, 43.454722, 43.452643, 43.411949, 43.255479, 
43.261464), Longitude = c(-76.4802046, -94.21554661, -87.960399, 
-88.018333, -87.974722, -87.978542, -87.94149, -87.986433, -87.968612 
), Address = structure(c(2L, 8L, 5L, 3L, 9L, 7L, 4L, 1L, 6L), .Label = c("13004 N Thomas Dr, Mequon, WI 53097, USA", 
"2160 Turner Rd, Lusby, MD 20657, USA", "2805 County Rd Y, Saukville, WI 53080, USA", 
"3701-3739 County Hwy W, Saukville, WI 53080, USA", "3907 Echo Ln, Saukville, WI 53080, USA", 
"4823 W Bonniwell Rd, Mequon, WI 53097, USA", "5100-5260 County Rd I, Saukville, WI 53080, USA", 
"7948 W Gibbs Rd, Springdale, AR 72762, USA", "River Park Rd, Saukville, WI 53080, USA" 
), class = "factor")), row.names = c(NA, -9L), class = "data.frame", .Names = c("PointID", 
"Latitude", "Longitude", "Address")) 

Ich möchte R verwenden, um die Stadt/Zustandsinformationen von zu extrahieren, die vollständige Straße Adresse, und erstellen Sie zwei Spalten, um diese Informationen zu speichern ("City" und "State).

Ich nehme an, das stringr Paket ist der Weg zu gehen, aber ich bin mir nicht sicher, wie man geht Es ist example oben verwendet den folgenden Code t o extrahiere die Postleitzahl (in diesem Beispiel "result" genannt). Ihre Daten eingestellt:

#  ID Longitude Latitude           result 
# 1 311175 41.29844 -72.92918 16 Church Street South, New Haven, CT 06519, USA 
# 2 292058 41.93694 -87.66984 1632 West Nelson Street, Chicago, IL 60657, USA 
# 3 12979 37.58096 -77.47144 2077-2199 Seddon Way, Richmond, VA 23230, USA 

Und Code zu extrahieren, die zipcode:

library(stringr) 
data$zipcode <- substr(str_extract(data$result," [0-9]{5}, .+"),2,6) 
data[,-4] 

Ist es möglich, den obigen Code zu ändern, um die Stadt und Zustandsdaten zu bekommen?

+0

haben Sie unten viele gute Antworten erhalten. Überlegen Sie sich, ob Sie ein (Häkchen auf der linken Seite) akzeptieren, das Ihnen am meisten geholfen hat, Ihr Problem zu lösen.Dadurch weiß die Community, dass es für Sie funktioniert hat und erkennt die Hilfe der Community an – CPak

Antwort

4

Sie die Stadt und den Staat revgeocode() sich mit bekommen:

df <- cbind(df,do.call(rbind, 
       lapply(1:nrow(df), 
       function(i) 
       revgeocode(as.numeric(
       df[i,3:2]), output = "more")[c("administrative_area_level_1","locality")]))) 

df 

# PointID Latitude Longitude           Address 
# 1 1787 38.36648 -76.48020    2160 Turner Rd, Lusby, MD 20657, USA 
# 2 2805 36.19549 -94.21555  7948 W Gibbs Rd, Springdale, AR 72762, USA 
# 3 3025 43.41977 -87.96040   3907 Echo Ln, Saukville, WI 53080, USA 
# 4 3027 43.43722 -88.01833  2805 County Rd Y, Saukville, WI 53080, USA 
# 5 3028 43.45472 -87.97472   River Park Rd, Saukville, WI 53080, USA 
# 6 3029 43.45264 -87.97854 5100-5260 County Rd I, Saukville, WI 53080, USA 
# 7 3030 43.41195 -87.94149 3701-3739 County Hwy W, Saukville, WI 53080, USA 
# 8 3031 43.25548 -87.98643   13004 N Thomas Dr, Mequon, WI 53097, USA 
# 9 3033 43.26146 -87.96861  4823 W Bonniwell Rd, Mequon, WI 53097, USA 
# administrative_area_level_1 locality 
# 1     Maryland  Lusby 
# 2     Arkansas Springdale 
# 3     Wisconsin Saukville 
# 4     Wisconsin Saukville 
# 5     Wisconsin Saukville 
# 6     Wisconsin Saukville 
# 7     Wisconsin Saukville 
# 8     Wisconsin  Mequon 
# 9     Wisconsin  Mequon 

P. S. Sie können alles (einschließlich der Adresse oder/und Postleitzahl) in einem Schritt tun. Fügen Sie einfach "address" oder/und "postal_code" zu c("administrative_area_level_1","locality") hinzu. Dies ist die Liste der Variablen, die Sie extrahieren möchten.

2

1) unter Verwenden Sie sub wie folgt. Keine Pakete benötigt. Der reguläre Ausdruck entspricht dem Start (^), gefolgt von der kürzesten Zeichenkette, bis ein Komma und Leerzeichen gefolgt von der kürzesten Zeichenkette (die Stadt darstellt) bis zu einem weiteren Komma und Leerzeichen gefolgt von zwei Zeichen (repräsentiert den Status) , 5 Zeichen (die Postleitzahl darstellen), ein Komma, ein Leerzeichen, USA und Ende der Zeichenfolge. Die Übereinstimmungen mit den geklammerten Teilen können über \ 1, \ 2 und \ 3 referenziert werden, aber in Anführungszeichen \ müssen verdoppelt werden.

Wenn Ihre Postleitzahlen nicht alle 5 Ziffern sind, versuchen Sie stattdessen pat <- "^.*?, (.*?), (..) (.*), USA$".

pat <- "^.*?, (.*?), (..) (.....), USA$" 
transform(df, City = sub(pat, "\\1", Address), 
       State = sub(pat, "\\2", Address), 
       Zip = sub(pat, "\\3", Address)) 

geben:

PointID Latitude Longitude           Address  City State Zip 
1 1787 38.36648 -76.48020    2160 Turner Rd, Lusby, MD 20657, USA  Lusby MD 20657 
2 2805 36.19549 -94.21555  7948 W Gibbs Rd, Springdale, AR 72762, USA Springdale AR 72762 
3 3025 43.41977 -87.96040   3907 Echo Ln, Saukville, WI 53080, USA Saukville WI 53080 
4 3027 43.43722 -88.01833  2805 County Rd Y, Saukville, WI 53080, USA Saukville WI 53080 
5 3028 43.45472 -87.97472   River Park Rd, Saukville, WI 53080, USA Saukville WI 53080 
6 3029 43.45264 -87.97854 5100-5260 County Rd I, Saukville, WI 53080, USA Saukville WI 53080 
7 3030 43.41195 -87.94149 3701-3739 County Hwy W, Saukville, WI 53080, USA Saukville WI 53080 
8 3031 43.25548 -87.98643   13004 N Thomas Dr, Mequon, WI 53097, USA  Mequon WI 53097 
9 3033 43.26146 -87.96861  4823 W Bonniwell Rd, Mequon, WI 53097, USA  Mequon WI 53097 

2) read.pattern Eine andere Möglichkeit ist read.pattern mit dem gleichen pat wie oben:

library(gsubfn) 

cn <- c("City", "State", "Zip") 
Address <- as.character(df$Address) 
cbind(df, read.pattern(text = Address, pattern = pat, as.is = TRUE, col.names = cn)) 
2

Wenn Sie verwenden fühlen stringr, können Sie tun Sie dies:

library(stringr) 
library(data.table) 

parse_address <- function(address){ 

    address <- address %>% 
    str_split(",") %>% 
    .[[1]] 
    state <- address %>% 
    .[3] %>% 
    str_replace_all("[^A-Z]","") 

    zip <- address %>% 
    .[3] %>% 
    str_replace_all("[^0-9]","") 

    city <- address %>% 
    .[2] %>% 
    str_trim() 

    street <- address %>% 
    .[1] %>% 
    str_trim() 

    data.table(street, city, state, zip) 
} 

lapply(df$Address, parse_address) %>% 
    rbindlist 
Verwandte Themen