R/dawa.R

Defines functions as_dkaddress add_DAWAddress get_DAWAddress

Documented in add_DAWAddress as_dkaddress get_DAWAddress

#
#   Install Package:           'Cmd + Shift + B'
#   Check Package:             'Cmd + Shift + E'
#   Test Package:              'Cmd + Shift + T'
#
#   Update documentation:       devtools::document()
#

# DAWA-dokumentation: https://dawa.aws.dk/dok/api/adresse#datavask

#' Get single address match from DAWA (Best match only)
#'
#' @param address_as_string String with full or partial address. Can be created by adviceverse::as_dkaddress().
#' @param output E.g. "all", "string"
#' @return tibble
get_DAWAddress <- function(address_as_string = NULL,
                           output = "all"){

  # TODO: Implementer et mål for hvor godt matchet er.

  # Get data from DAWA "Adressevask"

  get_url <- httr::GET(
    url = "https://dawa.aws.dk/datavask/adresser",
    query = list(betegnelse = address_as_string)
  )
  get_content <- httr::content(get_url)

  # Extract values
  # Values: Vejnavn (2), husnr. (4), etage (12), dør (13), postnr. (6)

  get_values <- get_content[[2]][[1]][[1]][c(2, 4, 12, 13, 6)]

  # "A" angiver, at den returnerede adresse matcher præcist, bortset fra forskelle på store og små bogstaver samt punktuering.
  # "B" angiver et sikkert match, hvor der dog er mindre variationer (stavefejl eller lignende).
  # "C" angiver et usikkert match, hvor der er en stor sansynlighed for at den fundne adresse ikke er korrekt.

  get_match <- get_content[1]

  # Convert NULL to NA

  get_values[sapply(get_values, is.null)] <- NA

  # Tibble (vectors as rows)
  # TODO: Tjek om det egentlig er hurtigere at definerere ny tibble end at mingelere med den gamle.

  tib <-
    get_values %>%
    dplyr::bind_rows() %>%
    dplyr::bind_cols(get_match) %>%
    dplyr::rename(doer = dør,
                  match = kategori) %>%
    dplyr::mutate(postnr = as.integer(postnr),
                  adresse = as_dkaddress(vejnavn, husnr, etage, doer, postnr)) %>%
    dplyr::rename_all(paste0, "DAWA")

  # Return

  if (output == "all") tib
    else if (output == "string") tib %>% dplyr::select(adresseDAWA)

}

#' Add address matches from DAWA to dataframe/tibble (Best match only)
#'
#' @param df Dataframe
#' @param adress_col Address column name (string)
#' @param output
#' @return Data frame
add_DAWAddress <- function(df,
                           address_col,
                           output = "all") {

  address_tib <- pbapply::pblapply(df[[address_col]], get_DAWAddress, output = output) %>%
                 dplyr::bind_rows()

  dplyr::bind_cols(df, address_tib)

}

#' Format adress
#' Return NA if "vejnavn", "husnr", or "postnr" is missing.
#'
#' @param vejnavn Address parameter, e.g. "Gammel Kongevej"
#' @param husnr Address parameter, e.g. "5E"
#' @param etage Address parameter, e.g. "4"
#' @param doer Address parameter, e.g. "th"
#' @param postnr Address parameter, e.g. "1610"
#' @return Address as string, i.e. "Gammel Kongevej 5E, 4. th., 1610"
as_dkaddress <- function(vejnavn = NA,
                       husnr = NA,
                       etage = NA,
                       doer = NA,
                       postnr = NA) {

  ifelse(
         is.na(vejnavn) | is.na(husnr) | is.na(postnr),
         NA_character_,
         paste0(vejnavn,
                " ",
                husnr,
                ",",
                ifelse(!is.na(etage), paste0(" ", etage, "."), paste0("")),
                ifelse(!is.na(doer), paste0(" ", doer, "."), paste0("")),
                ifelse(!is.na(doer) | !is.na(etage), ",", ""),
                " ",
                postnr
                )
         )

}
adviceas/adviceverse documentation built on Jan. 9, 2021, 11:58 a.m.