Skip to contents

Indices of Multiple Deprivation (IMD)

To get the IMD scores (raw scores and ranked deciles) for a dataset run the following code to generate some random example postcodes:


tibble_postcodes <- tibble::tibble(postcode = c("HD1 2UT", "HD1 2UU", "HD1 2UV"))

tibble_postcodes
#> # A tibble: 3 × 1
#>   postcode
#>   <chr>   
#> 1 HD1 2UT 
#> 2 HD1 2UU 
#> 3 HD1 2UV

Then, using the get_data() function for a vector:

# Execution halted
NHSRpopulation::get_data(postcodes) |>
  dplyr::select(
    new_postcode,
    result_type,
    lsoa_code
  )
#> ℹ The following postcodes are terminated:
#>   HD1 2UT
#>   and have been replaced with these current postcodes:
#>   HD1 2RD
#> ℹ The following postcodes are invalid:
#>   HD1 2UV
#>   and have been replaced with these nearby postcodes:
#>   HD1 2UD
#> Error in `dplyr::select()`:
#> ! Can't select columns that don't exist.
#> ✖ Column `postcode` doesn't exist.

Or with a data frame:

NHSRpopulation::get_data(tibble_postcodes) |>
  dplyr::select(
    postcode,
    new_postcode,
    result_type,
    lsoa_code
  )
#> ℹ The following postcodes are terminated:
#>   HD1 2UT
#>   and have been replaced with these current postcodes:
#>   HD1 2RD
#> ℹ The following postcodes are invalid:
#>   HD1 2UV
#>   and have been replaced with these nearby postcodes:
#>   HD1 2UD
#> Joining with `by = join_by(postcode)`
#> # A tibble: 3 × 4
#>   postcode new_postcode result_type   lsoa_code
#>   <chr>    <chr>        <chr>         <chr>    
#> 1 HD1 2UT  HD1 2RD      terminated    E01011107
#> 2 HD1 2UU  HD1 2UU      valid         E01011229
#> 3 HD1 2UV  HD1 2UD      autocompleted E01011229

Note that this function uses the {NHSRpostcodetools} package to offer the opportunity to fix postcodes which are terminated or are incorrect. This is default and appears in the column new_postcode and does not overwrite the original postcode column. Switching off this automatic fix can be done with the code and will accept both vectors and data frames:

NHSRpopulation::get_data(tibble_postcodes, fix_invalid = FALSE) |>
  dplyr::select(
    postcode,
    new_postcode,
    result_type,
    lsoa_code
  )
#> ℹ The following postcodes are invalid:
#>   HD1 2UT
#>   but have not been successfully replaced with valid codes.
#>   The following postcodes are invalid:
#>   HD1 2UV
#>   but have not been successfully replaced with valid codes.
#> Joining with `by = join_by(postcode)`
#> # A tibble: 3 × 4
#>   postcode new_postcode result_type lsoa_code
#>   <chr>    <chr>        <chr>       <chr>    
#> 1 HD1 2UT  <NA>         <NA>        <NA>     
#> 2 HD1 2UU  HD1 2UU      valid       E01011229
#> 3 HD1 2UV  <NA>         <NA>        <NA>

Index of Multiple Deprivation

# Note that the third LSOA in this list is incorrect on purpose
imd <- c("E01011107", "E01011229", "E01002")

tibble_imd <- imd |>
  tibble::as_tibble() |>
  dplyr::rename(lsoa11 = value)

tibble_imd
#> # A tibble: 3 × 1
#>   lsoa11   
#>   <chr>    
#> 1 E01011107
#> 2 E01011229
#> 3 E01002

Using the same function but with a parameter/argument to return IMD data:

NHSRpopulation::get_data(tibble_imd, url_type = "imd") |>
  dplyr::select(
    lsoa11,
    imd_rank,
    imd_decile,
    imd_score
  )
