2015-12-07 4 views
1

J'ai une trame de données dont l'adresse est l'une des colonnes, l'adresse peut parfois contenir du code ZIP/PIN et parfois non.Extraction de code postal à partir de la ligne d'adresse

Cadre des données:

BANK      ADDRESS              
ABU DHABI COMMERCIAL BANK REHMAT MANZIL, V. N. ROAD,CURCHGATE, MUMBAI - 400020  
VIJAYA BANK     BOKARO CITY JHARKHAND,15/D1 HOTEL BLUE-,DIAMOND COMPLEX,BOKARO CITY,JHARKHAND,JHARKHAND 
ALLAHABAD BANK    DANKIN GANJ DIST. MIRZAPUR - 231 001 UTTAR PRADESH 

Comment puis-je extraire uniquement le code postal/PIN avec les informations suivantes:

1. ZIP/PIN code are 6 digits (INDIAN ZIP/PIN CODE) 
2. ZIP are sometimes split by 3 digits, 560 015 
3. ZIP are sometimes separated by -, eg: 560-015 

Ci-dessous mon code actuel:

df$zip <- stri_extract_all_regex(df$ADDRESS, "(?<!\\d)\\d{6}(?!\\d)") 

Mais la le code ci-dessus ne tient pas compte des points 2 et 3 de ma logique, c'est-à-dire gérer la partition ZIP par "" ou "-"

+3

'' stri_match_last_regex' du paquet stringi' devrait marcher. – Maju116

+0

@ manju116 pourriez-vous me donner un exemple de la façon dont stri_match_last_regex est utilisé ici? –

+2

'lapply (c (« REZMAT MANZIL, VN ROUTE, CURCHGATE, MUMBAI - 400020 »,« DANKIN GANJ DIST MIRZAPUR - 231 001 UTTAR PRADESH »), fonction (x) { pâte (unlist (str_extract_all (x," [0-9] ")), collapse =" ") })' –

Répondre

0

Mais le code ci-dessus ne tient pas compte le point 2 et 3 de ma logique, qui est gérer la répartition par postal "" ou "-"

m = regexpr("\\<\\d{3}[- ]?\\d{3}\\>", df$ADDRESS) 
df$zip = substr(df$ADDRESS, m, m + attr(m, "match.length") - 1)