From 45a6834af11d5cda77fe7bd6dc9b4a5e512ac13a Mon Sep 17 00:00:00 2001 From: Cam Race <52536248+cjrace@users.noreply.github.com> Date: Mon, 16 Sep 2024 17:34:52 +0100 Subject: [PATCH] Add geography lookup data and functions (#81) * Initial code to query ONS API * WIP: add lookup data from ONS API * Working wd_pcon_lad_la file, needs tidying, documentation improvements and tests * still WIP, got mostly working but a few data issues (going to need to squash these commits!) * got fetch_ons_api batching up okay * update column order in description * add verbose toggle and general WIP * general package tidying * removed multiple years and stopped returning time cols in fetch functions * WIP: two todo's left to fix * Everything finally works! * add examples to readme, fix up pkgdown site * Initial code to query ONS API * WIP: add lookup data from ONS API * Working wd_pcon_lad_la file, needs tidying, documentation improvements and tests * still WIP, got mostly working but a few data issues (going to need to squash these commits!) * got fetch_ons_api batching up okay * update column order in description * add verbose toggle and general WIP * general package tidying * removed multiple years and stopped returning time cols in fetch functions * WIP: two todo's left to fix * Everything finally works! * add examples to readme, fix up pkgdown site * Quick refactor of the create_project() code to prevent linting issues * remove notes in contributing * tidy up wordlist * fix issue in api wrapper * code to add country information * add countries data set * add rgn, gor, ctry to shorthands * extend to join on region and country, add fetch region and ward * tidy URLs in data set sources * Increment version number to 0.5.0 * add regions * add regions into pkgdown yml * shuffle shuffle (to _utils.R and binning helper_functions.R) * typo fix in test file naming * tighten up check_fetch_location_inputs * Update countries and regions to use year variables at start of scripts * Move to 4 digit years and improve documentation * Add a section to the contributing guide about the geography data * update function comments * add internal link into contributing * add rich's error guidance * fix typo --- .Rbuildignore | 1 + .../CODE_OF_CONDUCT.md | 0 .github/CONTRIBUTING.md | 78 ++++ DESCRIPTION | 13 +- NAMESPACE | 10 + NEWS.md | 28 +- R/create_project.R | 26 +- R/datasets_documentation.R | 106 +++++ R/datasets_utils.R | 371 ++++++++++++++++++ R/dfeR-package.R | 3 + R/fetch.R | 145 +++++++ R/fetch_utils.R | 119 ++++++ R/format.R | 82 ++++ R/format_ay.R | 42 -- R/format_fy.R | 41 -- R/get_ons_api_data.R | 142 +++++++ R/pretty.R | 290 ++++++++++++++ R/pretty_filesize.R | 55 --- R/pretty_num.R | 128 ------ R/pretty_time_taken.R | 105 ----- R/toggle_message.R | 36 ++ README.Rmd | 40 +- README.md | 138 ++++++- _pkgdown.yml | 33 +- data-raw/countries.R | 42 ++ data-raw/ons_geog_shorthands.R | 19 + data-raw/regions.R | 47 +++ data-raw/wd_pcon_lad_la_rgn_ctry.R | 156 ++++++++ data/countries.rda | Bin 0 -> 324 bytes data/ons_geog_shorthands.rda | Bin 0 -> 294 bytes data/regions.rda | Bin 0 -> 374 bytes data/wd_pcon_lad_la_rgn_ctry.rda | Bin 0 -> 250639 bytes inst/WORDLIST | 30 +- man/check_fetch_location_inputs.Rd | 20 + man/countries.Rd | 30 ++ man/create_time_series_lookup.Rd | 24 ++ man/fetch.Rd | 45 +++ man/fetch_countries.Rd | 43 ++ man/fetch_lads.Rd | 51 +++ man/fetch_las.Rd | 51 +++ man/fetch_locations.Rd | 26 ++ man/fetch_regions.Rd | 43 ++ man/fetch_wards.Rd | 51 +++ man/format_ay.Rd | 6 +- man/format_ay_reverse.Rd | 6 +- man/format_fy.Rd | 6 +- man/format_fy_reverse.Rd | 6 +- man/get_lad_region.Rd | 19 + man/get_ons_api_data.Rd | 62 +++ man/get_wd_pcon_lad_la.Rd | 19 + man/ons_geog_shorthands.Rd | 31 ++ man/pretty_filesize.Rd | 6 +- man/pretty_num.Rd | 6 +- man/pretty_time_taken.Rd | 6 +- man/regions.Rd | 35 ++ man/tidy_raw_lookup.Rd | 28 ++ man/toggle_message.Rd | 38 ++ man/wd_pcon_lad_la_rgn_ctry.Rd | 64 +++ .../testthat/test-data-ons_geog_shorthands.R | 21 + tests/testthat/test-data-regions.R | 18 + .../test-data-wd_pcon_lad_la_rgn_ctry.R | 57 +++ tests/testthat/test-data_countries.R | 18 + tests/testthat/test-fetch_countries.R | 7 + tests/testthat/test-fetch_lads.R | 44 +++ tests/testthat/test-fetch_las.R | 44 +++ tests/testthat/test-fetch_pcons.R | 49 +++ tests/testthat/test-fetch_regions.R | 7 + tests/testthat/test-fetch_wards.R | 7 + 68 files changed, 2889 insertions(+), 431 deletions(-) rename CODE_OF_CONDUCT.md => .github/CODE_OF_CONDUCT.md (100%) create mode 100644 R/datasets_documentation.R create mode 100644 R/datasets_utils.R create mode 100644 R/fetch.R create mode 100644 R/fetch_utils.R create mode 100644 R/format.R delete mode 100644 R/format_ay.R delete mode 100644 R/format_fy.R create mode 100644 R/get_ons_api_data.R create mode 100644 R/pretty.R delete mode 100644 R/pretty_filesize.R delete mode 100644 R/pretty_num.R delete mode 100644 R/pretty_time_taken.R create mode 100644 R/toggle_message.R create mode 100644 data-raw/countries.R create mode 100644 data-raw/ons_geog_shorthands.R create mode 100644 data-raw/regions.R create mode 100644 data-raw/wd_pcon_lad_la_rgn_ctry.R create mode 100644 data/countries.rda create mode 100644 data/ons_geog_shorthands.rda create mode 100644 data/regions.rda create mode 100644 data/wd_pcon_lad_la_rgn_ctry.rda create mode 100644 man/check_fetch_location_inputs.Rd create mode 100644 man/countries.Rd create mode 100644 man/create_time_series_lookup.Rd create mode 100644 man/fetch.Rd create mode 100644 man/fetch_countries.Rd create mode 100644 man/fetch_lads.Rd create mode 100644 man/fetch_las.Rd create mode 100644 man/fetch_locations.Rd create mode 100644 man/fetch_regions.Rd create mode 100644 man/fetch_wards.Rd create mode 100644 man/get_lad_region.Rd create mode 100644 man/get_ons_api_data.Rd create mode 100644 man/get_wd_pcon_lad_la.Rd create mode 100644 man/ons_geog_shorthands.Rd create mode 100644 man/regions.Rd create mode 100644 man/tidy_raw_lookup.Rd create mode 100644 man/toggle_message.Rd create mode 100644 man/wd_pcon_lad_la_rgn_ctry.Rd create mode 100644 tests/testthat/test-data-ons_geog_shorthands.R create mode 100644 tests/testthat/test-data-regions.R create mode 100644 tests/testthat/test-data-wd_pcon_lad_la_rgn_ctry.R create mode 100644 tests/testthat/test-data_countries.R create mode 100644 tests/testthat/test-fetch_countries.R create mode 100644 tests/testthat/test-fetch_lads.R create mode 100644 tests/testthat/test-fetch_las.R create mode 100644 tests/testthat/test-fetch_pcons.R create mode 100644 tests/testthat/test-fetch_regions.R create mode 100644 tests/testthat/test-fetch_wards.R diff --git a/.Rbuildignore b/.Rbuildignore index e1faa92..a1d5fe5 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -8,3 +8,4 @@ ^CODE_OF_CONDUCT\.md$ ^codecov\.yml$ ^README\.Rmd$ +^data-raw$ diff --git a/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md similarity index 100% rename from CODE_OF_CONDUCT.md rename to .github/CODE_OF_CONDUCT.md diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 4190464..e718f81 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -177,6 +177,25 @@ lintr::lint_package() [styler](https://CRAN.R-project.org/package=styler) will not fix all linting issues, so we recommend using that first, then using [lintr](https://lintr.r-lib.org/articles/lintr.html) to check for places you may need to manually fix styling issues such as line length or not using snake_case. +## Folder and script structure conventions + +In an R package you are not allowed to have any sub directories in the R/ folder. Where possible we should have: + +* one script per function +or +* one script per function family if a function belongs to a family + +The script should share the name of the function or family. If needed then a _utils.R script should be used for +internal only functions that relate to a specific family. + +Documentation for all data shipped with the packages is kept in `R/datasets_documentation.R`. Scripts used for preparing +data used in the package is not in the R folder, it is in the `data-raw/` folder, helper functions for this can be found +in the `R/datasets_utils.R` folder, and more details on maintaining the data sets can be found under the [Package data](#package-data) header on this page. + +`utils.R` should be used to hold any cross-package helpers that aren't exported as functions or specific to a family. + +Every exported function or data set gets its own test script, called `test-.R` or `test-data-.R` if for a data set. + ### Testing We use [testthat](https://cran.r-project.org/package=testthat) for unit tests, we expect all new functions to have some level of test coverage. @@ -219,6 +238,65 @@ Vignettes can be found in the `vignettes/` folder as .Rmd files. To start a new usethis::use_vignette("name_of_vignette") ``` +## Package data + +Our general workflow for data in the package is: + +0. Make sure you have everything you need installed and the package is loaded with `devtools::load_all()` +1. Use the relevant script in data-raw/ to generate and save the data set +2. Document the data set in R/datasets_documentation.R +3. Update any relevant fetch_ functions that use the data if appropriate +4. Run all the usual package checks and re-documenting of the package as you would for any other update + +Our general principle is that all data should be created through reproducible code, so if it's custom data you're defining, write it in code. If you're sourcing it from elsewhere, try to make use of API connections. This saves on unnecessary data storage bloat and makes our scripts nice and reproducible without external dependencies to worry about. + +We try to keep the data-raw/ scripts as tidy as possible, so some helper functions have been created in R/datasets-utils.R. These are not exported for users of the package and are only used by scripts in the data-raw/ folder for the creation of data exported in the package. + +Sometimes when running the scripts to create new data sets you might hit this error: + +``` +Error in `check_is_package()`: +i use_data() is designed to work with packages +X Project "some letters and numbers" is not an R package. + +``` + +If you do, try restarting R, making sure you have the project open, and the package loaded using `devtools::load_all()` and then run again. + +For more details on maintaining data with an R package generally, see [chapter 7 Data, from R packages by Hadley Wickham and Jennifer Bryan](https://r-pkgs.org/data.html). + +### Geography data sets + +In the package we export a number of data sets derived from the [ONS Open Geography portal](https://geoportal.statistics.gov.uk/) for easy reuse within DfE analysis. Whenever new data appears or we want to make updates to these we need to do those manually. + +#### Source + +Where we can, we use their API to get the data, so that we have completely reproducible pipelines for this (rather than saving static files manually and then having to check if updates have been made, or having to worry about file storage). + +On the [ONS Open Geography portal](https://geoportal.statistics.gov.uk/), you will usually be looking for data published as a feature or feature layer, as these are the ones made available via the API connection. You'll be able to preview the data in the browser and do basic searching / filtering on the table if you want to visualise it. Any feature data should have an option somewhere for 'I want to use this data' (or something similar if they update their website design) where you can get to an API explorer that allows you to run a basic query in the browser. In here you can usually find the dataset_id and also the parameters you want to use to get the data you need. + +We have a `get_ons_api_data()` function that acts as a wrapper to the ONS API, it does things like converting readable parameters into a query string and also handles batching and multiple requests if needed, so you get all of the data in one nice neat data frame (there's a limit on the rows per single query for the API). + +The way ONS publish has varied over their first few years of publishing, and on top of that each data set has an individual API connection for every year of boundaries. As there's no link over time from the ONS side we have helper functions defined in R/datasets_utils.R that wrap these up into a single neat time series bundle for us. Given the likelihood of further variations, don't be too surprised if adding new years to the data sets results in errors first time around, some manual fudgery is often needed so roll up your sleeves and prepare to get elbow deep into the murky depths of the R/datasets_utils.R file! + +There is also some data we just define ourselves in code as we curate that, like custom regions we publish in DfE or our own lookup table for the shorthands used in the column names by ONS. + +#### Workflow for updating geography data + +Our general workflow for data in the package is: + +1. Add a new year into the relevant script in data-raw/ script +2. Run the script to create a new data set +3. Run all package checks to make sure the data hasn't gone all funky on you +4. Update any fetch_ functions that use the data if appropriate +5. Document any changes to the data set in R/datasets_documentation.R if appropriate + +Most data sets have tests that will fail as soon as the number of rows or columns change, this is both to provide a reliable service to users, but also to catch and remind us to maintain the documentation as the row number and all column names are defined in R/datasets_documentation.R. If these tests fail, update the relevant documentation, and then (ONLY THEN!) update the test expectations to match the new documentation. + +The fetch_ family of functions in R/fetch.R act as quick helpers that pull from the data sets we export, so users can ees-ily grab say a list of all Scottish Parliamentary Constituencies for 2024, rather than needing to pull in a whole data frame and process it. + +Often if adding a new year of data in, you will need to edit the year variables set near the start of the data-raw/ file and then also in the relevant fetch_ function @param year, as well as updating the public documentation of the data set in R/datasets_documentation.R. + ## Code of Conduct Please note that the dfeR project is released with a [Contributor Code of Conduct](CODE_OF_CONDUCT.md). By contributing to this project you agree to abide by its terms. diff --git a/DESCRIPTION b/DESCRIPTION index 1d0641f..386e2e5 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Type: Package Package: dfeR Title: Common DfE R tasks -Version: 0.4.1 +Version: 0.5.0 Authors@R: c( person("Cam", "Race", , "cameron.race@education.gov.uk", role = c("aut", "cre")), person("Laura", "Selby", , "laura.selby@education.gov.uk", role = "aut"), @@ -18,22 +18,33 @@ License: GPL (>= 3) URL: https://dfe-analytical-services.github.io/dfeR/, https://github.com/dfe-analytical-services/dfeR BugReports: https://github.com/dfe-analytical-services/dfeR/issues +Depends: + R (>= 2.10) Imports: + dplyr, emoji, + httr, + jsonlite, lifecycle, + magrittr, renv, + rlang, + tidyselect, usethis, utils, withr Suggests: knitr, + readxl, rmarkdown, spelling, + stringr, testthat (>= 3.0.0) VignetteBuilder: knitr Config/testthat/edition: 3 Encoding: UTF-8 Language: en-GB +LazyData: true Roxygen: list(markdown = TRUE) RoxygenNote: 7.3.2 diff --git a/NAMESPACE b/NAMESPACE index 7acf8b9..7bad73c 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -2,18 +2,28 @@ export(comma_sep) export(create_project) +export(fetch_countries) +export(fetch_lads) +export(fetch_las) +export(fetch_pcons) +export(fetch_regions) +export(fetch_wards) export(format_ay) export(format_ay_reverse) export(format_fy) export(format_fy_reverse) export(get_clean_sql) +export(get_ons_api_data) export(pretty_filesize) export(pretty_num) export(pretty_time_taken) export(round_five_up) +export(toggle_message) import(renv, except = run) importFrom(emoji,emoji) importFrom(lifecycle,deprecated) +importFrom(magrittr,"%>%") +importFrom(rlang,.data) importFrom(usethis,create_package) importFrom(usethis,create_project) importFrom(usethis,proj_set) diff --git a/NEWS.md b/NEWS.md index 659b081..7defa97 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,29 @@ +# dfeR 0.5.0 + +Add the following lookup data sets into the package: + +- ons_geog_shorthands +- countries +- regions +- wd_pcon_lad_la_rgn_ctry + +Add the following fetch_locations() functions: + +- fetch_wards() +- fetch_pcons() +- fetch_lads() +- fetch_las() +- fetch_regions() +- fetch_countries() + +Add wrapper for ONS Open Geography Portal API: + +- get_ons_api_data() + +Add helper for turning messages on or off: + +- toggle_message() + # dfeR 0.4.1 Update comma_sep() function to allow non-numeric values instead of throwing an error, now returns them unchanged. @@ -10,7 +36,7 @@ Add function which creates a DfE R project: # dfeR 0.3.1 -Fix bug in get_clean_sql() where using the additional settings would lose the original SQL statement +Fix bug in get_clean_sql() where using the additional settings would lose the original SQL statement. # dfeR 0.3.0 diff --git a/R/create_project.R b/R/create_project.R index 9cf1f57..96143b6 100644 --- a/R/create_project.R +++ b/R/create_project.R @@ -46,19 +46,21 @@ create_project <- function( ...) { # Function parameter checks --- # Check if the parameters are 1 length booleans - if (!is.logical(init_renv) || length(init_renv) != 1) { - stop("init_renv must be a boolean.") - } else if (!is.logical(include_structure_for_pkg) || - length(include_structure_for_pkg) != 1) { - stop("include_structure_for_pkg must be a boolean.") - } else if (!is.logical(create_publication_proj) || - length(create_publication_proj) != 1) { - stop("create_publication_proj must be a boolean.") - } else if (!is.logical(include_github_gitignore) || - length(include_github_gitignore) != 1) { - stop("include_github_gitignore must be a boolean.") - } + # List of variables to check + variables <- list( + init_renv = init_renv, + include_structure_for_pkg = include_structure_for_pkg, + create_publication_proj = create_publication_proj, + include_github_gitignore = include_github_gitignore + ) + # Loop through each variable and check if it's a boolean + for (var_name in names(variables)) { + var_value <- variables[[var_name]] + if (!is.logical(var_value) || length(var_value) != 1) { + stop(paste(var_name, "must be a boolean.")) + } + } # Project creation ----- usethis::create_project(path = path, open = FALSE) diff --git a/R/datasets_documentation.R b/R/datasets_documentation.R new file mode 100644 index 0000000..fa17502 --- /dev/null +++ b/R/datasets_documentation.R @@ -0,0 +1,106 @@ +#' Lookup for ONS geography columns shorthands +#' +#' A lookup of ONS geography shorthands and their respective column names in +#' line with DfE open data standards. +#' +#' GOR (Government Office Region) was the predecessor to RGN. +#' +#' @format ## `ons_geog_shorthands` +#' A data frame with 7 rows and 3 columns: +#' \describe{ +#' \item{ons_level_shorthands}{ONS shorthands used in their lookup files} +#' \item{name_column}{DfE names for geography name columns} +#' \item{code_column}{DfE names for geography code columns} +#' } +#' @source curated by explore.statistics@@education.gov.uk +"ons_geog_shorthands" + +#' Ward to Constituency to LAD to LA to Region to Country lookup +#' +#' A lookup showing the hierarchy of ward to Westminster parliamentary +#' constituency to local authority district to local authority to region to +#' country for years 2017, 2019, 2020, 2021, 2022, 2023 and 2024. +#' +#' Changes we've made to the original lookup: +#' 1. The original lookup from ONS uses the Upper Tier Local Authority, we then +#' update this so that where there is a metropolitan local authority we use the +#' local authority district as the local authority to match how +#' DfE publish data for local authorities. +#' +#' 2. We have noticed that in the 2017 version, the Glasgow East constituency +#' had a code of S1400030 instead of the usual S14000030, we've assumed this +#' was an error and have change this in our data so that Glasgow East is +#' S14000030 in 2017. +#' +#' 3. We have joined on regions using the Ward to LAD to County to Region file. +#' +#' 4. We have joined on countries based on the E / N / S / W at the start of +#' codes. +#' +#' 5. Scotland had no published regions in 2017, so given the rest of the years +#' have Scotland as the region, we've forced that in for 2017 too to complete +#' the data set. +#' +#' @format ## `wd_pcon_lad_la_rgn_ctry` +#' A data frame with 24,629 rows and 14 columns: +#' \describe{ +#' \item{first_available_year_included}{ +#' First year in the lookups that we see this location +#' } +#' \item{most_recent_year_included}{ +#' Last year in the lookups that we see this location +#' } +#' \item{ward_name}{Ward name} +#' \item{pcon_name}{Parliamentary constituency name} +#' \item{lad_name}{Local authority district name} +#' \item{la_name}{Local authority name} +#' \item{region_name}{Region name} +#' \item{country_code}{Country name} +#' \item{ward_code}{9 digit ward code} +#' \item{pcon_code}{9 digit westminster constituency code} +#' \item{lad_code}{9 digit local authority district code} +#' \item{new_la_code}{9 digit local authority code} +#' \item{region_code}{9 digit region code} +#' \item{country_code}{9 digit country code} +#' } +#' @source https://geoportal.statistics.gov.uk/search?tags=lup_wd_pcon_lad_utla +#' and https://geoportal.statistics.gov.uk/search?q=lup_wd_lad_cty_rgn_gor_ctry +"wd_pcon_lad_la_rgn_ctry" + +#' Lookup for valid country names and codes +#' +#' A lookup of ONS geography country names and codes, as well as some custom +#' DfE names and codes. This is used as the definitive list for the screening +#' of open data before it is published by the DfE. +#' +#' @format ## `countries` +#' A data frame with 10 rows and 2 columns: +#' \describe{ +#' \item{country_name}{Country name} +#' \item{country_code}{Country code} +#' } +#' @source curated by explore.statistics@@education.gov.uk, ONS codes sourced +#' from +#' https://geoportal.statistics.gov.uk/search?q=countries%20names%20and%20codes +"countries" + +#' Lookup for valid region names and codes +#' +#' A lookup of ONS geography region names and codes for England. In their +#' lookups Northern Ireland, Scotland and Wales are regions. +#' +#' Also included inner and outer London county split as DfE frequently publish +#' those as regions, as well as some custom DfE names and codes. This is used +#' as the definitive list for the screening of open data before it is published +#' by the DfE. +#' +#' @format ## `regions` +#' A data frame with 16 rows and 2 columns: +#' \describe{ +#' \item{region_name}{Region name} +#' \item{region_code}{Region code} +#' } +#' @source curated by explore.statistics@@education.gov.uk, ONS codes sourced +#' from +#' https://geoportal.statistics.gov.uk/search?q=NAC_RGN +"regions" diff --git a/R/datasets_utils.R b/R/datasets_utils.R new file mode 100644 index 0000000..20dded5 --- /dev/null +++ b/R/datasets_utils.R @@ -0,0 +1,371 @@ +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# INTERNAL ONLY FUNCTIONS ##################################################### +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# These functions are only used by the scripts in data-raw/, but are kept here +# in order to keep those scripts cleaner and easier to use. To update any of +# the data used in this app, refer to the scripts kept in data-raw/. +# +# For more information on updating the geography data in the package see the +# 'Maintaining geography data' section of the .github/CONTRIBUTING.md file. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +#' Tidy a lookup file from the Open Geography Portal +#' +#' Takes a file from the open geography portal and tidies it ready for +#' appending to an existing lookup +#' +#' @param raw_lookup_file data.frame of a lookup file downloaded from Open +#' Geography Portal, e.g. the output of `get_ons_api_data()`, or any other +#' data frame from R memory +#' +#' @keywords internal +#' @return a data frame of a tidied lookup file +tidy_raw_lookup <- function(raw_lookup_file) { + if (!is.data.frame(raw_lookup_file)) { + stop("raw_lookup_file must be a data frame") + } + + # Tidy out the attributes. col prefix --------------------------------------- + colnames(raw_lookup_file) <- sub( + "^attributes\\.", "", colnames(raw_lookup_file) + ) + + # Extract the year from columns --------------------------------------------- + # Remove all non-digits from column names + new_year <- unique(gsub("[^0-9]", "", names(raw_lookup_file))) + + # Check there is only one year available ------------------------------------ + if (length(new_year) != 1) { + stop( + paste0( + "There appears to be either zero or multiple years of data in the ", + "selected lookup, the function doesn't know which year to pick" + ) + ) + } + + #' Function to rename columns using the dfeR::ons_geog_shorthands table + #' + #' col_name single column name to be updated based on the shorthand + #' lookup table + #' + #' @return string for new column name if a match was found, if no match found + #' then the original name is returned + generate_new_name <- function(col_name) { + # Take the prefix and check it exists + prefix <- stringr::str_extract(col_name, "^[A-Z]*") + if (prefix %in% dfeR::ons_geog_shorthands$ons_level_shorthands) { + # Take the suffix + suffix <- stringr::str_sub(col_name, start = -2, end = -1) + + # Replace with either the name or code column as appropriate + if (suffix == "NM") { + new_name <- dfeR::ons_geog_shorthands[ + dfeR::ons_geog_shorthands$ons_level_shorthands == prefix, + ]$name_column + } else { + new_name <- dfeR::ons_geog_shorthands[ + dfeR::ons_geog_shorthands$ons_level_shorthands == prefix, + ]$code_column + } + + message("Renaming ", col_name, " to ", new_name) + return(new_name) # Return replaced name + } else { + message("No match found for ", col_name, ", returning original name") + return(col_name) # Keep original name if no match + } + } + + # Apply the function to rename columns + names(raw_lookup_file) <- unlist( + lapply(names(raw_lookup_file), generate_new_name) + ) + + # Add columns showing years for the codes + lookup_with_time <- raw_lookup_file %>% + dplyr::distinct() %>% + dplyr::mutate( + first_available_year_included = paste0("20", new_year), + most_recent_year_included = paste0("20", new_year) + ) + + # Extra tidy up for separating LAs / LADs + # This bit is to deal with LAs and UTLAs not being quite the same thing. + # The parent UTLA for LADs in metropolitan counties (E11, e.g. Manchester), + # and Inner or Outer London (E13) are the Metropolitan counties + # and Inner / Outer London. + # But in these cases, the LA for our purposes is the LAD itself. + + # So this is using the LAD as it's own parent LA if it's in a metropolitan + # county or in London and taking the UTLA otherwise. + + # For example, Barnsley is a metropolitan borough of South Yorkshire + # South Yorkshire is the UTLA, but we use Barnsley as the LA and LAD + + lookup_met_la <- lookup_with_time + + if ("new_la_code" %in% names(raw_lookup_file)) { + met_swap <- grepl("E11", lookup_met_la$new_la_code) | + grepl("E13", lookup_met_la$new_la_code) + + # Update la_name and new_la_code based on the conditions + lookup_met_la$la_name[met_swap] <- lookup_met_la$lad_name[met_swap] + lookup_met_la$new_la_code[met_swap] <- lookup_met_la$lad_code[met_swap] + } + + # Strip out excess white space from name columns + tidied_lookup <- lookup_met_la %>% + dplyr::mutate( + dplyr::across( + tidyselect::ends_with("_name"), + ~ stringr::str_replace_all(.x, "\\s+", " ") + ) + ) %>% + # Also strip out leading and trailing whitespace for belts and braces + dplyr::mutate(dplyr::across(dplyr::everything(), ~ stringr::str_trim(.x))) + + return(tidied_lookup) +} + +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +#' Smush lookups together to make a time series +#' +#' Take a list of tidied files, likely produced by the tidy_raw_lookup +#' function append together +#' +#' Updates the `first_available_year_included` and `most_recent_year_included` +#' columns so that they are accurate for the full ser-EES +#' +#' @keywords internal +#' @param lookups_list list of data frames of new lookup table, +#' usually the output of tidy_raw_lookup +#' +#' @return single data.frame of all lookup files combined +create_time_series_lookup <- function(lookups_list) { + # Input validation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + # Added some quick checks based on the assumptions we make in this function + # Hoping this will prevent rogue error messages taking up lots of time in + # future + + # Check if the new_lookups list contains only data frames + all_are_data_frames <- all(sapply(lookups_list, is.data.frame)) + + if (all_are_data_frames) { + # Get the column names for the first data frame (if it exists) + if (length(lookups_list) > 0) { + reference_cols <- colnames(lookups_list[[1]]) + + # Compare column names across all data frames + all_same_cols <- all( + sapply( + lookups_list, + function(df) identical(sort(colnames(df)), sort(reference_cols)) + ) + ) + + if (all_same_cols) { + # Nothing to see here + } else { + stop("data frames within the list have different column names.") + } + } else { + stop("the new_lookups list is empty") + } + } else { + stop("the new_lookups list contains items that are not data frames") + } + # End of input validation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + # Get the column names from the first data set as we know they all share the + # same cols, these are used to aggregate by when working out the years + # + # Drop the time cols so we only join on the geography cols + join_cols <- setdiff( + names(lookups_list[[1]]), + c("first_available_year_included", "most_recent_year_included") + ) + + # Start with the first data frame in the list + lookup <- lookups_list[[1]] + + # Append every other lookup in the list, starting with the second data frame + for (lookup_number in 2:length(lookups_list)) { + lookup <- lookup %>% + # Stack the next data frame on + rbind(lookups_list[[lookup_number]]) %>% + # Then condense the rows, rewriting the first and last years for each row + dplyr::summarise( + "first_available_year_included" = + min(.data$first_available_year_included), + "most_recent_year_included" = + max(.data$most_recent_year_included), + .by = dplyr::all_of(join_cols) + ) + } + + # Final tidy up of the output file ========================================== + # Pull out code columns + code_cols <- names(lookup %>% dplyr::select(tidyselect::ends_with("_code"))) + + # Order the file by year and then code columns + sorted_lookup <- lookup %>% + dplyr::mutate( + "first_available_year_included" = as.integer( + .data$first_available_year_included + ), + "most_recent_year_included" = as.integer( + .data$most_recent_year_included + ) + ) %>% + dplyr::arrange(dplyr::desc("most_recent_year_included"), !!!code_cols) + + return(sorted_lookup) +} + +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +#' Get Ward-PCon-LAD-LA data +#' +#' Helper function to extract data from the Ward-PCon-LAD-UTLA file +#' +#' @param year last two digits of the year of the lookup, available years are: +#' 2017, 2019, 2020, 2021, 2022, 2023, 2024 +#' +#' @return data.frame for the individual year of the lookup +#' +#' @keywords internal +get_wd_pcon_lad_la <- function(year) { + # Crude way to grab 2 digits, works for anything that isn't in the noughties + year_end <- year %% 100 + + # Adjusting to the varying ids that ONS have used ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + # If there's any issues with these, double check the queries match up + # Use the ONS query explorer on each file to check this + # https://geoportal.statistics.gov.uk/search?tags=lup_wd_pcon_lad_utla + id_end <- dplyr::case_when( + year_end == 23 ~ "_UK_LU_v1", + year_end == 20 ~ "_UK_LU_v2_d8cbab26914f4dc1980250dbca6409d4", + year_end == 17 ~ "_UK_LU_7d674672d1be40fdb94f4f26527a937a", + .default = "_UK_LU" + ) + + # Specify the columns we want ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + levels <- c("WD", "PCON", "LAD", "UTLA") + cols <- c("CD", "NM") + field_names <- paste( + as.vector(outer(paste0(levels, year_end), cols, paste0)), + collapse = "," + ) + + # Main API call ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if (year_end == 21) { + # 2021 was only published as an excel file + # Get the URL by right clicking to get the link on their download button + download_21_url <- paste0( + "https://www.arcgis.com/sharing/rest/content/items/", + "d097a503aa2c4ad8a86263e1b094b6b2/data" + ) + + local_file <- tempfile(fileext = ".xlsx") + utils::download.file( + download_21_url, + destfile = local_file, + mode = "wb", + quiet = TRUE + ) + output <- as.data.frame(readxl::read_excel(path = local_file)) + } else { + output <- get_ons_api_data( + data_id = paste0( + "WD", year_end, "_PCON", year_end, "_LAD", year_end, + "_UTLA", year_end, id_end + ), + query_params = list( + where = "1=1", outFields = field_names, + outSR = "4326", f = "json" + ) + ) + } + + # Tidy up the output file (defined earlier in this script) + tidy_output <- tidy_raw_lookup(output) + + return(tidy_output) +} + +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +#' Get LAD to Region lookup +#' +#' Helper function to extract data from the Ward-LAD-Region-County-Country file +#' +#' @param year last two digits of the year of the lookup, available years are: +#' 2017, 2018, 2019, 2020, 2022, 2023 +#' +#' @return data.frame for the individual year of the lookup +#' +#' @keywords internal +get_lad_region <- function(year) { + # Crude way to grab 2 digits, works for anything that isn't in the noughties + year_end <- year %% 100 + + # Adjusting to the varying ids that ONS have used ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + # If there's any issues with these, double check the queries match up + # Use the ONS query explorer on each file to check this + # https://geoportal.statistics.gov.uk/search?tags=LUP_WD_LAD_CTY_RGN_GOR_CTRY + id_end <- dplyr::case_when( + year_end == 20 ~ "_OTH_UK_LU_v2_27715a77546b4b5a9746baf703dd9a05", + year_end == 19 ~ "_OTH_UK_LU_89ea1f028be347e7a44d71743c96b60d", + year_end == 18 ~ "_OTH_UK_LU_971f977f4a444d09842fcfbfd51f8982", + year_end == 17 ~ "_OTH_UK_LUv2_c8956eca906348fd9e3bb1f6af54f2ce", + .default = "_OTH_UK_LU" + ) + + # Specify the columns we want ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + levels <- c("LAD", "RGN") + cols <- c("CD", "NM") + + # In their first two years ONS used GOR10NM / CD for regions... + if (year_end %in% c(17, 18)) { + field_names <- paste( + c( + paste0("LAD", year_end, "CD"), "GOR10CD", + paste0("LAD", year_end, "NM"), "GOR10NM" + ), + collapse = "," + ) + } else { + field_names <- paste( + as.vector(outer(paste0(levels, year_end), cols, paste0)), + collapse = "," + ) + } + + # Main API call ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + output <- get_ons_api_data( + data_id = paste0( + "WD", year_end, "_LAD", year_end, "_CTY", year_end, id_end + ), + query_params = list( + where = "1=1", outFields = field_names, + outSR = "4326", f = "json" + ) + ) + + # Rename the GOR10 cols for earlier years + if (year_end %in% c(17, 18)) { + output <- output %>% + dplyr::rename_with( + ~ ifelse(. == "attributes.GOR10NM", paste0("RGN", year_end, "NM"), .), + "attributes.GOR10NM" + ) %>% + dplyr::rename_with( + ~ ifelse(. == "attributes.GOR10CD", paste0("RGN", year_end, "CD"), .), + "attributes.GOR10CD" + ) + } + + # Tidy up the output file (defined earlier in this script) + tidy_output <- tidy_raw_lookup(output) + + return(tidy_output) +} diff --git a/R/dfeR-package.R b/R/dfeR-package.R index 425b3c1..157dcbc 100644 --- a/R/dfeR-package.R +++ b/R/dfeR-package.R @@ -4,4 +4,7 @@ ## usethis namespace: start #' @importFrom lifecycle deprecated ## usethis namespace: end + +#' @importFrom rlang .data +#' @importFrom magrittr %>% NULL diff --git a/R/fetch.R b/R/fetch.R new file mode 100644 index 0000000..5315744 --- /dev/null +++ b/R/fetch.R @@ -0,0 +1,145 @@ +#' Fetch Westminster parliamentary constituencies +#' +#' Fetch a data frame of all Westminster Parliamentary Constituencies for a +#' given year and country based on the dfeR::wd_pcon_lad_la_rgn_ctry file +#' +#' @param year year to filter the locations to, default is "All", +#' options of 2017, 2019, 2020, 2021, 2022", 2023, 2024 +#' @param countries vector of desired countries to filter the locations to, +#' default is "All", or can be a vector with options of "England", "Scotland", +#' "Wales" or "Northern Ireland" +#' +#' @return data frame of unique location names and codes +#' @export +#' +#' @name fetch +#' @examples +#' +#' # Using head() to show only top 5 rows for examples +#' head(fetch_wards()) +#' +#' head(fetch_pcons()) +#' +#' head(fetch_pcons(2023)) +#' +#' head(fetch_pcons(countries = "Scotland")) +#' +#' head(fetch_pcons(year = 2023, countries = c("England", "Wales"))) +#' +#' fetch_lads(2024, "Wales") +#' +#' fetch_las(2022, "Northern Ireland") +#' +#' # The following have no specific years available and return all values +#' fetch_regions() +#' fetch_countries() +fetch_pcons <- function(year = "All", countries = "All") { + # Helper function to check the inputs are valid + check_fetch_location_inputs(year, countries) + + # Helper function to filter to locations we want + output <- fetch_locations( + lookup_data = dfeR::wd_pcon_lad_la_rgn_ctry, + cols = c("pcon_code", "pcon_name"), + year = year, + countries = countries + ) + + return(output) +} + +#' Fetch local authority districts +#' +#' @inheritParams fetch +#' +#' @family fetch_locations +#' @return data frame of unique location names and codes +#' @export +#' +#' @inherit fetch examples +fetch_lads <- function(year = "All", countries = "All") { + # Helper function to check the inputs are valid + check_fetch_location_inputs(year, countries) + + # Helper function to filter to locations we want + output <- fetch_locations( + lookup_data = dfeR::wd_pcon_lad_la_rgn_ctry, + cols = c("lad_code", "lad_name"), + year = year, + countries = countries + ) + + return(output) +} + +#' Fetch local authorities +#' +#' @inheritParams fetch +#' +#' @family fetch_locations +#' @return data frame of unique location names and codes +#' @export +#' +#' @inherit fetch examples +fetch_las <- function(year = "All", countries = "All") { + # Helper function to check the inputs are valid + check_fetch_location_inputs(year, countries) + + # Helper function to filter to locations we want + output <- fetch_locations( + lookup_data = dfeR::wd_pcon_lad_la_rgn_ctry, + cols = c("new_la_code", "la_name"), + year = year, + countries = countries + ) + + return(output) +} + +#' Fetch wards +#' +#' @inheritParams fetch +#' +#' @family fetch_locations +#' @return data frame of unique location names and codes +#' @export +#' +#' @inherit fetch examples +fetch_wards <- function(year = "All", countries = "All") { + # Helper function to check the inputs are valid + check_fetch_location_inputs(year, countries) + + # Helper function to filter to locations we want + output <- fetch_locations( + lookup_data = dfeR::wd_pcon_lad_la_rgn_ctry, + cols = c("ward_code", "ward_name"), + year = year, + countries = countries + ) + + return(output) +} + + +#' Fetch regions +#' +#' @family fetch_locations +#' @return data frame of unique location names and codes +#' @export +#' +#' @inherit fetch examples +fetch_regions <- function() { + dfeR::regions +} + + +#' Fetch countries +#' +#' @family fetch_locations +#' @return data frame of unique location names and codes +#' @export +#' +#' @inherit fetch examples +fetch_countries <- function() { + dfeR::countries +} diff --git a/R/fetch_utils.R b/R/fetch_utils.R new file mode 100644 index 0000000..480e4c7 --- /dev/null +++ b/R/fetch_utils.R @@ -0,0 +1,119 @@ +#' Validation for fetch location lookups +#' +#' @param year_input the value of the years input +#' @param country_input the value of the countries input +#' +#' @return nothing, unless a failure, and then it will give an error +#' @keywords internal +check_fetch_location_inputs <- function(year_input, country_input) { + if (year_input != "All") { + if (!grepl("^\\d{4}$", as.character(year_input))) { + stop( + "year must either be 'All', or a valid 4 digit year e.g. '2024'" + ) + } + } + + allowed_countries <- c("England", "Scotland", "Wales", "Northern Ireland") + + if (paste0(country_input, collapse = "") != "All") { + if (!all(country_input %in% allowed_countries)) { + stop(paste0( + "countries must either be 'All', or a vector of valid country names ", + "from: England, Scotland, Wales, or Northern Ireland" + )) + } + } +} + +#' Fetch locations for a given lookup +#' +#' Helper function for the fetch_xxx() functions to save repeating code +#' +#' @param lookup_data lookup data to use to extract locations from +#' @param cols columns to extract from the main lookup table +#' @param year year of locations to extract, "All" will skip any filtering and +#' return all possible locations +#' @param countries countries for locations to be take from, "All" will skip +#' any filtering and return all +#' +#' @return a data frame of location names and codes +#' @keywords internal +fetch_locations <- function(lookup_data, cols, year, countries) { + # Return only the cols we specified + # We know their position from the dplyr selection of the lookup + # This is used wherever this function returns an output + cols_to_return <- seq_along(cols) + + # Pull in main lookup data + lookup <- dplyr::select( + lookup_data, + dplyr::all_of( + c(cols, "first_available_year_included", "most_recent_year_included") + ) + ) + + # Resummarise the years to each unique location + resummarised_lookup <- lookup %>% + dplyr::summarise( + "first_available_year_included" = + min(.data$first_available_year_included), + "most_recent_year_included" = + max(.data$most_recent_year_included), + .by = dplyr::all_of(cols) + ) + + # Return early without filtering if defaults are used + if (all(year == "All", countries == "All")) { + return(dplyr::distinct(resummarised_lookup[, cols_to_return])) + } + + # Filter based on year selection if specified + if (year != "All") { + # Flag the rows that are in the year asked for + resummarised_lookup <- resummarised_lookup %>% + dplyr::mutate("in_specified_year" = ifelse( + as.numeric(.data$most_recent_year_included) >= year & + as.numeric(.data$first_available_year_included) <= year, + TRUE, + FALSE + )) + + # Filter to only those locations + resummarised_lookup <- with( + resummarised_lookup, + subset(resummarised_lookup, in_specified_year == TRUE) + ) %>% + dplyr::select(-c("in_specified_year")) # remove temp column + } + + # Filter based on country selcetion if specified + if (paste0(countries, collapse = "") != "All") { + # Get the code column + # Take new_la_code if present (as sometimes there may also be old_la code) + # Otherwise work it out + if ("new_la_code" %in% cols) { + code_col <- "new_la_code" + } else { + code_col <- grep("_code$", cols, value = TRUE) + } + + if (length(code_col) != 1) { + stop( + "More than one code column found, there must only be one code column" + ) + } + + # Filter every value to its first letter as that matches the ONS code + # then filter the data set to only have codes from the selected countries + resummarised_lookup <- resummarised_lookup %>% + dplyr::filter( + grepl( + paste0("^", unique(substr(countries, 1, 1)), collapse = "|"), + !!rlang::sym(code_col) + ) + ) + } + + return(dplyr::distinct(resummarised_lookup[, cols_to_return])) +} diff --git a/R/format.R b/R/format.R new file mode 100644 index 0000000..21815f0 --- /dev/null +++ b/R/format.R @@ -0,0 +1,82 @@ +#' Format academic year +#' +#' This function formats academic year variables for reporting purposes. It +#' will convert an academic year input from 201516 format to 2015/16 format. +#' +#' It accepts both numerical and character arguments. +#' +#' @param year Academic year +#' @return Character vector of formatted academic year +#' @family format +#' @export +#' @examples +#' format_ay(201617) +#' format_ay("201617") +format_ay <- function(year) { + if (!grepl("^[0-9]{6,6}$", year)) { + stop("year parameter must be a six digit number or string e.g. 201617") + } + sub("(.{4})(.*)", "\\1/\\2", year) +} + +#' Undo academic year formatting +#' +#' This function converts academic year variables back into 201617 format. +#' +#' It accepts character arguments. +#' +#' @param year Academic year +#' @return Unformatted 6 digit year as string +#' @family format +#' @export +#' @examples +#' format_ay_reverse("2016/17") +format_ay_reverse <- function(year) { + if (!grepl("^\\d{4}/\\d{2}.*", year)) { + stop("year parameter must be a seven digit string in an academic + year format, e.g. '2016/17'") + } + gsub("/", "", year) +} + +#' Format financial year +#' +#' This function formats financial year variables for reporting purposes. It +#' will convert an year input from 201516 format to 2015-16 format. +#' +#' It accepts both numerical and character arguments. +#' +#' @param year Financial year +#' @return Character vector of formatted financial year +#' @family format +#' @export +#' @examples +#' format_fy(201617) +#' format_fy("201617") +format_fy <- function(year) { + if (!grepl("^[0-9]{6,6}$", year)) { + stop("year parameter must be a six digit number or string e.g. 201617") + } + sub("(.{4})(.*)", "\\1-\\2", year) +} + +#' Undo financial year formatting +#' +#' This function converts financial year variables back into 201617 format. +#' +#' It accepts character arguments. +#' +#' @param year Financial year +#' @return Unformatted 6 digit year as string +#' @family format +#' @export +#' @examples +#' format_fy_reverse("2016-17") +# function to reverse the change back to e.g. 201617 +format_fy_reverse <- function(year) { + if (!grepl("^\\d{4}-\\d{2}.*", year)) { + stop("year parameter must be a seven digit string in a financial + year format, e.g. '2016-17'") + } + gsub("[^0-9A-Za-z///' ]", "", year) +} diff --git a/R/format_ay.R b/R/format_ay.R deleted file mode 100644 index 7c3432b..0000000 --- a/R/format_ay.R +++ /dev/null @@ -1,42 +0,0 @@ -#' Format academic year -#' -#' This function formats academic year variables for reporting purposes. It -#' will convert an academic year input from 201516 format to 2015/16 format. -#' -#' It accepts both numerical and character arguments. -#' -#' @param year Academic year -#' @return Character vector of formatted academic year -#' @family formatting functions -#' @export -#' @examples -#' format_ay(201617) -#' format_ay("201617") -format_ay <- function(year) { - if (!grepl("^[0-9]{6,6}$", year)) { - stop("year parameter must be a six digit number or string e.g. 201617") - } - sub("(.{4})(.*)", "\\1/\\2", year) -} - -#' Undo academic year formatting -#' -#' This function converts academic year variables back into 201617 format. -#' -#' It accepts character arguments. -#' -#' @param year Academic year -#' @return Unformatted 6 digit year as string -#' @family formatting functions -#' @export -#' @examples -#' format_ay_reverse("2016/17") -format_ay_reverse <- function(year) { - if (!grepl("^\\d{4}/\\d{2}.*", year)) { - stop("year parameter must be a seven digit string in an academic - year format, e.g. '2016/17'") - } - gsub("/", "", year) -} - -format_ay_reverse("2016/17") diff --git a/R/format_fy.R b/R/format_fy.R deleted file mode 100644 index 01a91bc..0000000 --- a/R/format_fy.R +++ /dev/null @@ -1,41 +0,0 @@ -#' Format financial year -#' -#' This function formats financial year variables for reporting purposes. It -#' will convert an year input from 201516 format to 2015-16 format. -#' -#' It accepts both numerical and character arguments. -#' -#' @param year Financial year -#' @return Character vector of formatted financial year -#' @family formatting functions -#' @export -#' @examples -#' format_fy(201617) -#' format_fy("201617") -format_fy <- function(year) { - if (!grepl("^[0-9]{6,6}$", year)) { - stop("year parameter must be a six digit number or string e.g. 201617") - } - sub("(.{4})(.*)", "\\1-\\2", year) -} - -#' Undo financial year formatting -#' -#' This function converts financial year variables back into 201617 format. -#' -#' It accepts character arguments. -#' -#' @param year Financial year -#' @return Unformatted 6 digit year as string -#' @family formatting functions -#' @export -#' @examples -#' format_fy_reverse("2016-17") -# function to reverse the change back to e.g. 201617 -format_fy_reverse <- function(year) { - if (!grepl("^\\d{4}-\\d{2}.*", year)) { - stop("year parameter must be a seven digit string in a financial - year format, e.g. '2016-17'") - } - gsub("[^0-9A-Za-z///' ]", "", year) -} diff --git a/R/get_ons_api_data.R b/R/get_ons_api_data.R new file mode 100644 index 0000000..039015a --- /dev/null +++ b/R/get_ons_api_data.R @@ -0,0 +1,142 @@ +#' Fetch ONS Open Geography API data +#' +#' Helper function that takes a data set id and parameters to query and parse +#' data from the ONS Open Geography API. Technically uses a POST request rather +#' than a GET request. +#' +#' It does a pre-query to understand the ObjectIds for the query you want, and +#' then does a query to retrieve those Ids directly in batches before then +#' stacking the whole thing back together to work around the row limits for a +#' single query. +#' +#' On the \href{https://geoportal.statistics.gov.uk/}{Open Geography Portal}, +#' find the data set you're interested in and then use the query explorer to +#' find the information for the query. +#' +#' @param data_id the id of the data set to query, can be found from the Open +#' Geography Portal +#' @param query_params query parameters to pass into the API, see the ESRI +#' documentation for more information on query parameters - +#' \href{https://shorturl.at/5xrJT}{ESRI Query (Feature Service/Layer)} +#' @param batch_size the number of rows per query. This is 250 by default, if +#' you hit errors then try lowering this. The API has a limit of 1000 to 2000 +#' rows per query, and in truth, the actual limit for our method is lower as +#' every ObjectId queried is pasted into the query URL so for every row +#' included in the batch, and especial if those Id's go into the 1,000s or +#' 10,000s they will increase the size of the URL and risk hitting the limit. +#' @param verbose TRUE or FALSE boolean. TRUE by default. FALSE will turn off +#' the messages to the console that update on what the function is doing +#' +#' @export +#' @return parsed data.frame of geographic names and codes +#' +#' @examples +#' if (interactive()) { +#' # Specify some parameters +#' get_ons_api_data( +#' data_id = "LAD23_RGN23_EN_LU", +#' query_params = +#' list(outFields = "column1, column2", outSR = "4326", f = "json") +#' ) +#' +#' # Just fetch everything +#' get_ons_api_data(data_id = "LAD23_RGN23_EN_LU") +#' } +get_ons_api_data <- function(data_id, + query_params = + list( + where = "1=1", + outFields = "*", + outSR = "4326", + f = "json" + ), + batch_size = 200, + verbose = TRUE) { + # Known URL for ONS API + # Split in two parts so that the data_id can be smushed in the middle + part_1 <- + "https://services1.arcgis.com/ESMARspQHYMw9BZ9/arcgis/rest/services/" + part_2 <- "/FeatureServer/0/query" + + dataset_url <- paste0(part_1, data_id, part_2) + + # Initial query to get number of objects in requested data + dfeR::toggle_message("Checking total number of objects...", verbose = verbose) + + # Force the returnIdsOnly argument into the params to get Ids back + id_params <- query_params + id_params$returnIdsOnly <- "TRUE" + + # Query to get the Ids + id_response <- httr::POST(dataset_url, query = id_params) + id_body <- httr::content(id_response, "text") + id_parsed <- jsonlite::fromJSON(id_body)$objectIds + + # Work out total number of ids + total_ids <- max(id_parsed) + dfeR::toggle_message( + dfeR::pretty_num(total_ids), + " objects found for the query", + verbose = verbose + ) + + # Create a list of batches of ids + # Using 1000 as that's the max recommended number features on the ONS API + # 2000 is the maximum limit for a batch + batches <- split(1:total_ids, ceiling(seq_along(1:total_ids) / batch_size)) + num_of_batches <- length(batches) + dfeR::toggle_message( + "Created ", num_of_batches, " batches of objects to query", + verbose = verbose + ) + + dfeR::toggle_message("Querying API to get objects...", verbose = verbose) + + # Set up a blank dataframe to start dumping into + full_table <- data.frame() + + # Loop the the main feature query (this gets the locations data itself) + for (batch_num in seq_along(1:num_of_batches)) { + dfeR::toggle_message( + "...fetching batch ", batch_num, ": objects ", + dfeR::pretty_num(min(batches[[batch_num]])), " to ", + dfeR::pretty_num(max(batches[[batch_num]])), "...", + verbose = verbose + ) + + # Force the objectIds for the batch into the query + # This also blanks out any WHERE filters as we don't need those for getting + # the total number of Ids + batch_params <- query_params + batch_params$where <- NULL + batch_params$objectIds <- paste0(batches[[batch_num]], collapse = ",") + + # Stitch the data_id in and give the query parameters + batch_response <- httr::POST( + dataset_url, + query = batch_params + ) + + # Get the body of the response + batch_body <- httr::content(batch_response, "text") + + # Parse the JSON + batch_parsed <- jsonlite::fromJSON(batch_body) + + # bind on batch to rest + full_table <- rbind(full_table, jsonlite::flatten(batch_parsed$features)) + + dfeR::toggle_message( + "...success! There are now ", dfeR::pretty_num(nrow(full_table)), + " rows in your table...", + verbose = verbose + ) + } + + dfeR::toggle_message( + "...data frame batched, stacked and delivered!", + verbose = verbose + ) + + return(full_table) +} diff --git a/R/pretty.R b/R/pretty.R new file mode 100644 index 0000000..ba848d1 --- /dev/null +++ b/R/pretty.R @@ -0,0 +1,290 @@ +#' Pretty numbers into readable file size +#' +#' @description +#' Converts a raw file size from bytes to a more readable format. +#' +#' @details +#' Designed to be used in conjunction with the file.size() +#' function in base R. +#' +#' Presents in kilobytes, megabytes or gigabytes. +#' +#' Shows as bytes until 1 KB, then kilobytes up to 1 MB, then megabytes +#' until 1GB, then it will show as gigabytes for anything larger. +#' +#' Rounds the end result to 2 decimal places. +#' +#' Using base 10 (decimal), so 1024 bytes is 1,024 KB. +#' +#' @param filesize file size in bytes +#' +#' @return string containing prettified file size +#' @family prettying +#' @seealso [comma_sep()] [round_five_up()] +#' @export +#' @examples +#' pretty_filesize(2) +#' pretty_filesize(549302) +#' pretty_filesize(9872948939) +#' pretty_filesize(1) +#' pretty_filesize(1000) +#' pretty_filesize(1000^2) +#' pretty_filesize(10^9) +pretty_filesize <- function(filesize) { + if (!is.numeric(filesize)) { + stop("file size must be a numeric value") + } else { + if (round_five_up(filesize / 10^9, 2) >= 1) { + return(paste0(comma_sep(round_five_up(filesize / 10^9, 2)), " GB")) + } else { + if (round_five_up(filesize / 1000^2, 2) >= 1) { + return(paste0(round_five_up(filesize / 1000^2, 2), " MB")) + } else { + if (round_five_up(filesize, 2) >= 1000) { + return(paste0(round_five_up(filesize / 1000, 2), " KB")) + } else { + if (filesize == 1) { + "1 byte" + } else { + return(paste0(round_five_up(filesize, 2), " bytes")) + } + } + } + } + } +} + +#' Calculate elapsed time between two points and present prettily +#' +#' @description +#' Converts a start and end value to a readable time format. +#' +#' @details +#' Designed to be used with Sys.time() when tracking start and end times. +#' +#' Shows as seconds up until 119 seconds, then minutes until 119 minutes, +#' then hours for anything larger. +#' +#' Input start and end times must be convertible to POSIXct format. +#' @param start_time start time readable by as.POSIXct +#' @param end_time end time readable by as.POSIXct +#' @return string containing prettified elapsed time +#' @family prettying +#' @seealso [comma_sep()] [round_five_up()] [as.POSIXct()] +#' @export +#' @examples +#' pretty_time_taken( +#' "2024-03-23 07:05:53 GMT", +#' "2024-03-23 12:09:56 GMT" +#' ) +#' +#' # Track the start and end time of a process +#' start <- Sys.time() +#' Sys.sleep(0.1) +#' end <- Sys.time() +#' +#' # Use this function to present it prettily +#' pretty_time_taken(start, end) +pretty_time_taken <- function(start_time, end_time) { + # Convert start and end times to seconds since 1970 + tryCatch( + { + start_secs <- as.numeric( + difftime( + time1 = as.POSIXct(start_time, tz = "UTC"), + time2 = as.POSIXct("1970-01-01", tz = "UTC"), + units = "secs" + ) + ) + }, + error = function(msg) { + stop("start and end times must be convertible to POSIXct format") + } + ) + + tryCatch( + { + end_secs <- as.numeric( + difftime( + time1 = as.POSIXct(end_time, tz = "UTC"), + time2 = as.POSIXct("1970-01-01", tz = "UTC"), + units = "secs" + ) + ) + }, + error = function(msg) { + stop("start and end times must be convertable to POSIXct format") + } + ) + + # Find the elapsed time in seconds + raw_time <- round_five_up(end_secs - start_secs, 2) + + # Format elapsed time neatly + # This section could be broken into its own function + # ...that takes in raw seconds + if (raw_time < 120) { + if (raw_time == 1) { + return("1 second") + } else { + return(paste0(raw_time, " seconds")) + } + } else { + if (raw_time < 7140) { + mins <- raw_time %/% 60 + secs <- round_five_up(raw_time %% 60) + + min_desc <- ifelse(mins == 1, " minute ", " minutes ") + sec_desc <- ifelse(secs == 1, " second", " seconds") + + return( + paste0( + mins, min_desc, secs, sec_desc + ) + ) + } else { + hours <- raw_time %/% 3600 + mins <- raw_time %/% 60 - hours * 60 + secs <- round_five_up(raw_time %% 60) + + hour_desc <- ifelse(hours == 1, " hour ", " hours ") + min_desc <- ifelse(mins == 1, " minute ", " minutes ") + sec_desc <- ifelse(secs == 1, " second", " seconds") + + return( + paste0( + comma_sep(hours), hour_desc, mins, min_desc, secs, sec_desc + ) + ) + } + } +} + +#' Prettify big numbers into a readable format +#' +#' @description +#' Uses `as.numeric()` to force a numeric value and then formats prettily +#' for easy presentation in console messages, reports, or dashboards. +#' +#' This rounds to 2 decimal places by default, and adds in comma separators. +#' +#' Expect that this will commonly be used for adding the pound symbol, +#' the percentage symbol, or to have a +/- prefixed based on the value. +#' +#' If applying over multiple or unpredictable values and you want to preserve +#' a non-numeric symbol such as "x" or "c" for data not available, use the +#' `ignore_na = TRUE` argument to return those values unaffected. +#' +#' If you want to customise what NA values are returned as, use the `alt_na` +#' argument. +#' +#' This function silences the warning around NAs being introduced by coercion. +#' @param value value to be prettified +#' @param prefix prefix for the value, if "+/-" then it will automatically +#' assign + or - based on the value +#' @param gbp whether to add the pound symbol or not, defaults to not +#' @param suffix suffix for the value, e.g. "%" +#' @param dp number of decimal places to round to, 2 by default +#' @param ignore_na whether to skip function for strings that can't be +#' converted and return original value +#' @param alt_na alternative value to return in place of NA, e.g. "x" +#' +#' @return string featuring prettified value +#' @family prettying +#' @seealso [comma_sep()] [round_five_up()] [as.numeric()] +#' @export +#' +#' @examples +#' # On individual values +#' pretty_num(5789, gbp = TRUE) +#' pretty_num(564, prefix = "+/-") +#' pretty_num(567812343223, gbp = TRUE, prefix = "+/-") +#' pretty_num(11^9, gbp = TRUE, dp = 3) +#' pretty_num(-11^8, gbp = TRUE, dp = -1) +#' pretty_num("56.089", suffix = "%") +#' pretty_num("x") +#' pretty_num("x", ignore_na = TRUE) +#' pretty_num("nope", alt_na = "x") +#' +#' # Applied over an example vector +#' vector <- c(3998098008, -123421421, "c", "x") +#' unlist(lapply(vector, pretty_num)) +#' unlist(lapply(vector, pretty_num, prefix = "+/-", gbp = TRUE)) +#' +#' # Return original values if NA +#' unlist(lapply(vector, pretty_num, ignore_na = TRUE)) +#' +#' # Return alternative value in place of NA +#' unlist(lapply(vector, pretty_num, alt_na = "z")) +pretty_num <- function( + value, + prefix = "", + gbp = FALSE, + suffix = "", + dp = 2, + ignore_na = FALSE, + alt_na = FALSE) { + # Check we're only trying to prettify a single value + if (length(value) > 1) { + stop("value must be a single value, multiple values were detected") + } + + # Force to numeric + num_value <- suppressWarnings(as.numeric(value)) + + # Check if should skip function + if (is.na(num_value)) { + if (ignore_na == TRUE) { + return(value) # return original value + } else if (alt_na != FALSE) { + return(alt_na) # return custom NA value + } else { + return(num_value) # return NA + } + } + + # Convert GBP to pound symbol + if (gbp == TRUE) { + currency <- "\U00a3" + } else { + currency <- "" + } + + # Add + / - symbols depending on size of value + if (prefix == "+/-") { + if (value >= 0) { + prefix <- "+" + } else { + prefix <- "-" + } + # Add in negative symbol if appropriate and not auto added with +/- + } else if (value < 0) { + prefix <- paste0("-", prefix) + } + + # Add suffix and prefix, plus convert to million or billion + if (abs(num_value) >= 1.e9) { + paste0( + prefix, + currency, + comma_sep(round_five_up(abs(num_value) / 1.e9, dp = dp)), + " billion", + suffix + ) + } else if (abs(num_value) >= 1.e6) { + paste0( + prefix, + currency, + comma_sep(round_five_up(abs(num_value) / 1.e6, dp = dp)), + " million", + suffix + ) + } else { + paste0( + prefix, + currency, + comma_sep(round_five_up(abs(num_value), dp = dp)), + suffix + ) + } +} diff --git a/R/pretty_filesize.R b/R/pretty_filesize.R deleted file mode 100644 index 6436f74..0000000 --- a/R/pretty_filesize.R +++ /dev/null @@ -1,55 +0,0 @@ -#' Pretty numbers into readable file size -#' -#' @description -#' Converts a raw file size from bytes to a more readable format. -#' -#' @details -#' Designed to be used in conjunction with the file.size() -#' function in base R. -#' -#' Presents in kilobytes, megabytes or gigabytes. -#' -#' Shows as bytes until 1 KB, then kilobytes up to 1 MB, then megabytes -#' until 1GB, then it will show as gigabytes for anything larger. -#' -#' Rounds the end result to 2 decimal places. -#' -#' Using base 10 (decimal), so 1024 bytes is 1,024 KB. -#' -#' @param filesize file size in bytes -#' -#' @return string containing prettified file size -#' @family prettying functions -#' @seealso [comma_sep()] [round_five_up()] -#' @export -#' @examples -#' pretty_filesize(2) -#' pretty_filesize(549302) -#' pretty_filesize(9872948939) -#' pretty_filesize(1) -#' pretty_filesize(1000) -#' pretty_filesize(1000^2) -#' pretty_filesize(10^9) -pretty_filesize <- function(filesize) { - if (!is.numeric(filesize)) { - stop("file size must be a numeric value") - } else { - if (round_five_up(filesize / 10^9, 2) >= 1) { - return(paste0(comma_sep(round_five_up(filesize / 10^9, 2)), " GB")) - } else { - if (round_five_up(filesize / 1000^2, 2) >= 1) { - return(paste0(round_five_up(filesize / 1000^2, 2), " MB")) - } else { - if (round_five_up(filesize, 2) >= 1000) { - return(paste0(round_five_up(filesize / 1000, 2), " KB")) - } else { - if (filesize == 1) { - "1 byte" - } else { - return(paste0(round_five_up(filesize, 2), " bytes")) - } - } - } - } - } -} diff --git a/R/pretty_num.R b/R/pretty_num.R deleted file mode 100644 index 929709e..0000000 --- a/R/pretty_num.R +++ /dev/null @@ -1,128 +0,0 @@ -#' Prettify big numbers into a readable format -#' -#' @description -#' Uses `as.numeric()` to force a numeric value and then formats prettily -#' for easy presentation in console messages, reports, or dashboards. -#' -#' This rounds to 2 decimal places by default, and adds in comma separators. -#' -#' Expect that this will commonly be used for adding the pound symbol, -#' the percentage symbol, or to have a +/- prefixed based on the value. -#' -#' If applying over multiple or unpredictable values and you want to preserve -#' a non-numeric symbol such as "x" or "c" for data not available, use the -#' `ignore_na = TRUE` argument to return those values unaffected. -#' -#' If you want to customise what NA values are returned as, use the `alt_na` -#' argument. -#' -#' This function silences the warning around NAs being introduced by coercion. -#' @param value value to be prettified -#' @param prefix prefix for the value, if "+/-" then it will automatically -#' assign + or - based on the value -#' @param gbp whether to add the pound symbol or not, defaults to not -#' @param suffix suffix for the value, e.g. "%" -#' @param dp number of decimal places to round to, 2 by default -#' @param ignore_na whether to skip function for strings that can't be -#' converted and return original value -#' @param alt_na alternative value to return in place of NA, e.g. "x" -#' -#' @return string featuring prettified value -#' @family prettying functions -#' @seealso [comma_sep()] [round_five_up()] [as.numeric()] -#' @export -#' -#' @examples -#' # On individual values -#' pretty_num(5789, gbp = TRUE) -#' pretty_num(564, prefix = "+/-") -#' pretty_num(567812343223, gbp = TRUE, prefix = "+/-") -#' pretty_num(11^9, gbp = TRUE, dp = 3) -#' pretty_num(-11^8, gbp = TRUE, dp = -1) -#' pretty_num("56.089", suffix = "%") -#' pretty_num("x") -#' pretty_num("x", ignore_na = TRUE) -#' pretty_num("nope", alt_na = "x") -#' -#' # Applied over an example vector -#' vector <- c(3998098008, -123421421, "c", "x") -#' unlist(lapply(vector, pretty_num)) -#' unlist(lapply(vector, pretty_num, prefix = "+/-", gbp = TRUE)) -#' -#' # Return original values if NA -#' unlist(lapply(vector, pretty_num, ignore_na = TRUE)) -#' -#' # Return alternative value in place of NA -#' unlist(lapply(vector, pretty_num, alt_na = "z")) -pretty_num <- function( - value, - prefix = "", - gbp = FALSE, - suffix = "", - dp = 2, - ignore_na = FALSE, - alt_na = FALSE) { - # Check we're only trying to prettify a single value - if (length(value) > 1) { - stop("value must be a single value, multiple values were detected") - } - - # Force to numeric - num_value <- suppressWarnings(as.numeric(value)) - - # Check if should skip function - if (is.na(num_value)) { - if (ignore_na == TRUE) { - return(value) # return original value - } else if (alt_na != FALSE) { - return(alt_na) # return custom NA value - } else { - return(num_value) # return NA - } - } - - # Convert GBP to pound symbol - if (gbp == TRUE) { - currency <- "\U00a3" - } else { - currency <- "" - } - - # Add + / - symbols depending on size of value - if (prefix == "+/-") { - if (value >= 0) { - prefix <- "+" - } else { - prefix <- "-" - } - # Add in negative symbol if appropriate and not auto added with +/- - } else if (value < 0) { - prefix <- paste0("-", prefix) - } - - # Add suffix and prefix, plus convert to million or billion - if (abs(num_value) >= 1.e9) { - paste0( - prefix, - currency, - comma_sep(round_five_up(abs(num_value) / 1.e9, dp = dp)), - " billion", - suffix - ) - } else if (abs(num_value) >= 1.e6) { - paste0( - prefix, - currency, - comma_sep(round_five_up(abs(num_value) / 1.e6, dp = dp)), - " million", - suffix - ) - } else { - paste0( - prefix, - currency, - comma_sep(round_five_up(abs(num_value), dp = dp)), - suffix - ) - } -} diff --git a/R/pretty_time_taken.R b/R/pretty_time_taken.R deleted file mode 100644 index 2effde3..0000000 --- a/R/pretty_time_taken.R +++ /dev/null @@ -1,105 +0,0 @@ -#' Calculate elapsed time between two points and present prettily -#' -#' @description -#' Converts a start and end value to a readable time format. -#' -#' @details -#' Designed to be used with Sys.time() when tracking start and end times. -#' -#' Shows as seconds up until 119 seconds, then minutes until 119 minutes, -#' then hours for anything larger. -#' -#' Input start and end times must be convertible to POSIXct format. -#' @param start_time start time readable by as.POSIXct -#' @param end_time end time readable by as.POSIXct -#' @return string containing prettified elapsed time -#' @family prettying functions -#' @seealso [comma_sep()] [round_five_up()] [as.POSIXct()] -#' @export -#' @examples -#' pretty_time_taken( -#' "2024-03-23 07:05:53 GMT", -#' "2024-03-23 12:09:56 GMT" -#' ) -#' -#' # Track the start and end time of a process -#' start <- Sys.time() -#' Sys.sleep(0.1) -#' end <- Sys.time() -#' -#' # Use this function to present it prettily -#' pretty_time_taken(start, end) -pretty_time_taken <- function(start_time, end_time) { - # Convert start and end times to seconds since 1970 - tryCatch( - { - start_secs <- as.numeric( - difftime( - time1 = as.POSIXct(start_time, tz = "UTC"), - time2 = as.POSIXct("1970-01-01", tz = "UTC"), - units = "secs" - ) - ) - }, - error = function(msg) { - stop("start and end times must be convertible to POSIXct format") - } - ) - - tryCatch( - { - end_secs <- as.numeric( - difftime( - time1 = as.POSIXct(end_time, tz = "UTC"), - time2 = as.POSIXct("1970-01-01", tz = "UTC"), - units = "secs" - ) - ) - }, - error = function(msg) { - stop("start and end times must be convertable to POSIXct format") - } - ) - - # Find the elapsed time in seconds - raw_time <- round_five_up(end_secs - start_secs, 2) - - # Format elapsed time neatly - # This section could be broken into its own function - # ...that takes in raw seconds - if (raw_time < 120) { - if (raw_time == 1) { - return("1 second") - } else { - return(paste0(raw_time, " seconds")) - } - } else { - if (raw_time < 7140) { - mins <- raw_time %/% 60 - secs <- round_five_up(raw_time %% 60) - - min_desc <- ifelse(mins == 1, " minute ", " minutes ") - sec_desc <- ifelse(secs == 1, " second", " seconds") - - return( - paste0( - mins, min_desc, secs, sec_desc - ) - ) - } else { - hours <- raw_time %/% 3600 - mins <- raw_time %/% 60 - hours * 60 - secs <- round_five_up(raw_time %% 60) - - hour_desc <- ifelse(hours == 1, " hour ", " hours ") - min_desc <- ifelse(mins == 1, " minute ", " minutes ") - sec_desc <- ifelse(secs == 1, " second", " seconds") - - return( - paste0( - comma_sep(hours), hour_desc, mins, min_desc, secs, sec_desc - ) - ) - } - } -} diff --git a/R/toggle_message.R b/R/toggle_message.R new file mode 100644 index 0000000..2bfbef5 --- /dev/null +++ b/R/toggle_message.R @@ -0,0 +1,36 @@ +#' Controllable console messages +#' +#' Quick expansion to the `message()` function aimed for use in functions for +#' an easy addition of a global verbose TRUE / FALSE argument to toggle the +#' messages on or off +#' +#' @param ... any message you would normally pass into `message()`. See +#' \code{\link{message}} for more details +#' +#' @param verbose logical, usually a variable passed from the function you are +#' using this within +#' +#' @export +#' +#' @examples +#' # Usually used in a function +#' my_function <- function(count_fingers, verbose) { +#' toggle_message("I have ", count_fingers, " fingers", verbose = verbose) +#' fingers_thumbs <- count_fingers + 2 +#' toggle_message("I have ", fingers_thumbs, " digits", verbose = verbose) +#' } +#' +#' my_function(5, verbose = FALSE) +#' my_function(5, verbose = TRUE) +#' +#' # Can be used in isolation +#' toggle_message("I want the world to read this!", verbose = TRUE) +#' toggle_message("I ain't gonna show this message!", verbose = FALSE) +#' +#' count_fingers <- 5 +#' toggle_message("I have ", count_fingers, " fingers", verbose = TRUE) +toggle_message <- function(..., verbose) { + if (verbose) { + message(...) + } +} diff --git a/README.Rmd b/README.Rmd index bf598b6..54b768a 100644 --- a/README.Rmd +++ b/README.Rmd @@ -32,15 +32,15 @@ This package is open to all of DfE and anything we think could be useful to othe Functionality for dfeR is expected to focus around the following: -1. DfE specific formatting -2. Working with Microsoft SQL Databases +1. DfE specific formatting and helper functions +2. Working with DfE databases 3. Templates for analytical projects -4. Publication R Markdown Templates -5. API wrappers for use internally +4. API wrappers commonly needed in DfE analysis (where they don't have their own separate package) +5. Geography lookup files and helper functions Documentation for what has been included in the package so far is on our [pkgdown site](http://dfe-analytical-services.github.io/dfeR/). -We are also developing the [dfeshiny](https://github.com/dfe-analytical-services/dfeshiny) package, and expect any functions specific to public facing R Shiny dashboards will live there. +We are also developing the [dfeshiny](https://github.com/dfe-analytical-services/dfeshiny) package, and expect any functions specific to R Shiny applications will live there. --- @@ -85,7 +85,7 @@ Please note that the dfeR project is released with a [Contributor Code of Conduc ## Examples -Here are some example formatting functions from within the package: +Here are some example functions from within the package: ```{r example} library(dfeR) @@ -111,6 +111,34 @@ format_ay(202425) format_fy(202425) format_ay_reverse("2024/25") format_fy_reverse("2024-25") + +# Get Ward to PCon to LAD to LA to Rgn to Ctry lookup file +my_data <- dfeR::wd_pcon_lad_la_rgn_ctry +head(my_data) # show first 5 rows in console + +# Get all countries +dfeR::countries + +# Get all PCon names and codes for 2024 +fetch_pcons(2024) |> + head() # show first 5 rows only + +# Get All LADs in Scotland in 2017 +fetch_lads(2017, "Scotland") |> + head() # show first 5 rows only + +# Get all LAs in Scotland and Northern Ireland in 2022 +fetch_las(2022, c("Scotland", "Northern Ireland")) |> + head() # show first 5 rows only + +# Get all Welsh wards for 2021 +fetch_wards(2021, "Wales") |> + head() # show first 5 rows only + +# The following have no specific years available and return all values +fetch_regions() + +fetch_countries() ``` For more details on all the functions available in this package, and examples of how to use them, please see our [dfeR package reference documentation](https://dfe-analytical-services.github.io/dfeR/reference/index.html). diff --git a/README.md b/README.md index e9a3d30..e1cdd80 100644 --- a/README.md +++ b/README.md @@ -27,19 +27,20 @@ to other programmers and analysts can be contributed. Functionality for dfeR is expected to focus around the following: -1. DfE specific formatting -2. Working with Microsoft SQL Databases +1. DfE specific formatting and helper functions +2. Working with DfE databases 3. Templates for analytical projects -4. Publication R Markdown Templates -5. API wrappers for use internally +4. API wrappers commonly needed in DfE analysis (where they don’t have + their own separate package) +5. Geography lookup files and helper functions Documentation for what has been included in the package so far is on our [pkgdown site](http://dfe-analytical-services.github.io/dfeR/). We are also developing the [dfeshiny](https://github.com/dfe-analytical-services/dfeshiny) package, -and expect any functions specific to public facing R Shiny dashboards -will live there. +and expect any functions specific to R Shiny applications will live +there. ------------------------------------------------------------------------ @@ -97,7 +98,7 @@ By contributing to this project, you agree to abide by its terms. ## Examples -Here are some example formatting functions from within the package: +Here are some example functions from within the package: ``` r library(dfeR) @@ -133,6 +134,129 @@ format_ay_reverse("2024/25") #> [1] "202425" format_fy_reverse("2024-25") #> [1] "202425" + +# Get Ward to PCon to LAD to LA to Rgn to Ctry lookup file +my_data <- dfeR::wd_pcon_lad_la_rgn_ctry +head(my_data) # show first 5 rows in console +#> first_available_year_included most_recent_year_included +#> 1 2017 2017 +#> 2 2017 2017 +#> 3 2017 2020 +#> 4 2017 2017 +#> 5 2017 2020 +#> 6 2017 2017 +#> ward_name pcon_name lad_name la_name +#> 1 Bastwell Blackburn Blackburn with Darwen Blackburn with Darwen +#> 2 Ormesby Redcar Redcar and Cleveland Redcar and Cleveland +#> 3 Burn Valley Hartlepool Hartlepool Hartlepool +#> 4 Beardwood with Lammack Blackburn Blackburn with Darwen Blackburn with Darwen +#> 5 De Bruce Hartlepool Hartlepool Hartlepool +#> 6 St Germain's Redcar Redcar and Cleveland Redcar and Cleveland +#> region_name country_name ward_code pcon_code lad_code new_la_code +#> 1 North West England E05001621 E14000570 E06000008 E06000008 +#> 2 North East England E05001518 E14000891 E06000003 E06000003 +#> 3 North East England E05008942 E14000733 E06000001 E06000001 +#> 4 North West England E05001622 E14000570 E06000008 E06000008 +#> 5 North East England E05008943 E14000733 E06000001 E06000001 +#> 6 North East England E05001519 E14000891 E06000003 E06000003 +#> region_code country_code +#> 1 E12000002 E92000001 +#> 2 E12000001 E92000001 +#> 3 E12000001 E92000001 +#> 4 E12000002 E92000001 +#> 5 E12000001 E92000001 +#> 6 E12000001 E92000001 + +# Get all countries +dfeR::countries +#> country_code country_name +#> 1 E92000001 England +#> 2 K02000001 United Kingdom +#> 3 K03000001 Great Britain +#> 4 K04000001 England and Wales +#> 5 N92000002 Northern Ireland +#> 6 S92000003 Scotland +#> 7 W92000004 Wales +#> 8 z England, Wales and Northern Ireland +#> 9 z Outside of England and unknown +#> 10 z Outside of the United Kingdom and unknown + +# Get all PCon names and codes for 2024 +fetch_pcons(2024) |> + head() # show first 5 rows only +#> pcon_code pcon_name +#> 1 S14000045 Midlothian +#> 2 S14000027 Na h-Eileanan an Iar +#> 3 S14000021 East Renfrewshire +#> 4 S14000048 North Ayrshire and Arran +#> 5 S14000051 Orkney and Shetland +#> 6 E14001440 Redcar + +# Get All LADs in Scotland in 2017 +fetch_lads(2017, "Scotland") |> + head() # show first 5 rows only +#> lad_code lad_name +#> 1 S12000019 Midlothian +#> 2 S12000015 Fife +#> 3 S12000014 Falkirk +#> 4 S12000013 Na h-Eileanan Siar +#> 5 S12000018 Inverclyde +#> 6 S12000011 East Renfrewshire + +# Get all LAs in Scotland and Northern Ireland in 2022 +fetch_las(2022, c("Scotland", "Northern Ireland")) |> + head() # show first 5 rows only +#> new_la_code la_name +#> 1 N09000003 Belfast +#> 2 N09000004 Causeway Coast and Glens +#> 3 N09000002 Armagh City, Banbridge and Craigavon +#> 4 N09000005 Derry City and Strabane +#> 5 N09000001 Antrim and Newtownabbey +#> 6 N09000006 Fermanagh and Omagh + +# Get all Welsh wards for 2021 +fetch_wards(2021, "Wales") |> + head() # show first 5 rows only +#> ward_code ward_name +#> 1 W05000981 Aethwy +#> 2 W05000982 Bro Aberffraw +#> 3 W05000983 Bro Rhosyr +#> 4 W05000107 Tregarth & Mynydd Llandygai +#> 5 W05000984 Caergybi +#> 6 W05000985 Canolbarth Môn + +# The following have no specific years available and return all values +fetch_regions() +#> region_code region_name +#> 1 E12000001 North East +#> 2 E12000002 North West +#> 3 E12000003 Yorkshire and The Humber +#> 4 E12000004 East Midlands +#> 5 E12000005 West Midlands +#> 6 E12000006 East of England +#> 7 E12000007 London +#> 8 E12000008 South East +#> 9 E12000009 South West +#> 10 E13000001 Inner London +#> 11 E13000002 Outer London +#> 12 z Outside of England and unknown +#> 13 z Outside of the United Kingdom and unknown +#> 14 z Outside of England +#> 15 z Outside of United Kingdom +#> 16 z Unknown + +fetch_countries() +#> country_code country_name +#> 1 E92000001 England +#> 2 K02000001 United Kingdom +#> 3 K03000001 Great Britain +#> 4 K04000001 England and Wales +#> 5 N92000002 Northern Ireland +#> 6 S92000003 Scotland +#> 7 W92000004 Wales +#> 8 z England, Wales and Northern Ireland +#> 9 z Outside of England and unknown +#> 10 z Outside of the United Kingdom and unknown ``` For more details on all the functions available in this package, and diff --git a/_pkgdown.yml b/_pkgdown.yml index 387e17d..94448fe 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -7,16 +7,36 @@ template: code-color: "ffffff" reference: +- title: Data sets + desc: Data sets exported in the package + contents: + - ons_geog_shorthands + - wd_pcon_lad_la_rgn_ctry + - countries + - regions + - title: Database connection desc: Helpful functions for connecting to databases in DfE contents: - get_clean_sql +- title: Fetch geography lists + desc: Pull geography lookups from the ONS Geography Portal + contents: + - starts_with("fetch_") + - title: Presentation prettifiers desc: Functions for presenting pretty versions of numbers with readable code contents: - starts_with("pretty_") +- title: Pre-populated project + desc: > + A function to create a new R project with a pre-populated folder and + file structure + contents: + - create_project + - title: Specific formats desc: Functions for converting to specific formats contents: @@ -24,15 +44,10 @@ reference: - title: Helpers desc: > - Functions used in other functions across the package, also useful in - their own right + Functions used in other functions across the package, exported as they can also + be useful in their own right contents: - round_five_up - comma_sep - -- title: Pre-populated project - desc: > - A function to create a new R project with a pre-populated folder and - file structure - contents: - - create_project + - get_ons_api_data + - toggle_message diff --git a/data-raw/countries.R b/data-raw/countries.R new file mode 100644 index 0000000..7682ce7 --- /dev/null +++ b/data-raw/countries.R @@ -0,0 +1,42 @@ +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# Get a list of countries and codes from ONS API +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# Set the year ---------------------------------------------------------------- +year <- 2023 +year_end <- 23 + +test_that("`year` ends in `year_end`", { + expect_true(grepl(paste0(year_end, "$"), year)) +}) + +# Set query parameters -------------------------------------------------------- +params <- list( + where = "1=1", + outFields = paste0("CTRY", year_end, "CD,CTRY", year_end, "NM"), + outSR = 4326, + f = "json" +) + +# Run the query --------------------------------------------------------------- +ons_countries <- dfeR::get_ons_api_data( + paste0("CTRY_DEC_", year, "_UK_NC"), + query_params = params +) |> + dplyr::rename( + "country_name" = paste0("attributes.CTRY", year_end, "NM"), + "country_code" = paste0("attributes.CTRY", year_end, "CD") + ) + +# Set custom DfE countries ---------------------------------------------------- +custom_dfe_countries <- data.frame( + "country_name" = c( + "England, Wales and Northern Ireland", "Outside of England and unknown", + "Outside of the United Kingdom and unknown" + ), + "country_code" = c("z", "z", "z") +) + +# Stack into one data frame and write out ------------------------------------- +countries <- rbind(ons_countries, custom_dfe_countries) + +usethis::use_data(countries, overwrite = TRUE) diff --git a/data-raw/ons_geog_shorthands.R b/data-raw/ons_geog_shorthands.R new file mode 100644 index 0000000..466aeb9 --- /dev/null +++ b/data-raw/ons_geog_shorthands.R @@ -0,0 +1,19 @@ +## code to prepare `ons_geog_shorthands` data set goes here + +ons_level_shorthands <- c("WD", "PCON", "LAD", "UTLA", "GOR", "RGN", "CTRY") +name_column <- paste0( + c("ward", "pcon", "lad", "la", "region", "region", "country"), + "_name" +) +code_column <- paste0( + c("ward", "pcon", "lad", "new_la", "region", "region", "country"), + "_code" +) + +ons_geog_shorthands <- data.frame( + ons_level_shorthands, + name_column, + code_column +) + +usethis::use_data(ons_geog_shorthands, overwrite = TRUE) diff --git a/data-raw/regions.R b/data-raw/regions.R new file mode 100644 index 0000000..5464200 --- /dev/null +++ b/data-raw/regions.R @@ -0,0 +1,47 @@ +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# Get a list of regions and codes from ONS API +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# Set the year ---------------------------------------------------------------- +year <- 2023 +year_end <- 23 + +test_that("`year` ends in `year_end`", { + expect_true(grepl(paste0(year_end, "$"), year)) +}) + +# Set query parameters -------------------------------------------------------- +params <- list( + where = "1=1", + outFields = paste0("RGN", year_end, "CD,RGN", year_end, "NM"), + outSR = 4326, + f = "json" +) + +# Run query ------------------------------------------------------------------- +ons_regions <- dfeR::get_ons_api_data( + paste0("RGN_DEC_", year, "_EN_NC"), # data set uses 4 digit year + query_params = params +) |> + dplyr::rename( + "region_name" = paste0("attributes.RGN", year_end, "NM"), + "region_code" = paste0("attributes.RGN", year_end, "CD") + ) + +# Set custom DfE regions ------------------------------------------------------ +custom_dfe_regions <- data.frame( + "region_name" = c( + "Inner London", # This is a county we tend to publish as a region + "Outer London", # This is a county we tend to publish as a region + "Outside of England and unknown", + "Outside of the United Kingdom and unknown", + "Outside of England", + "Outside of United Kingdom", + "Unknown" + ), + "region_code" = c("E13000001", "E13000002", "z", "z", "z", "z", "z") +) + +# Stack into one data frame and write out ------------------------------------- +regions <- rbind(ons_regions, custom_dfe_regions) + +usethis::use_data(regions, overwrite = TRUE) diff --git a/data-raw/wd_pcon_lad_la_rgn_ctry.R b/data-raw/wd_pcon_lad_la_rgn_ctry.R new file mode 100644 index 0000000..626d996 --- /dev/null +++ b/data-raw/wd_pcon_lad_la_rgn_ctry.R @@ -0,0 +1,156 @@ +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# Create the wd_pcon_lad_la_reg_ctry data set +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# This data is created by joining wd_pcon_lad_la +# - https://geoportal.statistics.gov.uk/search?tags=lup_wd_pcon_lad_utla +# and lad_region from these lookups +# - https://geoportal.statistics.gov.uk/search?q=lup_wd_lad_cty_rgn_gor_ctry +# +# We make some small changes to these currently, more details are in the +# public facing documentation in R/datasets_documentation.R and the functions +# in R/datasets_utils.R. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# To update this data +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# 1. Load the package using `devtools::load_all(".")` +# +# 2. Edit the years set near the start of this script to those you want to +# create for (often, just add one new one to the end!) +# +# 3. Run this script to generate and save a new data file +# +# 4. Run the tests (ctrl-shft-t) and package checks (ctrl-shft-e) +# +# 5. Inspect changes to the data set, and update its entry in +# datasets_documentation.R as needed, updating the tests afterwards if +# appropriate +# +# 6. Update the options listed for the year @param in the fetch.R @description +# +# 7. Re-document the package (ctrl-shft-d) +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# Common potential issues with this data +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# 1. ONS like to vary their data set ids +# You may need edit the `case_when()` in the `get_wd_pcon_lad_la()` +# or `get_lad_region()` functions to add a new condition for the latest +# year, both of these are defined in R/datasets_utils.R +# +# 2. Watch out for standard column names changing +# Double check the Open Geography Portal for the latest source data and make +# sure the output from the API for the latest file matches up with previous +# years +# +# 3. Regions not joining +# The two files are published out of sync, so the years aren't a perfect +# match. It's pretty possible that in the future we may need to do some +# manual joins. In this case add them to the bottom section and make sure +# to document in R/datasets_documentation.R, as well as giving the source +# for where you found the details from. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +library(readxl) +library(dplyr) + +# Set the years we want to pull for ------------------------------------------- +# Started publishing in 2017, but didn't publish a 2018 file +wd_pcon_lad_la_years <- c(2017, 2019:2024) + +# Skipping 2021 as not published in API for lad_region and we have enough +# coverage from other years to join without any gaps +lad_region_years <- c(2017:2020, 2022:2023) + +# Get the main lookup --------------------------------------------------------- +# Functions defined in R/datasets_utils.R +# Start with a list of individual data frames per year +wd_pcon_lad_la <- lapply(wd_pcon_lad_la_years, get_wd_pcon_lad_la) |> + create_time_series_lookup() |> # smush together into single data frame + dplyr::select( + "first_available_year_included", "most_recent_year_included", + "ward_name", "pcon_name", "lad_name", "la_name", + "ward_code", "pcon_code", "lad_code", "new_la_code", + ) + +# Get the regions lookup ------------------------------------------------------ +regions_lookup <- lapply(lad_region_years, get_lad_region) |> + create_time_series_lookup() |> + # Half the regions for Scotland in 2017 were missing + # the other half were just Scotland, so forcing them all to be Scotland + mutate( + region_name = if_else(grepl("^S", lad_code), "Scotland", region_name), + region_code = if_else(grepl("^S", lad_code), "S92000003", region_code) + ) %>% + # Get just the unique values to join with + dplyr::distinct(lad_name, lad_code, region_name, region_code) + +# Join on regions ------------------------------------------------------------- +wd_pcon_lad_la_rgn <- wd_pcon_lad_la %>% + dplyr::left_join( + # Join all rows that aren't missing a region name + na.omit(regions_lookup, cols = "region_name"), + by = c("lad_code" = "lad_code", "lad_name" = "lad_name") + ) + +# Join on countries ----------------------------------------------------------- +wd_pcon_lad_la_rgn_ctry <- wd_pcon_lad_la_rgn %>% + dplyr::mutate( + "country_name" = dplyr::case_when( + startsWith(pcon_code, "E") ~ "England", + startsWith(pcon_code, "S") ~ "Scotland", + startsWith(pcon_code, "W") ~ "Wales", + startsWith(pcon_code, "N") ~ "Northern Ireland", + .default = "ERROR" + ), + "country_code" = dplyr::case_when( + startsWith(pcon_code, "E") ~ "E92000001", + startsWith(pcon_code, "S") ~ "S92000003", + startsWith(pcon_code, "W") ~ "W92000004", + startsWith(pcon_code, "N") ~ "N92000002", + .default = "ERROR" + ) + ) + +# Manual fixes ---------------------------------------------------------------- +# !IMPORTANT! Make sure to log all of these in the description for the file in +# the `R/datasets_documentation.R` script +wd_pcon_lad_la_rgn_ctry <- wd_pcon_lad_la_rgn_ctry %>% + # ONS seemed to miss a 0 in 2017 for Glasgow East PCon + mutate(across(everything(), ~ ifelse(. == "S1400030", "S14000030", .))) + +# Set the order of the columns ------------------------------------------------ +wd_pcon_lad_la_rgn_ctry <- wd_pcon_lad_la_rgn_ctry %>% + dplyr::select( + "first_available_year_included", "most_recent_year_included", + "ward_name", "pcon_name", "lad_name", "la_name", + "region_name", "country_name", + "ward_code", "pcon_code", "lad_code", "new_la_code", + "region_code", "country_code" + ) + +# QA the joining -------------------------------------------------------------- +# Check for any regions that failed to join +region_error_check <- wd_pcon_lad_la_rgn_ctry %>% + filter( + region_code == "" | region_name == "" | + is.na(region_name) | is.na(region_code) + ) + +if (nrow(region_error_check) > 0) { + stop("Region information failing to match, check why this is happening") +} + +# Check for any countries that failed to join +country_error_check <- wd_pcon_lad_la_rgn_ctry %>% + filter(country_code == "ERROR" | country_name == "ERROR") + +if (nrow(country_error_check) > 0) { + stop("Country information failing to match, check why this is happening") +} + +# Write the data into the package --------------------------------------------- +usethis::use_data(wd_pcon_lad_la_rgn_ctry, overwrite = TRUE) diff --git a/data/countries.rda b/data/countries.rda new file mode 100644 index 0000000000000000000000000000000000000000..795f63c05813049a043497c7ca3dea5923702c13 GIT binary patch literal 324 zcmV-K0lWS}T4*^jL0KkKS;Cu0f&c)~f586tXaPtid>|I7n!vB`p0Gdw0RgZ97?3p7 zlT82~pa1~%G}F=zGywGjnqpu9FaawynIcj6EXhH{)dK6P=-Had6dKW<$V`BfM$1X=dDqHbPQPCWsi;HC#*4TZE*F W;i-)a^ZV>${}*yaI8cznn@EE8+>TfP literal 0 HcmV?d00001 diff --git a/data/ons_geog_shorthands.rda b/data/ons_geog_shorthands.rda new file mode 100644 index 0000000000000000000000000000000000000000..11b1fe34fba4e7ef540d163bd99f8a491498d485 GIT binary patch literal 294 zcmV+>0ondST4*^jL0KkKS-3Q!rT_r7|G@tKOaK4@5CANN*5I$_-=IJM03ome7`E6- znwm72)B);g>KYmV13{*NDyRCWGzX#@42&Si0g!r_5-6IRQ%UG1o}s1*p|pmEhK-^M zw^dc)lvLUvn1h0j-IN@zy0H^$gvbI$CI?<^TON|}N*&?O{Ru}ELDZPA z1Q>yB(*OxGcPV)uliimoRj%7@bB<{qQ5WQX5>n zDP2(0(TRe6pfGMUB$Bj*lDrjWxH{+D4AKvl7s51qexK2qks{*>5m1$t_R>a0B*4Jc s!)MRAh)jOV8Z;Ks!(5LiFp?7sG7=G@N<>rop$frwBvXY63xi53U@r50ivR!s literal 0 HcmV?d00001 diff --git a/data/regions.rda b/data/regions.rda new file mode 100644 index 0000000000000000000000000000000000000000..799cb69e05fa6b0173ff9ed4bdd97c5edd5fb886 GIT binary patch literal 374 zcmV-+0g3)XT4*^jL0KkKS<8#SD*yo;|G@vg*kM2+f8Yjhp5VXlo{&HQKmo7;T7V5f zCWon`Mu5<1pcsub(9xqNjD~>b1jNu`GGxh-guyh^BNG5a0FguqJx^&s#D}J%2*i3C zo`}YT)6jZqhy<`BY8A?<#4SxSpL$7=-G051DzEj84FXoN05WkOlU2(@Hhmg(G~Fa3 zdj&n!j+FMnjoCcWb^)#h_6!(y UBg_5bG5^KfkxmpOGUD(Gz+fJ$SO5S3 literal 0 HcmV?d00001 diff --git a/data/wd_pcon_lad_la_rgn_ctry.rda b/data/wd_pcon_lad_la_rgn_ctry.rda new file mode 100644 index 0000000000000000000000000000000000000000..41a2b5d46182c5a5537ac6d627a8d6df7eb4366a GIT binary patch literal 250639 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

$|cjkS{lsC$&7`Ts)nsa(m5~ObtRPlAh|_d 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

N!E~)8;xx{b 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 V$r#7&+wh@x7ji{7P>?FC)ef$LWV!$V literal 0 HcmV?d00001 diff --git a/inst/WORDLIST b/inst/WORDLIST index 2164c32..47d569c 100644 --- a/inst/WORDLIST +++ b/inst/WORDLIST @@ -1,23 +1,47 @@ CMD Codecov DfE +EES +GOR Lifecycle +NAC ORCID +ObjectId +ObjectIds +PCon POSIXct +RGN SSMS +Smush Sys +UTLA +api ay center +ctry +cty dbplyr dfeshiny fy +geoportal +gitignore +gor +gov +las lauraselby +lup num odbc +pcon +pcons pkgdown renv +rgn sep +ser +shorthands sql -gitignore -sep -num +uk +utla +wd +westminster diff --git a/man/check_fetch_location_inputs.Rd b/man/check_fetch_location_inputs.Rd new file mode 100644 index 0000000..163a1e7 --- /dev/null +++ b/man/check_fetch_location_inputs.Rd @@ -0,0 +1,20 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/fetch_utils.R +\name{check_fetch_location_inputs} +\alias{check_fetch_location_inputs} +\title{Validation for fetch location lookups} +\usage{ +check_fetch_location_inputs(year_input, country_input) +} +\arguments{ +\item{year_input}{the value of the years input} + +\item{country_input}{the value of the countries input} +} +\value{ +nothing, unless a failure, and then it will give an error +} +\description{ +Validation for fetch location lookups +} +\keyword{internal} diff --git a/man/countries.Rd b/man/countries.Rd new file mode 100644 index 0000000..25c97e0 --- /dev/null +++ b/man/countries.Rd @@ -0,0 +1,30 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/datasets_documentation.R +\docType{data} +\name{countries} +\alias{countries} +\title{Lookup for valid country names and codes} +\format{ +\subsection{\code{countries}}{ + +A data frame with 10 rows and 2 columns: +\describe{ +\item{country_name}{Country name} +\item{country_code}{Country code} +} +} +} +\source{ +curated by explore.statistics@education.gov.uk, ONS codes sourced +from +https://geoportal.statistics.gov.uk/search?q=countries\%20names\%20and\%20codes +} +\usage{ +countries +} +\description{ +A lookup of ONS geography country names and codes, as well as some custom +DfE names and codes. This is used as the definitive list for the screening +of open data before it is published by the DfE. +} +\keyword{datasets} diff --git a/man/create_time_series_lookup.Rd b/man/create_time_series_lookup.Rd new file mode 100644 index 0000000..e37c776 --- /dev/null +++ b/man/create_time_series_lookup.Rd @@ -0,0 +1,24 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/datasets_utils.R +\name{create_time_series_lookup} +\alias{create_time_series_lookup} +\title{Smush lookups together to make a time series} +\usage{ +create_time_series_lookup(lookups_list) +} +\arguments{ +\item{lookups_list}{list of data frames of new lookup table, +usually the output of tidy_raw_lookup} +} +\value{ +single data.frame of all lookup files combined +} +\description{ +Take a list of tidied files, likely produced by the tidy_downloaded_lookup +function append together +} +\details{ +Updates the \code{first_available_year_included} and \code{most_recent_year_included} +columns so that they are accurate for the full ser-EES +} +\keyword{internal} diff --git a/man/fetch.Rd b/man/fetch.Rd new file mode 100644 index 0000000..384b189 --- /dev/null +++ b/man/fetch.Rd @@ -0,0 +1,45 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/fetch.R +\name{fetch} +\alias{fetch} +\alias{fetch_pcons} +\title{Fetch Westminster parliamentary constituencies} +\usage{ +fetch_pcons(year = "All", countries = "All") +} +\arguments{ +\item{year}{year to filter the locations to, default is "All", +options of 2017, 2019, 2020, 2021, 2022", 2023, 2024} + +\item{countries}{vector of desired countries to filter the locations to, +default is "All", or can be a vector with options of "England", "Scotland", +"Wales" or "Northern Ireland"} +} +\value{ +data frame of unique location names and codes +} +\description{ +Fetch a data frame of all Westminster Parliamentary Constituencies for a +given year and country based on the dfeR::wd_pcon_lad_la_rgn_ctry file +} +\examples{ + +# Using head() to show only top 5 rows for examples +head(fetch_wards()) + +head(fetch_pcons()) + +head(fetch_pcons(2023)) + +head(fetch_pcons(countries = "Scotland")) + +head(fetch_pcons(year = 2023, countries = c("England", "Wales"))) + +fetch_lads(2024, "Wales") + +fetch_las(2022, "Northern Ireland") + +# The following have no specific years available and return all values +fetch_regions() +fetch_countries() +} diff --git a/man/fetch_countries.Rd b/man/fetch_countries.Rd new file mode 100644 index 0000000..3b37770 --- /dev/null +++ b/man/fetch_countries.Rd @@ -0,0 +1,43 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/fetch.R +\name{fetch_countries} +\alias{fetch_countries} +\title{Fetch countries} +\usage{ +fetch_countries() +} +\value{ +data frame of unique location names and codes +} +\description{ +Fetch countries +} +\examples{ + +# Using head() to show only top 5 rows for examples +head(fetch_wards()) + +head(fetch_pcons()) + +head(fetch_pcons(2023)) + +head(fetch_pcons(countries = "Scotland")) + +head(fetch_pcons(year = 2023, countries = c("England", "Wales"))) + +fetch_lads(2024, "Wales") + +fetch_las(2022, "Northern Ireland") + +# The following have no specific years available and return all values +fetch_regions() +fetch_countries() +} +\seealso{ +Other fetch_locations: +\code{\link{fetch_lads}()}, +\code{\link{fetch_las}()}, +\code{\link{fetch_regions}()}, +\code{\link{fetch_wards}()} +} +\concept{fetch_locations} diff --git a/man/fetch_lads.Rd b/man/fetch_lads.Rd new file mode 100644 index 0000000..2978c4c --- /dev/null +++ b/man/fetch_lads.Rd @@ -0,0 +1,51 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/fetch.R +\name{fetch_lads} +\alias{fetch_lads} +\title{Fetch local authority districts} +\usage{ +fetch_lads(year = "All", countries = "All") +} +\arguments{ +\item{year}{year to filter the locations to, default is "All", +options of 2017, 2019, 2020, 2021, 2022", 2023, 2024} + +\item{countries}{vector of desired countries to filter the locations to, +default is "All", or can be a vector with options of "England", "Scotland", +"Wales" or "Northern Ireland"} +} +\value{ +data frame of unique location names and codes +} +\description{ +Fetch local authority districts +} +\examples{ + +# Using head() to show only top 5 rows for examples +head(fetch_wards()) + +head(fetch_pcons()) + +head(fetch_pcons(2023)) + +head(fetch_pcons(countries = "Scotland")) + +head(fetch_pcons(year = 2023, countries = c("England", "Wales"))) + +fetch_lads(2024, "Wales") + +fetch_las(2022, "Northern Ireland") + +# The following have no specific years available and return all values +fetch_regions() +fetch_countries() +} +\seealso{ +Other fetch_locations: +\code{\link{fetch_countries}()}, +\code{\link{fetch_las}()}, +\code{\link{fetch_regions}()}, +\code{\link{fetch_wards}()} +} +\concept{fetch_locations} diff --git a/man/fetch_las.Rd b/man/fetch_las.Rd new file mode 100644 index 0000000..0e103fc --- /dev/null +++ b/man/fetch_las.Rd @@ -0,0 +1,51 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/fetch.R +\name{fetch_las} +\alias{fetch_las} +\title{Fetch local authorities} +\usage{ +fetch_las(year = "All", countries = "All") +} +\arguments{ +\item{year}{year to filter the locations to, default is "All", +options of 2017, 2019, 2020, 2021, 2022", 2023, 2024} + +\item{countries}{vector of desired countries to filter the locations to, +default is "All", or can be a vector with options of "England", "Scotland", +"Wales" or "Northern Ireland"} +} +\value{ +data frame of unique location names and codes +} +\description{ +Fetch local authorities +} +\examples{ + +# Using head() to show only top 5 rows for examples +head(fetch_wards()) + +head(fetch_pcons()) + +head(fetch_pcons(2023)) + +head(fetch_pcons(countries = "Scotland")) + +head(fetch_pcons(year = 2023, countries = c("England", "Wales"))) + +fetch_lads(2024, "Wales") + +fetch_las(2022, "Northern Ireland") + +# The following have no specific years available and return all values +fetch_regions() +fetch_countries() +} +\seealso{ +Other fetch_locations: +\code{\link{fetch_countries}()}, +\code{\link{fetch_lads}()}, +\code{\link{fetch_regions}()}, +\code{\link{fetch_wards}()} +} +\concept{fetch_locations} diff --git a/man/fetch_locations.Rd b/man/fetch_locations.Rd new file mode 100644 index 0000000..c5d6e92 --- /dev/null +++ b/man/fetch_locations.Rd @@ -0,0 +1,26 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/fetch_utils.R +\name{fetch_locations} +\alias{fetch_locations} +\title{Fetch locations for a given lookup} +\usage{ +fetch_locations(lookup_data, cols, year, countries) +} +\arguments{ +\item{lookup_data}{lookup data to use to extract locations from} + +\item{cols}{columns to extract from the main lookup table} + +\item{year}{year of locations to extract, "All" will skip any filtering and +return all possible locations} + +\item{countries}{countries for locations to be take from, "All" will skip +any filtering and return all} +} +\value{ +a data frame of location names and codes +} +\description{ +Helper function for the fetch_xxx() functions to save repeating code +} +\keyword{internal} diff --git a/man/fetch_regions.Rd b/man/fetch_regions.Rd new file mode 100644 index 0000000..910da93 --- /dev/null +++ b/man/fetch_regions.Rd @@ -0,0 +1,43 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/fetch.R +\name{fetch_regions} +\alias{fetch_regions} +\title{Fetch regions} +\usage{ +fetch_regions() +} +\value{ +data frame of unique location names and codes +} +\description{ +Fetch regions +} +\examples{ + +# Using head() to show only top 5 rows for examples +head(fetch_wards()) + +head(fetch_pcons()) + +head(fetch_pcons(2023)) + +head(fetch_pcons(countries = "Scotland")) + +head(fetch_pcons(year = 2023, countries = c("England", "Wales"))) + +fetch_lads(2024, "Wales") + +fetch_las(2022, "Northern Ireland") + +# The following have no specific years available and return all values +fetch_regions() +fetch_countries() +} +\seealso{ +Other fetch_locations: +\code{\link{fetch_countries}()}, +\code{\link{fetch_lads}()}, +\code{\link{fetch_las}()}, +\code{\link{fetch_wards}()} +} +\concept{fetch_locations} diff --git a/man/fetch_wards.Rd b/man/fetch_wards.Rd new file mode 100644 index 0000000..05963f4 --- /dev/null +++ b/man/fetch_wards.Rd @@ -0,0 +1,51 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/fetch.R +\name{fetch_wards} +\alias{fetch_wards} +\title{Fetch wards} +\usage{ +fetch_wards(year = "All", countries = "All") +} +\arguments{ +\item{year}{year to filter the locations to, default is "All", +options of 2017, 2019, 2020, 2021, 2022", 2023, 2024} + +\item{countries}{vector of desired countries to filter the locations to, +default is "All", or can be a vector with options of "England", "Scotland", +"Wales" or "Northern Ireland"} +} +\value{ +data frame of unique location names and codes +} +\description{ +Fetch wards +} +\examples{ + +# Using head() to show only top 5 rows for examples +head(fetch_wards()) + +head(fetch_pcons()) + +head(fetch_pcons(2023)) + +head(fetch_pcons(countries = "Scotland")) + +head(fetch_pcons(year = 2023, countries = c("England", "Wales"))) + +fetch_lads(2024, "Wales") + +fetch_las(2022, "Northern Ireland") + +# The following have no specific years available and return all values +fetch_regions() +fetch_countries() +} +\seealso{ +Other fetch_locations: +\code{\link{fetch_countries}()}, +\code{\link{fetch_lads}()}, +\code{\link{fetch_las}()}, +\code{\link{fetch_regions}()} +} +\concept{fetch_locations} diff --git a/man/format_ay.Rd b/man/format_ay.Rd index 9b91175..d2671e8 100644 --- a/man/format_ay.Rd +++ b/man/format_ay.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/format_ay.R +% Please edit documentation in R/format.R \name{format_ay} \alias{format_ay} \title{Format academic year} @@ -24,9 +24,9 @@ format_ay(201617) format_ay("201617") } \seealso{ -Other formatting functions: +Other format: \code{\link{format_ay_reverse}()}, \code{\link{format_fy}()}, \code{\link{format_fy_reverse}()} } -\concept{formatting functions} +\concept{format} diff --git a/man/format_ay_reverse.Rd b/man/format_ay_reverse.Rd index b954323..3c15f43 100644 --- a/man/format_ay_reverse.Rd +++ b/man/format_ay_reverse.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/format_ay.R +% Please edit documentation in R/format.R \name{format_ay_reverse} \alias{format_ay_reverse} \title{Undo academic year formatting} @@ -22,9 +22,9 @@ It accepts character arguments. format_ay_reverse("2016/17") } \seealso{ -Other formatting functions: +Other format: \code{\link{format_ay}()}, \code{\link{format_fy}()}, \code{\link{format_fy_reverse}()} } -\concept{formatting functions} +\concept{format} diff --git a/man/format_fy.Rd b/man/format_fy.Rd index a3e3431..0fff46d 100644 --- a/man/format_fy.Rd +++ b/man/format_fy.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/format_fy.R +% Please edit documentation in R/format.R \name{format_fy} \alias{format_fy} \title{Format financial year} @@ -24,9 +24,9 @@ format_fy(201617) format_fy("201617") } \seealso{ -Other formatting functions: +Other format: \code{\link{format_ay}()}, \code{\link{format_ay_reverse}()}, \code{\link{format_fy_reverse}()} } -\concept{formatting functions} +\concept{format} diff --git a/man/format_fy_reverse.Rd b/man/format_fy_reverse.Rd index b6b81cb..4c22ecb 100644 --- a/man/format_fy_reverse.Rd +++ b/man/format_fy_reverse.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/format_fy.R +% Please edit documentation in R/format.R \name{format_fy_reverse} \alias{format_fy_reverse} \title{Undo financial year formatting} @@ -22,9 +22,9 @@ It accepts character arguments. format_fy_reverse("2016-17") } \seealso{ -Other formatting functions: +Other format: \code{\link{format_ay}()}, \code{\link{format_ay_reverse}()}, \code{\link{format_fy}()} } -\concept{formatting functions} +\concept{format} diff --git a/man/get_lad_region.Rd b/man/get_lad_region.Rd new file mode 100644 index 0000000..03e8b0f --- /dev/null +++ b/man/get_lad_region.Rd @@ -0,0 +1,19 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/datasets_utils.R +\name{get_lad_region} +\alias{get_lad_region} +\title{Get LAD to Region lookup} +\usage{ +get_lad_region(year) +} +\arguments{ +\item{year}{last two digits of the year of the lookup, available years are: +2017, 2018, 2019, 2020, 2022, 2023} +} +\value{ +data.frame for the individual year of the lookup +} +\description{ +Helper function to extract data from the Ward-LAD-Region-County-Country file +} +\keyword{internal} diff --git a/man/get_ons_api_data.Rd b/man/get_ons_api_data.Rd new file mode 100644 index 0000000..038ff78 --- /dev/null +++ b/man/get_ons_api_data.Rd @@ -0,0 +1,62 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/get_ons_api_data.R +\name{get_ons_api_data} +\alias{get_ons_api_data} +\title{Fetch ONS Open Geography API data} +\usage{ +get_ons_api_data( + data_id, + query_params = list(where = "1=1", outFields = "*", outSR = "4326", f = "json"), + batch_size = 200, + verbose = TRUE +) +} +\arguments{ +\item{data_id}{the id of the data set to query, can be found from the Open +Geography Portal} + +\item{query_params}{query parameters to pass into the API, see the ESRI +documentation for more information on query parameters - +\href{https://shorturl.at/5xrJT}{ESRI Query (Feature Service/Layer)}} + +\item{batch_size}{the number of rows per query. This is 250 by default, if +you hit errors then try lowering this. The API has a limit of 1000 to 2000 +rows per query, and in truth, the actual limit for our method is lower as +every ObjectId queried is pasted into the query URL so for every row +included in the batch, and especial if those Id's go into the 1,000s or +10,000s they will increase the size of the URL and risk hitting the limit.} + +\item{verbose}{TRUE or FALSE boolean. TRUE by default. FALSE will turn off +the messages to the console that update on what the function is doing} +} +\value{ +parsed data.frame of geographic names and codes +} +\description{ +Helper function that takes a data set id and parameters to query and parse +data from the ONS Open Geography API. Technically uses a POST request rather +than a GET request. +} +\details{ +It does a pre-query to understand the ObjectIds for the query you want, and +then does a query to retrieve those Ids directly in batches before then +stacking the whole thing back together to work around the row limits for a +single query. + +On the \href{https://geoportal.statistics.gov.uk/}{Open Geography Portal}, +find the data set you're interested in and then use the query explorer to +find the information for the query. +} +\examples{ +if (interactive()) { + # Specify some parameters + get_ons_api_data( + data_id = "LAD23_RGN23_EN_LU", + query_params = + list(outFields = "column1, column2", outSR = "4326", f = "json") + ) + + # Just fetch everything + get_ons_api_data(data_id = "LAD23_RGN23_EN_LU") +} +} diff --git a/man/get_wd_pcon_lad_la.Rd b/man/get_wd_pcon_lad_la.Rd new file mode 100644 index 0000000..a19f429 --- /dev/null +++ b/man/get_wd_pcon_lad_la.Rd @@ -0,0 +1,19 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/datasets_utils.R +\name{get_wd_pcon_lad_la} +\alias{get_wd_pcon_lad_la} +\title{Get Ward-PCon-LAD-LA data} +\usage{ +get_wd_pcon_lad_la(year) +} +\arguments{ +\item{year}{last two digits of the year of the lookup, available years are: +2017, 2019, 2020, 2021, 2022, 2023, 2024} +} +\value{ +data.frame for the individual year of the lookup +} +\description{ +Helper function to extract data from the Ward-PCon-LAD-UTLA file +} +\keyword{internal} diff --git a/man/ons_geog_shorthands.Rd b/man/ons_geog_shorthands.Rd new file mode 100644 index 0000000..c33925a --- /dev/null +++ b/man/ons_geog_shorthands.Rd @@ -0,0 +1,31 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/datasets_documentation.R +\docType{data} +\name{ons_geog_shorthands} +\alias{ons_geog_shorthands} +\title{Lookup for ONS geography columns shorthands} +\format{ +\subsection{\code{ons_geog_shorthands}}{ + +A data frame with 7 rows and 3 columns: +\describe{ +\item{ons_level_shorthands}{ONS shorthands used in their lookup files} +\item{name_column}{DfE names for geography name columns} +\item{code_column}{DfE names for geography code columns} +} +} +} +\source{ +curated by explore.statistics@education.gov.uk +} +\usage{ +ons_geog_shorthands +} +\description{ +A lookup of ONS geography shorthands and their respective column names in +line with DfE open data standards. +} +\details{ +GOR (Government Office Region) was the predecessor to RGN. +} +\keyword{datasets} diff --git a/man/pretty_filesize.Rd b/man/pretty_filesize.Rd index 245017a..ea82c30 100644 --- a/man/pretty_filesize.Rd +++ b/man/pretty_filesize.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/pretty_filesize.R +% Please edit documentation in R/pretty.R \name{pretty_filesize} \alias{pretty_filesize} \title{Pretty numbers into readable file size} @@ -40,8 +40,8 @@ pretty_filesize(10^9) \seealso{ \code{\link[=comma_sep]{comma_sep()}} \code{\link[=round_five_up]{round_five_up()}} -Other prettying functions: +Other prettying: \code{\link{pretty_num}()}, \code{\link{pretty_time_taken}()} } -\concept{prettying functions} +\concept{prettying} diff --git a/man/pretty_num.Rd b/man/pretty_num.Rd index 3c01c23..aaeff8e 100644 --- a/man/pretty_num.Rd +++ b/man/pretty_num.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/pretty_num.R +% Please edit documentation in R/pretty.R \name{pretty_num} \alias{pretty_num} \title{Prettify big numbers into a readable format} @@ -78,8 +78,8 @@ unlist(lapply(vector, pretty_num, alt_na = "z")) \seealso{ \code{\link[=comma_sep]{comma_sep()}} \code{\link[=round_five_up]{round_five_up()}} \code{\link[=as.numeric]{as.numeric()}} -Other prettying functions: +Other prettying: \code{\link{pretty_filesize}()}, \code{\link{pretty_time_taken}()} } -\concept{prettying functions} +\concept{prettying} diff --git a/man/pretty_time_taken.Rd b/man/pretty_time_taken.Rd index e7b3655..c6321fd 100644 --- a/man/pretty_time_taken.Rd +++ b/man/pretty_time_taken.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/pretty_time_taken.R +% Please edit documentation in R/pretty.R \name{pretty_time_taken} \alias{pretty_time_taken} \title{Calculate elapsed time between two points and present prettily} @@ -42,8 +42,8 @@ pretty_time_taken(start, end) \seealso{ \code{\link[=comma_sep]{comma_sep()}} \code{\link[=round_five_up]{round_five_up()}} \code{\link[=as.POSIXct]{as.POSIXct()}} -Other prettying functions: +Other prettying: \code{\link{pretty_filesize}()}, \code{\link{pretty_num}()} } -\concept{prettying functions} +\concept{prettying} diff --git a/man/regions.Rd b/man/regions.Rd new file mode 100644 index 0000000..2ff0984 --- /dev/null +++ b/man/regions.Rd @@ -0,0 +1,35 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/datasets_documentation.R +\docType{data} +\name{regions} +\alias{regions} +\title{Lookup for valid region names and codes} +\format{ +\subsection{\code{regions}}{ + +A data frame with 16 rows and 2 columns: +\describe{ +\item{region_name}{Region name} +\item{region_code}{Region code} +} +} +} +\source{ +curated by explore.statistics@education.gov.uk, ONS codes sourced +from +https://geoportal.statistics.gov.uk/search?q=NAC_RGN +} +\usage{ +regions +} +\description{ +A lookup of ONS geography region names and codes for England. In their +lookups Northern Ireland, Scotland and Wales are regions. +} +\details{ +Also included inner and outer London county split as DfE frequently publish +those as regions, as well as some custom DfE names and codes. This is used +as the definitive list for the screening of open data before it is published +by the DfE. +} +\keyword{datasets} diff --git a/man/tidy_raw_lookup.Rd b/man/tidy_raw_lookup.Rd new file mode 100644 index 0000000..1468c29 --- /dev/null +++ b/man/tidy_raw_lookup.Rd @@ -0,0 +1,28 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/datasets_utils.R +\name{tidy_raw_lookup} +\alias{tidy_raw_lookup} +\title{Tidy a lookup file from the Open Geography Portal} +\usage{ +tidy_raw_lookup(raw_lookup_file) +} +\arguments{ +\item{raw_lookup_file}{data.frame of a lookup file downloaded from Open +Geography Portal, e.g. the output of \code{get_ons_api_data()}, or any other +data frame from R memory} +} +\value{ +a data frame of a tidied lookup file +Function to rename columns using the dfeR::ons_geog_shorthands table + +col_name single column name to be updated based on the shorthand +lookup table + +string for new column name if a match was found, if no match found +then the original name is returned +} +\description{ +Takes a file from the open geography portal and tidies it ready for +appending to an existing lookup +} +\keyword{internal} diff --git a/man/toggle_message.Rd b/man/toggle_message.Rd new file mode 100644 index 0000000..d50c987 --- /dev/null +++ b/man/toggle_message.Rd @@ -0,0 +1,38 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/toggle_message.R +\name{toggle_message} +\alias{toggle_message} +\title{Controllable console messages} +\usage{ +toggle_message(..., verbose) +} +\arguments{ +\item{...}{any message you would normally pass into \code{message()}. See +\code{\link{message}} for more details} + +\item{verbose}{logical, usually a variable passed from the function you are +using this within} +} +\description{ +Quick expansion to the \code{message()} function aimed for use in functions for +an easy addition of a global verbose TRUE / FALSE argument to toggle the +messages on or off +} +\examples{ +# Usually used in a function +my_function <- function(count_fingers, verbose) { + toggle_message("I have ", count_fingers, " fingers", verbose = verbose) + fingers_thumbs <- count_fingers + 2 + toggle_message("I have ", fingers_thumbs, " digits", verbose = verbose) +} + +my_function(5, verbose = FALSE) +my_function(5, verbose = TRUE) + +# Can be used in isolation +toggle_message("I want the world to read this!", verbose = TRUE) +toggle_message("I ain't gonna show this message!", verbose = FALSE) + +count_fingers <- 5 +toggle_message("I have ", count_fingers, " fingers", verbose = TRUE) +} diff --git a/man/wd_pcon_lad_la_rgn_ctry.Rd b/man/wd_pcon_lad_la_rgn_ctry.Rd new file mode 100644 index 0000000..f49e454 --- /dev/null +++ b/man/wd_pcon_lad_la_rgn_ctry.Rd @@ -0,0 +1,64 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/datasets_documentation.R +\docType{data} +\name{wd_pcon_lad_la_rgn_ctry} +\alias{wd_pcon_lad_la_rgn_ctry} +\title{Ward to Constituency to LAD to LA to Region to Country lookup} +\format{ +\subsection{\code{wd_pcon_lad_la_rgn_ctry}}{ + +A data frame with 24,629 rows and 14 columns: +\describe{ +\item{first_available_year_included}{ +First year in the lookups that we see this location +} +\item{most_recent_year_included}{ +Last year in the lookups that we see this location +} +\item{ward_name}{Ward name} +\item{pcon_name}{Parliamentary constituency name} +\item{lad_name}{Local authority district name} +\item{la_name}{Local authority name} +\item{region_name}{Region name} +\item{country_code}{Country name} +\item{ward_code}{9 digit ward code} +\item{pcon_code}{9 digit westminster constituency code} +\item{lad_code}{9 digit local authority district code} +\item{new_la_code}{9 digit local authority code} +\item{region_code}{9 digit region code} +\item{country_code}{9 digit country code} +} +} +} +\source{ +https://geoportal.statistics.gov.uk/search?tags=lup_wd_pcon_lad_utla +and https://geoportal.statistics.gov.uk/search?q=lup_wd_lad_cty_rgn_gor_ctry +} +\usage{ +wd_pcon_lad_la_rgn_ctry +} +\description{ +A lookup showing the hierarchy of ward to Westminster parliamentary +constituency to local authority district to local authority to region to +country for years 2017, 2019, 2020, 2021, 2022, 2023 and 2024. +} +\details{ +Changes we've made to the original lookup: +\enumerate{ +\item The original lookup from ONS uses the Upper Tier Local Authority, we then +update this so that where there is a metropolitan local authority we use the +local authority district as the local authority to match how +DfE publish data for local authorities. +\item We have noticed that in the 2017 version, the Glasgow East constituency +had a code of S1400030 instead of the usual S14000030, we've assumed this +was an error and have change this in our data so that Glasgow East is +S14000030 in 2017. +\item We have joined on regions using the Ward to LAD to County to Region file. +\item We have joined on countries based on the E / N / S / W at the start of +codes. +\item Scotland had no published regions in 2017, so given the rest of the years +have Scotland as the region, we've forced that in for 2017 too to complete +the data set. +} +} +\keyword{datasets} diff --git a/tests/testthat/test-data-ons_geog_shorthands.R b/tests/testthat/test-data-ons_geog_shorthands.R new file mode 100644 index 0000000..32fdc2f --- /dev/null +++ b/tests/testthat/test-data-ons_geog_shorthands.R @@ -0,0 +1,21 @@ +test_that("geog_shorthands is a data frame", { + expect_true(is.data.frame(dfeR::ons_geog_shorthands)) +}) + +test_that("geog_shorthands has the expected columns", { + # This is less of a unit test and more a test to remind us that if we break + # it, it may break other things! + expect_true( + all( + c("ons_level_shorthands", "name_column", "code_column") %in% + names(dfeR::ons_geog_shorthands) + ) + ) +}) + +test_that("rows and cols match description", { + # This test is more of a reminder when updating the data set, if these change + # then we need to update the description in R/datasets_documentation.R + expect_equal(nrow(dfeR::ons_geog_shorthands), 7) + expect_equal(ncol(dfeR::ons_geog_shorthands), 3) +}) diff --git a/tests/testthat/test-data-regions.R b/tests/testthat/test-data-regions.R new file mode 100644 index 0000000..cf94670 --- /dev/null +++ b/tests/testthat/test-data-regions.R @@ -0,0 +1,18 @@ +test_that("regions is a data frame", { + expect_true(is.data.frame(dfeR::regions)) +}) + +test_that("rows and cols match description", { + # This test is more of a reminder when updating the data set, if these change + # then we need to update the description in R/datasets_documentation.R + expect_equal(nrow(dfeR::regions), 16) + expect_equal(ncol(dfeR::regions), 2) +}) + +test_that("There are no blank cells", { + expect_false(any(is.na(dfeR::regions))) +}) + +test_that("There are no duplicate rows", { + expect_true(!anyDuplicated(dfeR::regions)) +}) diff --git a/tests/testthat/test-data-wd_pcon_lad_la_rgn_ctry.R b/tests/testthat/test-data-wd_pcon_lad_la_rgn_ctry.R new file mode 100644 index 0000000..c529131 --- /dev/null +++ b/tests/testthat/test-data-wd_pcon_lad_la_rgn_ctry.R @@ -0,0 +1,57 @@ +test_that("wd_pcon_lad_la_rgn_ctry is a data frame", { + expect_true(is.data.frame(dfeR::wd_pcon_lad_la_rgn_ctry)) +}) + +test_that("There are no blank cells", { + expect_false(any(is.na(dfeR::wd_pcon_lad_la_rgn_ctry))) +}) + +test_that("There are no duplicate rows", { + expect_true(!anyDuplicated(dfeR::wd_pcon_lad_la_rgn_ctry)) +}) + +test_that("time cols are always 4 digit numbers", { + expect_true( + all(grepl( + "^\\d{4}$", + dfeR::wd_pcon_lad_la_rgn_ctry$first_available_year_included + )) + ) + expect_true( + all(grepl( + "^\\d{4}$", dfeR::wd_pcon_lad_la_rgn_ctry$most_recent_year_included + )) + ) +}) + +test_that("code cols are always a 9 digit code", { + # Get column names ending in _code + code_columns <- tidyselect::ends_with( + "_code", + vars = colnames(dfeR::wd_pcon_lad_la_rgn_ctry) + ) + + # Check the format for each code column + for (col in code_columns) { + expect_true( + all(grepl("^[A-Z]\\d{8}$", dfeR::wd_pcon_lad_la_rgn_ctry[[col]])) + ) + } +}) + +test_that("rows and cols match description", { + # This test is more of a reminder when updating the data set, if these change + # then we need to update the description in R/datasets_documentation.R + expect_equal(nrow(dfeR::wd_pcon_lad_la_rgn_ctry), 24629) + expect_equal(ncol(dfeR::wd_pcon_lad_la_rgn_ctry), 14) + + expected_columns <- c( + "first_available_year_included", "most_recent_year_included", + "ward_name", "pcon_name", "lad_name", "la_name", + "region_name", "country_name", + "ward_code", "pcon_code", "lad_code", "new_la_code", + "region_code", "country_code" + ) + + expect_equal(names(dfeR::wd_pcon_lad_la_rgn_ctry), expected_columns) +}) diff --git a/tests/testthat/test-data_countries.R b/tests/testthat/test-data_countries.R new file mode 100644 index 0000000..5ef7ef3 --- /dev/null +++ b/tests/testthat/test-data_countries.R @@ -0,0 +1,18 @@ +test_that("countries is a data frame", { + expect_true(is.data.frame(dfeR::countries)) +}) + +test_that("rows and cols match description", { + # This test is more of a reminder when updating the data set, if these change + # then we need to update the description in R/datasets_documentation.R + expect_equal(nrow(dfeR::countries), 10) + expect_equal(ncol(dfeR::countries), 2) +}) + +test_that("There are no blank cells", { + expect_false(any(is.na(dfeR::countries))) +}) + +test_that("There are no duplicate rows", { + expect_true(!anyDuplicated(dfeR::countries)) +}) diff --git a/tests/testthat/test-fetch_countries.R b/tests/testthat/test-fetch_countries.R new file mode 100644 index 0000000..70ab8b0 --- /dev/null +++ b/tests/testthat/test-fetch_countries.R @@ -0,0 +1,7 @@ +test_that("Gives a data frame", { + expect_true(is.data.frame(fetch_countries())) +}) + +test_that("Has no duplicate rows", { + expect_true(!anyDuplicated(fetch_countries())) +}) diff --git a/tests/testthat/test-fetch_lads.R b/tests/testthat/test-fetch_lads.R new file mode 100644 index 0000000..07ecdd1 --- /dev/null +++ b/tests/testthat/test-fetch_lads.R @@ -0,0 +1,44 @@ +test_that("Gives a data frame", { + expect_true(is.data.frame(fetch_lads())) +}) + +test_that("Has no duplicate rows", { + expect_true(!anyDuplicated(fetch_lads())) +}) + +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# These tests will fail if there are genuine changes to the locations +# Counts of locations done manually from the data screener repo lookup we had +# +# Did this kind of thing against the screener lookup file to get the numbers +# Make a new column for in_2022 with =AND(2022 >= $A2, 2022 <= $B2) +# Filter to TRUE values only and remove duplcates + +test_that("2024 locations match what we expect", { + expect_equal(nrow(fetch_lads(2024)), 361) + expect_equal(nrow(fetch_lads(2024, c("England", "Wales"))), 318) + expect_equal(nrow(fetch_lads(2024, "England")), 296) + expect_equal(nrow(fetch_lads(2024, "Scotland")), 32) + expect_equal(nrow(fetch_lads(2024, "Wales")), 22) + expect_equal(nrow(fetch_lads(2024, "Northern Ireland")), 11) +}) + +# Checking an extra year so we know the year filtering works for past years +test_that("2022 locations match what we expect", { + expect_equal(nrow(fetch_lads(2022)), 374) + expect_equal(nrow(fetch_lads(2022, c("England", "Wales"))), 331) + expect_equal(nrow(fetch_lads(2022, "England")), 309) + expect_equal(nrow(fetch_lads(2022, "Scotland")), 32) + expect_equal(nrow(fetch_lads(2022, "Wales")), 22) + expect_equal(nrow(fetch_lads(2022, "Northern Ireland")), 11) +}) + +# Checking the first year so we know the year filtering works +test_that("2017 locations match what we expect", { + expect_equal(nrow(fetch_lads(2017)), 391) + expect_equal(nrow(fetch_lads(2017, c("England", "Wales"))), 348) + expect_equal(nrow(fetch_lads(2017, "England")), 326) + expect_equal(nrow(fetch_lads(2017, "Scotland")), 32) + expect_equal(nrow(fetch_lads(2017, "Wales")), 22) + expect_equal(nrow(fetch_lads(2017, "Northern Ireland")), 11) +}) diff --git a/tests/testthat/test-fetch_las.R b/tests/testthat/test-fetch_las.R new file mode 100644 index 0000000..7741128 --- /dev/null +++ b/tests/testthat/test-fetch_las.R @@ -0,0 +1,44 @@ +test_that("Gives a data frame", { + expect_true(is.data.frame(fetch_las())) +}) + +test_that("Has no duplicate rows", { + expect_true(!anyDuplicated(fetch_las())) +}) + +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# These tests will fail if there are genuine changes to the locations +# Counts of locations done manually from the data screener repo lookup we had +# +# Did this kind of thing against the screener lookup file to get the numbers +# Make a new column for in_2022 with =AND(2022 >= $A2, 2022 <= $B2) +# Filter to TRUE values only and remove duplcates + +test_that("2024 locations match what we expect", { + expect_equal(nrow(fetch_las(2024)), 218) + expect_equal(nrow(fetch_las(2024, c("England", "Scotland", "Wales"))), 207) + expect_equal(nrow(fetch_las(2024, "England")), 153) + expect_equal(nrow(fetch_las(2024, "Scotland")), 32) + expect_equal(nrow(fetch_las(2024, "Wales")), 22) + expect_equal(nrow(fetch_las(2024, "Northern Ireland")), 11) +}) + +# Checking an extra year so we know the year filtering works for past years +test_that("2022 locations match what we expect", { + expect_equal(nrow(fetch_las(2022)), 217) + expect_equal(nrow(fetch_las(2022, c("England", "Scotland", "Wales"))), 206) + expect_equal(nrow(fetch_las(2022, "England")), 152) + expect_equal(nrow(fetch_las(2022, "Scotland")), 32) + expect_equal(nrow(fetch_las(2022, "Wales")), 22) + expect_equal(nrow(fetch_las(2022, "Northern Ireland")), 11) +}) + +# Checking the first year so we know the year filtering works +test_that("2017 locations match what we expect", { + expect_equal(nrow(fetch_las(2017)), 217) + expect_equal(nrow(fetch_las(2017, c("England", "Scotland", "Wales"))), 206) + expect_equal(nrow(fetch_las(2017, "England")), 152) + expect_equal(nrow(fetch_las(2017, "Scotland")), 32) + expect_equal(nrow(fetch_las(2017, "Wales")), 22) + expect_equal(nrow(fetch_las(2017, "Northern Ireland")), 11) +}) diff --git a/tests/testthat/test-fetch_pcons.R b/tests/testthat/test-fetch_pcons.R new file mode 100644 index 0000000..0a84e64 --- /dev/null +++ b/tests/testthat/test-fetch_pcons.R @@ -0,0 +1,49 @@ +test_that("fetch_locations gives a data frame", { + expect_true(is.data.frame(fetch_pcons())) +}) + +test_that("fetch_locations have no duplicate rows", { + expect_true(!anyDuplicated(fetch_pcons())) +}) + +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# These tests will fail if there are genuine changes to the locations +# Counts of locations done manually from the data screener repo lookup we had +test_that("2024 locations match what we expect", { + # Used the parly website to get numbers + # https://www.parliament.uk/about/how/elections-and-voting/constituencies/ + expect_equal(nrow(fetch_pcons(2024)), 650) + expect_equal(nrow(fetch_pcons(2024, c("England", "Scotland"))), 600) + expect_equal(nrow(fetch_pcons(2024, "England")), 543) + expect_equal(nrow(fetch_pcons(2024, "Scotland")), 57) + expect_equal(nrow(fetch_pcons(2024, "Wales")), 32) + expect_equal(nrow(fetch_pcons(2024, "Northern Ireland")), 18) +}) + +# Checking an extra year so we know the year filtering works for past years +test_that("2022 locations match what we expect", { + # Did this kind of thing against the screener lookup file to get the numbers + # Make a new column for in_2022 with =AND(2022 >= $A2, 2022 <= $B2) + # Filter to TRUE values only and remove duplcates + + expect_equal(nrow(fetch_pcons(2022)), 650) + expect_equal(nrow(fetch_pcons(2022, c("England", "Scotland"))), 592) + expect_equal(nrow(fetch_pcons(2022, "England")), 533) + expect_equal(nrow(fetch_pcons(2022, "Scotland")), 59) + expect_equal(nrow(fetch_pcons(2022, "Wales")), 40) + expect_equal(nrow(fetch_pcons(2022, "Northern Ireland")), 18) +}) + +# Checking the first year so we know the year filtering works +test_that("2017 locations match what we expect", { + # Did this kind of thing against the screener lookup file to get the numbers + # Make a new column for in_2017 with =AND(2017 >= $A2, 2017 <= $B2) + # Filter to TRUE values only and remove duplcates + + expect_equal(nrow(fetch_pcons(2017)), 650) + expect_equal(nrow(fetch_pcons(2017, c("England", "Scotland"))), 592) + expect_equal(nrow(fetch_pcons(2017, "England")), 533) + expect_equal(nrow(fetch_pcons(2017, "Scotland")), 59) + expect_equal(nrow(fetch_pcons(2017, "Wales")), 40) + expect_equal(nrow(fetch_pcons(2017, "Northern Ireland")), 18) +}) diff --git a/tests/testthat/test-fetch_regions.R b/tests/testthat/test-fetch_regions.R new file mode 100644 index 0000000..0e3b5ae --- /dev/null +++ b/tests/testthat/test-fetch_regions.R @@ -0,0 +1,7 @@ +test_that("Gives a data frame", { + expect_true(is.data.frame(fetch_regions())) +}) + +test_that("Has no duplicate rows", { + expect_true(!anyDuplicated(fetch_regions())) +}) diff --git a/tests/testthat/test-fetch_wards.R b/tests/testthat/test-fetch_wards.R new file mode 100644 index 0000000..d6aa6fe --- /dev/null +++ b/tests/testthat/test-fetch_wards.R @@ -0,0 +1,7 @@ +test_that("Gives a data frame", { + expect_true(is.data.frame(fetch_wards())) +}) + +test_that("Has no duplicate rows", { + expect_true(!anyDuplicated(fetch_wards())) +})