#> # A tibble: 3 × 4
#>   lsoa11    imd_rank imd_decile imd_score
#>   <chr>        <int>      <int>     <dbl>
#> 1 E01011107     2928          1      45.6
#> 2 E01011229     9558          3      27.0
#> 3 E01002          NA         NA      NA

Data can be either vectors or data frames.

No corrections are made to incorrect LSOA codes.

Column names

Where data frames are used the expectation of the functions is that postcodes will be in a column called postcode and IMD will be from lsoa11, however, this can be overwritten:

The argument/parameter column = can be used to set the column name:

# Create datasets
pcs_tb <- dplyr::tibble(
  pcs = postcodes
)

pcs_tb
#> # A tibble: 3 × 1
#>   pcs    
#>   <chr>  
#> 1 HD1 2UT
#> 2 HD1 2UU
#> 3 HD1 2UV

NHSRpopulation::get_data(pcs_tb,
  column = "pcs"
)
#> ℹ The following postcodes are terminated:
#>   HD1 2UT
#>   and have been replaced with these current postcodes:
#>   HD1 2RD
#> ℹ The following postcodes are invalid:
#>   HD1 2UV
#>   and have been replaced with these nearby postcodes:
#>   HD1 2UD
#> Joining with `by = join_by(pcs)`
#> # A tibble: 3 × 40
#>   pcs     new_postcode result_type   quality eastings northings country nhs_ha    longitude latitude european_electoral_r…¹ primary_care_trust region lsoa  msoa  incode
#>   <chr>   <chr>        <chr>           <int>    <int>     <int> <chr>   <chr>         <dbl>    <dbl> <chr>                  <chr>              <chr>  <chr> <chr> <chr> 
#> 1 HD1 2UT HD1 2RD      terminated          1   414639    416430 England Yorkshir…     -1.78     53.6 Yorkshire and The Hum… Kirklees           Yorks… Kirk… Kirk… 2RD   
#> 2 HD1 2UU HD1 2UU      valid               1   414433    416422 England Yorkshir…     -1.78     53.6 Yorkshire and The Hum… Kirklees           Yorks… Kirk… Kirk… 2UU   
#> 3 HD1 2UV HD1 2UD      autocompleted       1   414371    416317 England Yorkshir…     -1.78     53.6 Yorkshire and The Hum… Kirklees           Yorks… Kirk… Kirk… 2UD   
#> # ℹ abbreviated name: ¹​european_electoral_region
#> # ℹ 24 more variables: outcode <chr>, parliamentary_constituency <chr>, parliamentary_constituency_2024 <chr>, admin_district <chr>, parish <chr>,
#> #   date_of_introduction <chr>, admin_ward <chr>, ccg <chr>, nuts <chr>, pfa <chr>, admin_district_code <chr>, admin_county_code <chr>, admin_ward_code <chr>,
#> #   parish_code <chr>, parliamentary_constituency_code <chr>, parliamentary_constituency_2024_code <chr>, ccg_code <chr>, ccg_id_code <chr>, ced_code <chr>,
#> #   nuts_code <chr>, lsoa_code <chr>, msoa_code <chr>, lau2_code <chr>, pfa_code <chr>

lsoa_tb <- dplyr::tibble(
  lower_soa = imd
)

lsoa_tb
#> # A tibble: 3 × 1
#>   lower_soa
#>   <chr>    
#> 1 E01011107
#> 2 E01011229
#> 3 E01002

