4747get_census <- function (dataset , regions , level = NA , vectors = c(), geo_format = NA , labels = " detailed" ,
4848 use_cache = TRUE , quiet = FALSE , api_key = Sys.getenv(" CM_API_KEY" )) {
4949 api_key <- robust_api_key(api_key )
50- have_api_key <- ! is.null (api_key )
50+ have_api_key <- valid_api_key (api_key )
5151 result <- NULL
5252
5353 if (is.na(level )) level = " Regions"
@@ -163,6 +163,7 @@ get_census <- function (dataset, regions, level=NA, vectors=c(), geo_format = NA
163163 if (! quiet ) message(" Reading geo data from local cache." )
164164 }
165165 geos <- geojsonsf :: geojson_sf(geo_file ) %> %
166+ sf :: st_sf() %> % # ust in case
166167 transform_geo(level )
167168
168169 result <- if (is.null(result )) {
@@ -408,6 +409,57 @@ handle_cm_status_code <- function(response,path){
408409}
409410
410411
412+ name_change_for_level <- function (level ){
413+ if (level == ' DB' ) {
414+ name_change <- c(' DA_UID' = ' rpid' ,
415+ ' CSD_UID' = ' rgid' ,
416+ ' CT_UID' = ' ruid' ,
417+ ' CMA_UID' = ' rguid' )
418+ } else if (level == ' DA' | level == ' EA' ) {
419+ name_change <- c(' CSD_UID' = ' rpid' ,
420+ ' CD_UID' = ' rgid' ,
421+ ' CT_UID' = ' ruid' ,
422+ ' CMA_UID' = ' rguid' )
423+ } else if (level == ' CT' ) {
424+ name_change <- c(' CMA_UID' = ' rpid' ,
425+ ' PR_UID' = ' rgid' ,
426+ ' CSD_UID' = ' ruid' ,
427+ ' CD_UID' = ' rguid' )
428+ } else if (level == ' CSD' ) {
429+ name_change <- c(' CD_UID' = ' rpid' ,
430+ ' PR_UID' = ' rgid' ,
431+ ' CMA_UID' = ' ruid' )
432+ } else if (level == ' CD' ) {
433+ name_change <- c(' PR_UID' = ' rpid' ,
434+ ' C_UID' = ' rgid' )
435+ } else if (level == ' CMA' ) {
436+ name_change <- c(' PR_UID' = ' rpid' ,
437+ ' C_UID' = ' rgid' )
438+ } else if (level == ' PR' ) {
439+ name_change <- c(' C_UID' = ' rpid' )
440+ } else {
441+ name_change <- c()
442+ warning(paste0(" Unknown level " ,level ))
443+ }
444+ name_change
445+ }
446+
447+ base_name_change <- c(" GeoUID" = " id" ,
448+ " Shape Area" = " a" ,
449+ " Type" = " t" ,
450+ " Dwellings" = " dw" ,
451+ " Households" = " hh" ,
452+ " Population" = " pop" ,
453+ " Adjusted Population (previous Census)" = " pop2" ,
454+ " NHS Non-Return Rate" = " nrr" ,
455+ " Quality Flags" = " q" ,
456+ " Population 2011" = " pop11" ,
457+ " Population 2016" = " pop16" ,
458+ " Households 2011" = " hh11" ,
459+ " Households 2016" = " hh16" ,
460+ " Dwellings 2011" = " dw11" ,
461+ " Dwellings 2016" = " dw16" )
462+
411463# Transform and rename geometry data.
412464transform_geo <- function (g , level ) {
413465 as_character = c(" id" ," rpid" ," rgid" ," ruid" ," rguid" ," q" )
@@ -416,68 +468,32 @@ transform_geo <- function(g, level) {
416468 as_integer = c(" pop" ," dw" ," hh" ," pop2" ," pop11" ," pop16" ," hh11" ," hh16" ," dw11" ," dw16" )
417469 # as_character=c(as_character,as_numeric,as_integer)
418470
471+ to_remove <- c(" rpid" ," rgid" ," ruid" ," rguid" )
472+ to_rename <- base_name_change [as.character(base_name_change ) %in% names(g )]
473+
419474 g <- g %> %
420475 dplyr :: mutate_at(dplyr :: intersect(names(g ), as_character ), as.character ) %> %
421476 dplyr :: mutate_at(dplyr :: intersect(names(g ), as_numeric ), as.numeric ) %> %
422477 dplyr :: mutate_at(dplyr :: intersect(names(g ), as_integer ), as.int ) %> %
423- dplyr :: mutate_at(dplyr :: intersect(names(g ), as_factor ), as.factor )
424-
425- # Change names
426- # Standard table
427- name_change <- dplyr :: tibble(
428- old = c(" id" ," a" ," t" ," dw" ," hh" ," pop" ," pop2" ," nrr" ," q" ," pop11" ," pop16" ," hh11" ," hh16" ," dw11" ," dw16" ),
429- new = c(" GeoUID" ," Shape Area" ," Type" ," Dwellings" ," Households" ," Population" ," Adjusted Population (previous Census)" ," NHS Non-Return Rate" ," Quality Flags" ," Population 2011" ," Population 2016" ," Households 2011" ," Households 2016" ," Dwellings 2011" ," Dwellings 2016" )
430- )
431- # Geo UID name changes
432- if (level == ' Regions' ) {
433- l = g $ t %> % unique()
434- if (length(l )== 1 ) level = l
435- }
436- if (level == ' DB' ) {
437- name_change <- name_change %> % rbind(
438- c(' rpid' ,' DA_UID' ),
439- c(' rgid' ,' CSD_UID' ),
440- c(' ruid' ,' CT_UID' ),
441- c(' rguid' ,' CMA_UID' ))
478+ dplyr :: mutate_at(dplyr :: intersect(names(g ), as_factor ), as.factor ) %> %
479+ dplyr :: rename(!! to_rename )
480+
481+ if (level != " Regions" ) {
482+ rc <- name_change_for_level(level )[as.character(name_change_for_level(level )) %in% names(g )]
483+ if (length(rc )> 0 ) g <- g %> % dplyr :: rename(!!! rc )
484+ } else if (" Type" %in% names(g )) {
485+ g <- g $ Type %> %
486+ unique %> %
487+ lapply(function (t ){
488+ g <- g %> % dplyr :: filter(.data $ Type == t )
489+ rc <- name_change_for_level(t )[as.character(name_change_for_level(t )) %in% names(g )]
490+ if (length(rc )> 0 ) g <- g %> % dplyr :: rename(!!! rc )
491+ g
492+ }) %> %
493+ do.call(rbind ,. ) %> %
494+ dplyr :: select(- dplyr :: one_of(to_remove [to_remove %in% names(. )]))
442495 }
443- if (level == ' DA' | level == ' EA' ) {
444- name_change <- name_change %> % rbind(
445- c(' rpid' ,' CSD_UID' ),
446- c(' rgid' ,' CD_UID' ),
447- c(' ruid' ,' CT_UID' ),
448- c(' rguid' ,' CMA_UID' ))
449- }
450- if (level == ' CT' ) {
451- name_change <- name_change %> % rbind(
452- c(' rpid' ,' CMA_UID' ),
453- c(' rgid' ,' PR_UID' ),
454- c(' ruid' ,' CSD_UID' ),
455- c(' rguid' ,' CD_UID' ))
456- }
457- if (level == ' CSD' ) {
458- name_change <- name_change %> % rbind(
459- c(' rpid' ,' CD_UID' ),
460- c(' rgid' ,' PR_UID' ),
461- c(' ruid' ,' CMA_UID' ))
462- }
463- if (level == ' CD' ) {
464- name_change <- name_change %> % rbind(c(' rpid' ,' PR_UID' ),c(' rgid' ,' C_UID' ))
465- }
466- if (level == ' CMA' ) {
467- name_change <- name_change %> % rbind(c(' rpid' ,' PR_UID' ),c(' rgid' ,' C_UID' ))
468- }
469- if (level == ' PR' ) {
470- name_change <- name_change %> % rbind(c(' rpid' ,' C_UID' ))
471- }
472-
473- used_names <- name_change %> %
474- dplyr :: filter(.data $ old %in% names(g ))
475-
476- if (nrow(used_names )> 0 ) g <- g %> %
477- dplyr :: rename(!!! setNames(used_names $ old ,used_names $ new ))
478496
479- to_remove <- dplyr :: intersect(names(g ),c(" rpid" ," rgid" ," ruid" ," rguid" ))
480- if (length(to_remove )> 0 ) g <- g %> % dplyr :: select(- dplyr :: one_of(to_remove ))
481497
482498 return (g )
483499}
0 commit comments