diff --git a/NAMESPACE b/NAMESPACE index c520205..d697c19 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -3,12 +3,14 @@ export(codigos_estados) export(codigos_municipios) export(correspondencia_campos) +export(correspondencia_logradouro) export(padronizar_bairros) export(padronizar_ceps) export(padronizar_complementos) export(padronizar_enderecos) export(padronizar_estados) export(padronizar_logradouros) +export(padronizar_logradouros_com_tipo) export(padronizar_municipios) export(padronizar_numeros) export(padronizar_tipos_de_logradouro) diff --git a/R/correspondencia_logradouro.R b/R/correspondencia_logradouro.R new file mode 100644 index 0000000..052af66 --- /dev/null +++ b/R/correspondencia_logradouro.R @@ -0,0 +1,35 @@ +#' Correspondência entre os campos de logradouro e tipo de logradouro e suas +#' colunas +#' +#' Cria um vetor de caracteres que especifica as colunas que representam os +#' campos de logradouro e tipo de logradouro em um dataframe. +#' +#' @param tipo_de_logradouro O nome da coluna que representa o tipo de +#' logradouro no dataframe de endereços. +#' @param logradouro O nome da coluna que representa o logradouro no dataframe +#' de endereços. +#' +#' @return Um vetor nomeado de caracteres, cujos nomes são `tipo_de_logradouro` +#' e `logradouro` e os valores as respectivas colunas que os descrevem no +#' dataframe de endereços. +#' +#' @examples +#' correspondencia_logradouro( +#' tipo_de_logradouro = "tipo_de_logradouro", +#' logradouro = "logradouro" +#' ) +#' +#' @export +correspondencia_logradouro <- function(tipo_de_logradouro, logradouro) { + col <- checkmate::makeAssertCollection() + checkmate::assert_string(tipo_de_logradouro, add = col) + checkmate::assert_string(logradouro, add = col) + checkmate::reportAssertions(col) + + vetor_correspondencia <- c( + tipo_de_logradouro = tipo_de_logradouro, + logradouro = logradouro + ) + + return(vetor_correspondencia) +} diff --git a/R/enderecopadrao.R b/R/enderecopadrao.R index 80835d2..88151ea 100644 --- a/R/enderecopadrao.R +++ b/R/enderecopadrao.R @@ -17,6 +17,8 @@ utils::globalVariables( "cep", "bairro", "municipio", - "estado" + "estado", + ".tmp_tipo_padrao", + ".tmp_log_padrao" ) ) diff --git a/R/padronizar_logradouros_com_tipo.R b/R/padronizar_logradouros_com_tipo.R new file mode 100644 index 0000000..765343c --- /dev/null +++ b/R/padronizar_logradouros_com_tipo.R @@ -0,0 +1,153 @@ +#' Padronizar logradouros e tipos de logradouro simultaneamente +#' +#' Padroniza o logradouro e seu tipo (dois campos diferentes) de forma +#' simultânea, produzindo um novo campo (`logradouro_com_tipo`) que garante a +#' consistência dos dados. +#' +#' @param enderecos Um dataframe. Os endereços a serem padronizados, deve +#' incluir uma coluna com o tipo de logradouro e outra com o logradouro em si. +#' @param campos_do_logradouro Um vetor nomeado de caracteres. A correspondência +#' entre os campos a serem padronizados (nomes do vetor) e as colunas que os +#' representam no dataframe (valores em si). a função +#' `correspondencia_logradouro()` facilita a criação deste vetor, fazendo +#' também algumas verificações do conteúdo imputado. caso deseje criar o vetor +#' manualmente, note que seus nomes devem ser `logradouros` e +#' `tipos_de_logradouro`. +#' @param manter_cols_extras Um logical. Se colunas não especificadas em +#' `campos_do_logradouro` devem ser mantidas no output ou não (por exemplo, +#' uma coluna com a informação de bairro ou de id do conjunto de dados sendo +#' padronizado). Por padrão, `TRUE`. +#' +#' @return Caso `manter_cols_extras` seja `TRUE`, o mesmo dataframe de input, +#' mas sem as colunas descrevendo o logradouro e o tipo de logradouro e com +#' uma coluna padronizada adicional `logradouro_com_tipo`. Caso +#' `manter_cols_extras` seja `FALSE`, um dataframe de apenas uma coluna, +#' `logradouro_com_tipo`. +#' +#' @examples +#' enderecos <- data.frame( +#' id = 1, +#' tipo_logradouro = "r", +#' logradouro = "ns sra da piedade", +#' nroLogradouro = 20, +#' complemento = "qd 20", +#' cep = 25220020, +#' bairro = "jd botanico", +#' codmun_dom = 3304557, +#' uf_dom = "rj" +#' ) +#' +#' campos <- correspondencia_logradouro( +#' tipo_de_logradouro = "tipo_logradouro", +#' logradouro = "logradouro" +#' ) +#' +#' padronizar_logradouros_com_tipo(enderecos, campos) +#' +#' padronizar_logradouros_com_tipo( +#' enderecos, +#' campos, +#' manter_cols_extras = FALSE +#' ) +#' +#' @export +padronizar_logradouros_com_tipo <- function( + enderecos, + campos_do_logradouro = correspondencia_logradouro(), + manter_cols_extras = TRUE +) { + checkmate::assert_data_frame(enderecos) + checkmate::assert_logical(manter_cols_extras, any.missing = FALSE, len = 1) + checa_campos_do_logradouro(campos_do_logradouro, enderecos) + + enderecos_padrao <- data.table::as.data.table(enderecos) + + campos_extras <- setdiff(names(enderecos), campos_do_logradouro) + campos_finais <- if (manter_cols_extras) { + c(campos_extras, "logradouro_com_tipo") + } else { + "logradouro_com_tipo" + } + + enderecos_padrao[ + , + .tmp_tipo_padrao := padronizar_tipos_de_logradouro( + enderecos[[campos_do_logradouro["tipo_de_logradouro"]]] + ) + ] + enderecos_padrao[ + , + .tmp_log_padrao := padronizar_logradouros( + enderecos[[campos_do_logradouro["logradouro"]]] + ) + ] + + + + campos_a_remover <- setdiff(names(enderecos), campos_finais) + enderecos_padrao[, (campos_a_remover) := NULL] + + if (manter_cols_extras) { + data.table::setcolorder(enderecos_padrao, campos_extras) + } + + return(enderecos_padrao[]) +} + +checa_campos_do_logradouro <- function(campos_do_logradouro, enderecos) { + col <- checkmate::makeAssertCollection() + checkmate::assert_character( + campos_do_logradouro, + any.missing = FALSE, + add = col + ) + checkmate::assert_names( + names(campos_do_logradouro), + type = "unique", + subset.of = c("tipo_de_logradouro", "logradouro"), + add = col + ) + checkmate::assert_names( + campos_do_logradouro, + subset.of = names(enderecos), + add = col + ) + checkmate::reportAssertions(col) + + return(invisible(TRUE)) +} + +tipos_de_logradouro_possiveis <- c( + "AREA", "ACESSO", "ACAMPAMENTO", "ACESSO LOCAL", "ADRO", "AREA ESPECIAL", + "AEROPORTO", "ALAMEDA", "AVENIDA MARGINAL DIREITA", + "AVENIDA MARGINAL ESQUERDA", "ANEL VIARIO", "ANTIGA ESTRADA", "ARTERIA", + "ALTO", "ATALHO", "AREA VERDE", "AVENIDA", "AVENIDA CONTORNO", + "AVENIDA MARGINAL", "AVENIDA VELHA", "BALNEARIO", "BECO", "BURACO", + "BELVEDERE", "BLOCO", "BALAO", "BLOCOS", "BULEVAR", "BOSQUE", "BOULEVARD", + "BAIXA", "CAIS", "CALCADA", "CAMINHO", "CANAL", "CHACARA", "CHAPADAO", + "CICLOVIA", "CIRCULAR", "CONJUNTO", "CONJUNTO MUTIRAO", "COMPLEXO VIARIO", + "COLONIA", "COMUNIDADE", "CONDOMINIO", "CORREDOR", "CAMPO", "CORREGO", + "CONTORNO", "DESCIDA", "DESVIO", "DISTRITO", "ENTRE BLOCO", + "ESTRADA INTERMUNICIPAL", "ENSEADA", "ENTRADA PARTICULAR", "ENTRE QUADRA", + "ESCADA", "ESCADARIA", "ESTRADA ESTADUAL", "ESTRADA VICINAL", + "ESTRADA DE LIGACAO", "ESTRADA MUNICIPAL", "ESPLANADA", "ESTRADA DE SERVIDAO", + "ESTRADA", "ESTRADA VELHA", "ESTRADA ANTIGA", "ESTACAO", "ESTADIO", + "ESTANCIA", "ESTRADA PARTICULAR", "ESTACIONAMENTO", "EVANGELICA", "ELEVADA", + "EIXO INDUSTRIAL", "FAVELA", "FAZENDA", "FERROVIA", "FONTE", "FEIRA", "FORTE", + "GALERIA", "GRANJA", "NUCLEO HABITACIONAL", "ILHA", "INDETERMINADO", "ILHOTA", + "JARDIM", "JARDINETE", "LADEIRA", "LAGOA", "LAGO", "LOTEAMENTO", "LARGO", + "LOTE", "MERCADO", "MARINA", "MODULO", "PROJECAO", "MORRO", "MONTE", "NUCLEO", + "NUCLEO RURAL", "OUTEIRO", "PARALELA", "PASSEIO", "PATIO", "PRACA", + "PRACA DE ESPORTES", "PARADA", "PARADOURO", "PONTA", "PRAIA", "PROLONGAMENTO", + "PARQUE MUNICIPAL", "PARQUE", "PARQUE RESIDENCIAL", "PARALELA", "PASSAGEM", + "PASSAGEM DE PEDESTRE", "PASSAGEM SUBTERRANEA", "PONTE", "PORTO", "QUADRA", + "QUINTA", "QUINTAS", "RUA", "RUA INTEGRACAO", "RUA DE LIGACAO", + "RUA PARTICULAR", "RUA VELHA", "RAMAL", "RECREIO", "RECANTO", "RETIRO", + "RESIDENCIAL", "RETA", "RUELA", "RAMPA", "RODO ANEL", "RODOVIA", "ROTULA", + "RUA DE PEDESTRE", "MARGEM", "RETORNO", "SEGUNDA AVENIDA", "SITIO", + "SERVIDAO", "SETOR", "SUBIDA", "TRINCHEIRA", "TERMINAL", "TRECHO", "TREVO", + "TUNEL", "TRAVESSA", "TRAVESSA PARTICULAR", "TRAVESSA VELHA", "UNIDADE", + "VIA", "VIA COLETORA", "VIA LOCAL", "VIA DE ACESSO", "VALA", "VIA COSTEIRA", + "VIADUTO", "VIA EXPRESSA", "VEREDA", "VIA ELEVADO", "VILA", "VIELA", "VALE", + "VIA LITORANEA", "VIA DE PEDESTRE", "VARIANTE", "ZIGUE-ZAGUE" +) diff --git a/R/padronizar_tipos_de_logradouro.R b/R/padronizar_tipos_de_logradouro.R index cfc5e0f..c6d7f65 100644 --- a/R/padronizar_tipos_de_logradouro.R +++ b/R/padronizar_tipos_de_logradouro.R @@ -106,7 +106,7 @@ padronizar_tipos_de_logradouro <- function(tipos) { r"{\bBAI\b\.?}" = "BAIXA", r"{\bBLO\b\.?}" = "BLOCO", r"{\bBOS\b\.?}" = "BOSQUE", - r"{\b(BOU|BULEVAR)\b\.?}" = "BOULEVARD", + r"{\bBOU\b\.?}" = "BOULEVARD", r"{\bBUR\b\.?}" = "BURACO", r"{\bCAI\b\.?}" = "CAIS", r"{\bCAL\b\.?}" = "CALCADA", diff --git a/_pkgdown.yml b/_pkgdown.yml index 3e18a7a..29749aa 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -1,7 +1,8 @@ reference: - - title: "Padronização de endereços" + - title: "Padronização de múltiplos campos simultaneamente" - contents: - padronizar_enderecos + - padronizar_logradouros_com_tipo - title: "Padronização de campos individuais" - contents: - padronizar_estados @@ -15,6 +16,7 @@ reference: - title: "Funções auxiliares" - contents: - correspondencia_campos + - correspondencia_logradouro - title: "Tabelas de códigos" - contents: - codigos_municipios diff --git a/man/correspondencia_logradouro.Rd b/man/correspondencia_logradouro.Rd new file mode 100644 index 0000000..5c11356 --- /dev/null +++ b/man/correspondencia_logradouro.Rd @@ -0,0 +1,32 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/correspondencia_logradouro.R +\name{correspondencia_logradouro} +\alias{correspondencia_logradouro} +\title{Correspondência entre os campos de logradouro e tipo de logradouro e suas +colunas} +\usage{ +correspondencia_logradouro(tipo_de_logradouro, logradouro) +} +\arguments{ +\item{tipo_de_logradouro}{O nome da coluna que representa o tipo de +logradouro no dataframe de endereços.} + +\item{logradouro}{O nome da coluna que representa o logradouro no dataframe +de endereços.} +} +\value{ +Um vetor nomeado de caracteres, cujos nomes são \code{tipo_de_logradouro} +e \code{logradouro} e os valores as respectivas colunas que os descrevem no +dataframe de endereços. +} +\description{ +Cria um vetor de caracteres que especifica as colunas que representam os +campos de logradouro e tipo de logradouro em um dataframe. +} +\examples{ +correspondencia_logradouro( + tipo_de_logradouro = "tipo_de_logradouro", + logradouro = "logradouro" +) + +} diff --git a/man/padronizar_logradouros_com_tipo.Rd b/man/padronizar_logradouros_com_tipo.Rd new file mode 100644 index 0000000..5922f95 --- /dev/null +++ b/man/padronizar_logradouros_com_tipo.Rd @@ -0,0 +1,68 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/padronizar_logradouros_com_tipo.R +\name{padronizar_logradouros_com_tipo} +\alias{padronizar_logradouros_com_tipo} +\title{Padronizar logradouros e tipos de logradouro simultaneamente} +\usage{ +padronizar_logradouros_com_tipo( + enderecos, + campos_do_logradouro = correspondencia_logradouro(), + manter_cols_extras = TRUE +) +} +\arguments{ +\item{enderecos}{Um dataframe. Os endereços a serem padronizados, deve +incluir uma coluna com o tipo de logradouro e outra com o logradouro em si.} + +\item{campos_do_logradouro}{Um vetor nomeado de caracteres. A correspondência +entre os campos a serem padronizados (nomes do vetor) e as colunas que os +representam no dataframe (valores em si). a função +\code{correspondencia_logradouro()} facilita a criação deste vetor, fazendo +também algumas verificações do conteúdo imputado. caso deseje criar o vetor +manualmente, note que seus nomes devem ser \code{logradouros} e +\code{tipos_de_logradouro}.} + +\item{manter_cols_extras}{Um logical. Se colunas não especificadas em +\code{campos_do_logradouro} devem ser mantidas no output ou não (por exemplo, +uma coluna com a informação de bairro ou de id do conjunto de dados sendo +padronizado). Por padrão, \code{TRUE}.} +} +\value{ +Caso \code{manter_cols_extras} seja \code{TRUE}, o mesmo dataframe de input, +mas sem as colunas descrevendo o logradouro e o tipo de logradouro e com +uma coluna padronizada adicional \code{logradouro_com_tipo}. Caso +\code{manter_cols_extras} seja \code{FALSE}, um dataframe de apenas uma coluna, +\code{logradouro_com_tipo}. +} +\description{ +Padroniza o logradouro e seu tipo (dois campos diferentes) de forma +simultânea, produzindo um novo campo (\code{logradouro_com_tipo}) que garante a +consistência dos dados. +} +\examples{ +enderecos <- data.frame( + id = 1, + tipo_logradouro = "r", + logradouro = "ns sra da piedade", + nroLogradouro = 20, + complemento = "qd 20", + cep = 25220020, + bairro = "jd botanico", + codmun_dom = 3304557, + uf_dom = "rj" +) + +campos <- correspondencia_logradouro( + tipo_de_logradouro = "tipo_logradouro", + logradouro = "logradouro" +) + +padronizar_logradouros_com_tipo(enderecos, campos) + +padronizar_logradouros_com_tipo( + enderecos, + campos, + manter_cols_extras = FALSE +) + +} diff --git a/tests/testthat/test-correspondencia_logradouro.R b/tests/testthat/test-correspondencia_logradouro.R new file mode 100644 index 0000000..a2d0239 --- /dev/null +++ b/tests/testthat/test-correspondencia_logradouro.R @@ -0,0 +1,29 @@ +tester <- function(tipo_de_logradouro = "tipo_de_logradouro", + logradouro = "logradouro") { + correspondencia_logradouro( + tipo_de_logradouro = tipo_de_logradouro, + logradouro = logradouro + ) +} + +test_that("da erro com inputs != de caracteres", { + expect_error(tester(tipo_de_logradouro = 1)) + expect_error(tester(tipo_de_logradouro = c("oi", "ola"))) + expect_error(tester(logradouro = 1)) + expect_error(tester(logradouro = c("oi", "ola"))) +}) + +test_that("retorna vetor de caracteres", { + expect_identical( + tester(), + c( + tipo_de_logradouro = "tipo_de_logradouro", + logradouro = "logradouro" + ) + ) + + expect_identical( + tester(tipo_de_logradouro = "oi", logradouro = "ola"), + c(tipo_de_logradouro = "oi", logradouro = "ola") + ) +}) diff --git a/tests/testthat/test-padronizar_tipos_de_logradouro.R b/tests/testthat/test-padronizar_tipos_de_logradouro.R index 958333d..8cebbb5 100644 --- a/tests/testthat/test-padronizar_tipos_de_logradouro.R +++ b/tests/testthat/test-padronizar_tipos_de_logradouro.R @@ -237,8 +237,6 @@ test_that("padroniza corretamente", { "BOS.", "BOSQUE", "BOU", "BOULEVARD", "BOU.", "BOULEVARD", - "BULEVAR", "BOULEVARD", - "BULEVAR.", "BOULEVARD", "BUR", "BURACO", "BUR.", "BURACO", "CAI", "CAIS",