NHSRpopulation::get_data(lsoa_tb,
  column = "lower_soa"
)
#> # A tibble: 3 × 66
#>   lower_soa   fid lsoa11nm  lsoa11nmw st_areasha st_lengths imd_rank imd_decile lsoa01nm la_dcd la_dnm imd_score imd_rank0 imd_dec0 inc_score inc_rank inc_dec emp_score
#>   <chr>     <int> <chr>     <chr>          <dbl>      <dbl>    <int>      <int> <chr>    <chr>  <chr>      <dbl>     <int>    <int>     <dbl>    <int>   <int>     <dbl>
#> 1 E01011107 11200 Kirklees… Kirklees…   1921709.      7525.     2928          1 Kirklee… E0800… Kirkl…      45.6      2928        1     0.256     3753       2     0.176
#> 2 E01011229 11707 Kirklees… Kirklees…    833130.      7023.     9558          3 Kirklee… E0800… Kirkl…      27.0      9558        3     0.092    17587       6     0.068
#> 3 E01002       NA <NA>      <NA>             NA         NA        NA         NA <NA>     <NA>   <NA>        NA          NA       NA    NA           NA      NA    NA    
#> # ℹ 48 more variables: emp_rank <int>, emp_dec <int>, edu_score <dbl>, edu_rank <int>, edu_dec <int>, hdd_score <dbl>, hdd_rank <int>, hdd_dec <int>, cri_score <dbl>,
#> #   cri_rank <int>, cri_dec <int>, bhs_score <dbl>, bhs_rank <int>, bhs_dec <int>, env_score <dbl>, env_rank <int>, env_dec <int>, idc_score <dbl>, idc_rank <int>,
#> #   idc_dec <int>, ido_score <dbl>, ido_rank <int>, ido_dec <int>, cyp_score <dbl>, cyp_rank <int>, cyp_dec <int>, as_score <dbl>, as_rank <int>, as_dec <int>,
#> #   gb_score <dbl>, gb_rank <int>, gb_dec <int>, wb_score <dbl>, wb_rank <int>, wb_dec <int>, ind_score <dbl>, ind_rank <int>, ind_dec <int>, out_score <dbl>,
#> #   out_rank <int>, out_dec <int>, tot_pop <int>, dep_chi <int>, pop16_59 <int>, pop60 <int>, work_pop <dbl>, shape_area <dbl>, shape_length <dbl>

Getting IMD data from postcodes

If the data has postcodes (which automatically connects to the postcode API) and IMD information is wanted, the argument/parameter url_type == "imd" will override the returned data to IMD.

NHSRpopulation::get_data(tibble_postcodes, 
                         url_type = "imd")
#> ℹ The following postcodes are terminated:
#>   HD1 2UT
#>   and have been replaced with these current postcodes:
#>   HD1 2RD
#> ℹ The following postcodes are invalid:
#>   HD1 2UV
#>   and have been replaced with these nearby postcodes:
#>   HD1 2UD
#> Joining with `by = join_by(postcode)`
#> # A tibble: 3 × 105
#>   postcode new_postcode result_type   quality eastings northings country nhs_ha   longitude latitude european_electoral_r…¹ primary_care_trust region lsoa  msoa  incode
#>   <chr>    <chr>        <chr>           <int>    <int>     <int> <chr>   <chr>        <dbl>    <dbl> <chr>                  <chr>              <chr>  <chr> <chr> <chr> 
#> 1 HD1 2UT  HD1 2RD      terminated          1   414639    416430 England Yorkshi…     -1.78     53.6 Yorkshire and The Hum… Kirklees           Yorks… Kirk… Kirk… 2RD   
#> 2 HD1 2UU  HD1 2UU      valid               1   414433    416422 England Yorkshi…     -1.78     53.6 Yorkshire and The Hum… Kirklees           Yorks… Kirk… Kirk… 2UU   
#> 3 HD1 2UV  HD1 2UD      autocompleted       1   414371    416317 England Yorkshi…     -1.78     53.6 Yorkshire and The Hum… Kirklees           Yorks… Kirk… Kirk… 2UD   
#> # ℹ abbreviated name: ¹​european_electoral_region
#> # ℹ 89 more variables: outcode <chr>, parliamentary_constituency <chr>, parliamentary_constituency_2024 <chr>, admin_district <chr>, parish <chr>,
#> #   date_of_introduction <chr>, admin_ward <chr>, ccg <chr>, nuts <chr>, pfa <chr>, admin_district_code <chr>, admin_county_code <chr>, admin_ward_code <chr>,
#> #   parish_code <chr>, parliamentary_constituency_code <chr>, parliamentary_constituency_2024_code <chr>, ccg_code <chr>, ccg_id_code <chr>, ced_code <chr>,
#> #   nuts_code <chr>, lsoa_code <chr>, msoa_code <chr>, lau2_code <chr>, pfa_code <chr>, fid <int>, lsoa11nm <chr>, lsoa11nmw <chr>, st_areasha <dbl>, st_lengths <dbl>,
#> #   imd_rank <int>, imd_decile <int>, lsoa01nm <chr>, la_dcd <chr>, la_dnm <chr>, imd_score <dbl>, imd_rank0 <int>, imd_dec0 <int>, inc_score <dbl>, inc_rank <int>,
#> #   inc_dec <int>, emp_score <dbl>, emp_rank <int>, emp_dec <int>, edu_score <dbl>, edu_rank <int>, edu_dec <int>, hdd_score <dbl>, hdd_rank <int>, hdd_dec <int>, …

