Equipo de Prospectiva

codigo de limpieza

Codigo elaborado por JoseManuel Magallanes

Llamada a archivo (sucio):

LINK='https://docs.google.com/spreadsheets/d/e/2PACX-1vT0pkNmP_1DXF-g_StbBLbumnGeL0oubIgcYtV1RIlDG5ubwJdc68hHfVBk0h391_IeSoGY4ZCM4OAK/pub?gid=1519759194&single=true&output=csv'
oldies=read.csv(LINK,stringsAsFactors = F)

Primeras

head(oldies)
##   ITEM Departamento Provincia Distrito Centro.Poblado
## 1    1         LIMA      LIMA     LIMA           LIMA
## 2    4         LIMA      LIMA     LIMA           LIMA
## 3    6         LIMA      LIMA     LIMA           LIMA
## 4    7         LIMA      LIMA     LIMA           LIMA
## 5    9         LIMA      LIMA     LIMA           LIMA
## 6   11         LIMA      LIMA     LIMA           LIMA
##                                     Dirección.Priorizada
## 1        JR. CHOTA NRO. PUERTA 827 PISO.01 INTERIOR. 403
## 2 PJ. LOS ANGELES NRO. PUERTA 118 PISO.01 MZA. K LOTE.13
## 3                       JR. JUNIN NRO. PUERTA 930 PISO.1
## 4                    JR. UCHUSUMA NRO. PUERTA 191 PISO.1
## 5             JR. NICOLAS RODRIGO NRO. PUERTA 145 PISO.1
## 6        JR. ANTONIO MIROQUESADA NRO. PUERTA 1210 PISO.1
##                                                         Dirección.Alternativa
## 1                                      SIS: JR CHOTA  NRO 827 DPTO 403 PISO 4
## 2                          SIS: PSJE. PSJE LOS ANGELES 118 MZ K  CERCADO DE L
## 3                                       SIS: JR. JUNIN NRO. PUERTA 930 PISO.1
## 4            SIS: JR. UCHUSUMA NRO.191 BLOQUE. PISO.1 INTERIOR.  MZA.   LOTE.
## 5                                               SIS: CA RODRIGO, NICOLAS, 141
## 6 SIS: JR. ANTONIO MIROQUESADA NRO.1210 BLOQUE. PISO.1 INTERIOR.  MZA.  LOTE.
##   X65.107
## 1   60-65
## 2   76-80
## 3   60-65
## 4   71-75
## 5   66-70
## 6   66-70

Limpieza:

oldies$Dirección.Priorizada=gsub("PGH: ","",oldies$Dirección.Priorizada)

mejorado:

head(oldies$Dirección.Priorizada,10)
##  [1] "JR. CHOTA NRO. PUERTA 827 PISO.01 INTERIOR. 403"          
##  [2] "PJ. LOS ANGELES NRO. PUERTA 118 PISO.01 MZA. K LOTE.13"   
##  [3] "JR. JUNIN NRO. PUERTA 930 PISO.1"                         
##  [4] "JR. UCHUSUMA NRO. PUERTA 191 PISO.1"                      
##  [5] "JR. NICOLAS RODRIGO NRO. PUERTA 145 PISO.1"               
##  [6] "JR. ANTONIO MIROQUESADA NRO. PUERTA 1210 PISO.1"          
##  [7] "JR. ANCASH NRO. PUERTA 830 PISO.5 INTERIOR. 4"            
##  [8] "JR. JUNIN NRO.1446 BLOQUE. PISO.1 INTERIOR. C MZA.  LOTE."
##  [9] "JR. ANDAHUAYLAS NRO. PUERTA 775 PISO.4 INTERIOR. 412"     
## [10] "CALLE. LAS DALIAS NRO. PUERTA 1598 PISO.01"
oldies$NRO=stringr::str_extract(string = oldies$Dirección.Priorizada, 
                     pattern = "(NRO.\\d+)|(PUERTA.\\d*)")

library(stringr)
oldies$CALLE=str_split(oldies$Dirección.Priorizada,
                         pattern = 'NRO',
                         simplify = T)[,1]

oldies$NRO=stringr::str_extract(string = oldies$NRO, 
                     pattern = "\\d+")

oldies$dir=paste0(oldies$CALLE,oldies$NRO," ",oldies$Distrito," ",oldies$Provincia,' Peru')

Resultado mejorado:

head(oldies$dir,5)
## [1] "JR. CHOTA 827 LIMA LIMA Peru"          
## [2] "PJ. LOS ANGELES 118 LIMA LIMA Peru"    
## [3] "JR. JUNIN 930 LIMA LIMA Peru"          
## [4] "JR. UCHUSUMA 191 LIMA LIMA Peru"       
## [5] "JR. NICOLAS RODRIGO 145 LIMA LIMA Peru"

Mas mejores por tipo de via:

oldies$tipoCalle=str_split(oldies$dir,pattern = '. ',
                         simplify = T)[,1]
oldies=oldies[complete.cases(oldies$NRO),]
oldies$dir=gsub("JR.","Jiron",oldies$dir)
oldies$dir=gsub("CALLE.","Calle",oldies$dir)
oldies$dir=gsub("PJ.","Pasaje",oldies$dir)
oldies$dir=gsub("OTR.","",oldies$dir)
oldies$dir=gsub("OTRO.","",oldies$dir)
oldies$dir=gsub("CALL.","Calle",oldies$dir)
oldies$dir=gsub("AV.","Avenida",oldies$dir)

Resultado para geocodificacion:

head(oldies$dir,5)
## [1] "Jiron CHOTA 827 LIMA LIMA Peru"          
## [2] "Pasaje LOS ANGELES 118 LIMA LIMA Peru"   
## [3] "Jiron JUNIN 930 LIMA LIMA Peru"          
## [4] "Jiron UCHUSUMA 191 LIMA LIMA Peru"       
## [5] "Jiron NICOLAS RODRIGO 145 LIMA LIMA Peru"

Preparando funcion para geocodificar:

## geocoding function using OSM Nominatim API
## details: http://wiki.openstreetmap.org/wiki/Nominatim
## made by: D.Kisler
library(jsonlite)

nominatim_osm <- function(address = NULL)
{
  if(suppressWarnings(is.null(address)))
    return(data.frame())
  tryCatch(
    d <- jsonlite::fromJSON( 
      gsub('\\@addr\\@', gsub('\\s+', '\\%20', address), 
           'http://nominatim.openstreetmap.org/search/@addr@?format=json&addressdetails=0&limit=1')
    ), error = function(c) return(data.frame())
  )
  if(length(d) == 0) return(data.frame())
  return(data.frame(lon = as.numeric(d$lon), lat = as.numeric(d$lat)))
}

Testeando con 5 direcciones:

allD=data.frame()

for (d in oldies$dir[1:5]){
    dx=nominatim_osm(d)
    if (length(dx)==0){
    allD=rbind(allD,data.frame(lon = NA,lat = NA))
    
}else{allD=rbind(allD,data.frame(lon = as.numeric(dx$lon), 
                            lat = as.numeric(dx$lat)))}
}

Resultado parcial:

allD
##         lon       lat
## 1 -77.04063 -12.05429
## 2 -76.92610 -12.17912
## 3 -77.02213 -12.05040
## 4 -77.01349 -12.05785
## 5 -77.06925 -12.03597

Cuando se haga todo:

oldies2=cbind(oldies,allD)
oldies2=oldies2[complete.cases(oldies2$lon),]
write.csv(oldies2,"oldies2.csv",row.names = F)