diff --git a/R/enderecopadrao.R b/R/enderecopadrao.R index 6afecac..80835d2 100644 --- a/R/enderecopadrao.R +++ b/R/enderecopadrao.R @@ -7,4 +7,16 @@ #' @keywords internal "_PACKAGE" -utils::globalVariables(c("codigos_estados", "codigos_municipios")) +utils::globalVariables( + c( + "codigos_estados", + "codigos_municipios", + "logradouro", + "numero", + "complemento", + "cep", + "bairro", + "municipio", + "estado" + ) +) diff --git a/R/padronizar_enderecos.R b/R/padronizar_enderecos.R index b72f1de..b91aada 100644 --- a/R/padronizar_enderecos.R +++ b/R/padronizar_enderecos.R @@ -13,11 +13,15 @@ #' valor `NULL` são ignorados, e ao menos um valor diferente de nulo deve ser #' fornecido. Caso deseje criar o vetor manualmente, note que seus nomes devem #' ser os mesmos nomes dos parâmetros da função `correspondencia_campos()`. +#' @param manter_cols_extras Um logical. Se colunas não especificadas em +#' `campos_do_endereco` devem ser mantidas ou não (por exemplo, uma coluna de +#' id do conjunto de dados sendo padronizado). Por padrão, `TRUE`. #' #' @return Um dataframe com os campos de endereço padronizados. #' #' @examples #' enderecos <- data.frame( +#' id = 1, #' logradouro = "r ns sra da piedade", #' nroLogradouro = 20, #' complemento = "qd 20", @@ -37,68 +41,103 @@ #' estado = "uf_dom" #' ) #' -#' enderecos_padronizados <- padronizar_enderecos(enderecos, campos) -#' enderecos_padronizados +#' padronizar_enderecos(enderecos, campos) +#' +#' padronizar_enderecos(enderecos, campos, manter_cols_extras = FALSE) #' #' @export padronizar_enderecos <- function( enderecos, - campos_do_endereco = correspondencia_campos() + campos_do_endereco = correspondencia_campos(), + manter_cols_extras = TRUE ) { checkmate::assert_data_frame(enderecos) + checkmate::assert_logical(manter_cols_extras, any.missing = FALSE, len = 1) checa_campos_do_endereco(campos_do_endereco, enderecos) - campos_presentes <- names(campos_do_endereco)[!is.null(campos_do_endereco)] + enderecos_padrao <- data.table::as.data.table(enderecos) + + campos_extras <- setdiff( + names(enderecos), + c(campos_do_endereco, names(campos_do_endereco)) + ) + campos_finais <- if (manter_cols_extras) { + c(campos_extras, names(campos_do_endereco)) + } else { + names(campos_do_endereco) + } - enderecos_padrao <- data.table::data.table() - enderecos_padrao[ - , - (names(campos_do_endereco)) := character(nrow(enderecos)) - ] + if ("logradouro" %in% campos_finais) { + enderecos_padrao[ + , + logradouro := padronizar_logradouros( + enderecos[[campos_do_endereco["logradouro"]]] + ) + ] + } - if ("logradouro" %in% campos_presentes) { - enderecos_padrao$logradouro <- padronizar_logradouros( - enderecos[[campos_do_endereco["logradouro"]]] - ) + if ("numero" %in% campos_finais) { + enderecos_padrao[ + , + numero := padronizar_numeros( + enderecos[[campos_do_endereco["numero"]]] + ) + ] } - if ("numero" %in% campos_presentes) { - enderecos_padrao$numero <- padronizar_numeros( - enderecos[[campos_do_endereco["numero"]]] - ) + if ("complemento" %in% campos_finais) { + enderecos_padrao[ + , + complemento := padronizar_complementos( + enderecos[[campos_do_endereco["complemento"]]] + ) + ] } - if ("complemento" %in% campos_presentes) { - enderecos_padrao$complemento <- padronizar_complementos( - enderecos[[campos_do_endereco["complemento"]]] - ) + if ("cep" %in% campos_finais) { + enderecos_padrao[ + , + cep := padronizar_ceps( + enderecos[[campos_do_endereco["cep"]]] + ) + ] } - if ("cep" %in% campos_presentes) { - enderecos_padrao$cep <- padronizar_ceps( - enderecos[[campos_do_endereco["cep"]]] - ) + if ("bairro" %in% campos_finais) { + enderecos_padrao[ + , + bairro := padronizar_bairros( + enderecos[[campos_do_endereco["bairro"]]] + ) + ] } - if ("bairro" %in% campos_presentes) { - enderecos_padrao$bairro <- padronizar_bairros( - enderecos[[campos_do_endereco["bairro"]]] - ) + if ("municipio" %in% campos_finais) { + enderecos_padrao[ + , + municipio := padronizar_municipios( + enderecos[[campos_do_endereco["municipio"]]] + ) + ] } - if ("municipio" %in% campos_presentes) { - enderecos_padrao$municipio <- padronizar_municipios( - enderecos[[campos_do_endereco["municipio"]]] - ) + if ("estado" %in% campos_finais) { + enderecos_padrao[ + , + estado := padronizar_estados( + enderecos[[campos_do_endereco["estado"]]] + ) + ] } - if ("estado" %in% campos_presentes) { - enderecos_padrao$estado <- padronizar_estados( - enderecos[[campos_do_endereco["estado"]]] - ) + 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) + return(enderecos_padrao[]) } checa_campos_do_endereco <- function(campos_do_endereco, enderecos) { diff --git a/man/padronizar_enderecos.Rd b/man/padronizar_enderecos.Rd index 64e4857..61e3430 100644 --- a/man/padronizar_enderecos.Rd +++ b/man/padronizar_enderecos.Rd @@ -4,7 +4,11 @@ \alias{padronizar_enderecos} \title{Padronizar endereços} \usage{ -padronizar_enderecos(enderecos, campos_do_endereco = correspondencia_campos()) +padronizar_enderecos( + enderecos, + campos_do_endereco = correspondencia_campos(), + manter_cols_extras = TRUE +) } \arguments{ \item{enderecos}{Um dataframe. Os endereços a serem padronizados. Cada uma de @@ -19,6 +23,10 @@ algumas verificações do conteúdo imputado. Argumentos dessa função com valor \code{NULL} são ignorados, e ao menos um valor diferente de nulo deve ser fornecido. Caso deseje criar o vetor manualmente, note que seus nomes devem ser os mesmos nomes dos parâmetros da função \code{correspondencia_campos()}.} + +\item{manter_cols_extras}{Um logical. Se colunas não especificadas em +\code{campos_do_endereco} devem ser mantidas ou não (por exemplo, uma coluna de +id do conjunto de dados sendo padronizado). Por padrão, \code{TRUE}.} } \value{ Um dataframe com os campos de endereço padronizados. @@ -28,6 +36,7 @@ Padroniza um dataframe contendo diversos campos de um endereço. } \examples{ enderecos <- data.frame( + id = 1, logradouro = "r ns sra da piedade", nroLogradouro = 20, complemento = "qd 20", @@ -47,7 +56,8 @@ campos <- correspondencia_campos( estado = "uf_dom" ) -enderecos_padronizados <- padronizar_enderecos(enderecos, campos) -enderecos_padronizados +padronizar_enderecos(enderecos, campos) + +padronizar_enderecos(enderecos, campos, manter_cols_extras = FALSE) } diff --git a/tests/testthat/test-padronizar_enderecos.R b/tests/testthat/test-padronizar_enderecos.R index 336ef71..5cda9cc 100644 --- a/tests/testthat/test-padronizar_enderecos.R +++ b/tests/testthat/test-padronizar_enderecos.R @@ -1,4 +1,5 @@ enderecos <- data.frame( + id = 1, logradouro = "r ns sra da piedade", numero = 20, complemento = "qd 20", @@ -17,8 +18,9 @@ tester <- function(enderecos = get("enderecos", envir = parent.frame()), bairro = "bairro", municipio = "municipio", estado = "estado" - )) { - padronizar_enderecos(enderecos, campos_do_endereco) + ), + manter_cols_extras = TRUE) { + padronizar_enderecos(enderecos, campos_do_endereco, manter_cols_extras) } test_that("da erro com inputs incorretos", { @@ -27,6 +29,10 @@ test_that("da erro com inputs incorretos", { expect_error(tester(campos_do_endereco = c(logradouro = 1))) expect_error(tester(campos_do_endereco = c(oie = "logradouro"))) expect_error(tester(campos_do_endereco = c(logradouro = "oie"))) + + expect_error(tester(manter_cols_extras = 1)) + expect_error(tester(manter_cols_extras = NA)) + expect_error(tester(manter_cols_extras = c(TRUE, TRUE))) }) test_that("retorna enderecos padronizados", { @@ -35,6 +41,7 @@ test_that("retorna enderecos padronizados", { expect_identical( tester(), data.table::data.table( + id = 1, logradouro = "RUA NOSSA SENHORA DA PIEDADE", numero = "20", complemento = "QUADRA 20", @@ -45,3 +52,17 @@ test_that("retorna enderecos padronizados", { ) ) }) + +test_that("respeita manter_cols_extras", { + # as padronizacoes em si sao testadas em outros arquivos, aqui checamos apenas + # se os valores estao de fato sendo padronizados ou nao + expect_identical( + names(tester(manter_cols_extras = TRUE)), + c("id", "logradouro", "numero", "complemento", "cep", "bairro", "municipio", "estado") + ) + + expect_identical( + names(tester(manter_cols_extras = FALSE)), + c("logradouro", "numero", "complemento", "cep", "bairro", "municipio", "estado") + ) +})