Note that the postcode data is still validated.

NHSRpopulation::get_data(tibble_postcodes, 
                         url_type = "imd",
                         fix_invalid = FALSE)
#> ℹ The following postcodes are invalid:
#>   HD1 2UT
#>   but have not been successfully replaced with valid codes.
#>   The following postcodes are invalid:
#>   HD1 2UV
#>   but have not been successfully replaced with valid codes.
#> Joining with `by = join_by(postcode)`
#> # A tibble: 3 × 105
#>   postcode new_postcode result_type quality eastings northings country nhs_ha     longitude latitude european_electoral_r…¹ primary_care_trust region lsoa  msoa  incode
#>   <chr>    <chr>        <chr>         <int>    <int>     <int> <chr>   <chr>          <dbl>    <dbl> <chr>                  <chr>              <chr>  <chr> <chr> <chr> 
#> 1 HD1 2UT  <NA>         <NA>             NA       NA        NA <NA>    <NA>           NA        NA   <NA>                   <NA>               <NA>   <NA>  <NA>  <NA>  
#> 2 HD1 2UU  HD1 2UU      valid             1   414433    416422 England Yorkshire…     -1.78     53.6 Yorkshire and The Hum… Kirklees           Yorks… Kirk… Kirk… 2UU   
#> 3 HD1 2UV  <NA>         <NA>             NA       NA        NA <NA>    <NA>           NA        NA   <NA>                   <NA>               <NA>   <NA>  <NA>  <NA>  
#> # ℹ abbreviated name: ¹​european_electoral_region
#> # ℹ 89 more variables: outcode <chr>, parliamentary_constituency <chr>, parliamentary_constituency_2024 <chr>, admin_district <chr>, parish <chr>,
#> #   date_of_introduction <chr>, admin_ward <chr>, ccg <chr>, nuts <chr>, pfa <chr>, admin_district_code <chr>, admin_county_code <chr>, admin_ward_code <chr>,
#> #   parish_code <chr>, parliamentary_constituency_code <chr>, parliamentary_constituency_2024_code <chr>, ccg_code <chr>, ccg_id_code <chr>, ced_code <chr>,
#> #   nuts_code <chr>, lsoa_code <chr>, msoa_code <chr>, lau2_code <chr>, pfa_code <chr>, fid <int>, lsoa11nm <chr>, lsoa11nmw <chr>, st_areasha <dbl>, st_lengths <dbl>,
#> #   imd_rank <int>, imd_decile <int>, lsoa01nm <chr>, la_dcd <chr>, la_dnm <chr>, imd_score <dbl>, imd_rank0 <int>, imd_dec0 <int>, inc_score <dbl>, inc_rank <int>,
#> #   inc_dec <int>, emp_score <dbl>, emp_rank <int>, emp_dec <int>, edu_score <dbl>, edu_rank <int>, edu_dec <int>, hdd_score <dbl>, hdd_rank <int>, hdd_dec <int>, …