2017-08-16 2 views
2

J'ai un ensemble de données contenant des informations lat/longues pour différents emplacements de points, et j'aimerais savoir quelle ville et quel état sont associés à chaque point.extraire des informations de ville et d'état à partir d'une adresse de rue google

suite de cette example I utilisé la fonction revgeocode de ggmap pour obtenir une adresse pour chaque emplacement, la production de la trame de données ci-dessous:

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")) 

je voudrais utiliser R pour extraire les informations ville/état de l'adresse complète, et créer deux colonnes pour stocker cette information ("Ville" et "État)

Je suppose que le paquet stringr est la voie à suivre, mais je ne suis pas sûr de savoir comment s'y prendre Le example ci-dessus a utilisé le code suivant t o extraire le code postal (nommé "result" dans cet exemple). Leurs ensemble de données:

#  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 

et le code pour extraire le code postal:

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

Est-il possible de modifier facilement le code ci-dessus pour obtenir les données de la ville et de l'État?

+0

vous avez reçu beaucoup de bonnes réponses ci-dessous. Envisager d'en accepter une (coche à gauche) qui vous a le plus aidé à résoudre votre problème.Cela permet à la communauté de savoir que cela a fonctionné pour vous et reconnaît l'aide de la communauté – CPak

Répondre

4

Vous pouvez obtenir la ville et de l'État à l'aide revgeocode() lui-même:

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 

post-scriptum Vous pouvez tout faire (y compris obtenir l'adresse et/ou le code postal) en une seule étape. Ajoutez simplement "address" ou/et "postal_code" à c("administrative_area_level_1","locality") qui est la liste des variables que vous voulez extraire.

2

1) sub Utilisez sub comme ceci. Aucun paquet requis. L'expression régulière correspond au début (^) suivi de la chaîne la plus courte jusqu'à une virgule et un espace suivis de la chaîne la plus courte (représentant la ville) jusqu'à une autre virgule et espace suivi de deux caractères (représentant l'état), un espace , 5 caractères (représentant le code postal), une virgule, un espace, USA et fin de chaîne. Les correspondances avec les parties entre parenthèses peuvent être référencées via \ 1, \ 2 et \ 3 mais entre guillemets \ doivent être doublés.

Si vos codes postaux ne contiennent pas tous les 5 chiffres, essayez plutôt pat <- "^.*?, (.*?), (..) (.*), USA$".

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

donnant:

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 Une autre possibilité est read.pattern avec le même pat comme ci-dessus:

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

Si vous avez envie d'utiliser stringr, vous pouvez faites ceci:

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