publicdata.au republishes Australian government open data that the
publishers already release under open licences. It keeps every version
at a URL that never changes, serves each one in twelve formats, and
answers queries over the whole table. This package reads all of it from
R. Every function takes a dataset’s slug, the part of its page’s URL
after /d/.
pd_datasets() searches what the site serves, and filters
by publisher, topic and government.
pd_datasets("road crashes")[, c("slug", "title")]
#> # A tibble: 12 × 2
#> slug title
#> <chr> <chr>
#> 1 act-road-crashes Road crashes, ACT
#> 2 qld-road-casualties Road casualties, Queensland
#> 3 qld-road-crash-restraint-helmet-use Seatbelt and helmet use in road crash casualties, …
#> 4 qld-road-crash-locations Road crash locations, Queensland
#> 5 qld-road-crash-vehicle-types Vehicle types in road crashes, Queensland
#> 6 sa-road-crash-locations Road crash locations, South Australia
#> 7 tas-road-crashes Road crashes, Tasmania
#> 8 qld-road-crash-factors Factors in road crashes, Queensland
#> 9 nsw-road-crashes Road crashes, New South Wales
#> 10 vic-road-crashes Road crashes, Victoria
#> 11 qld-road-crash-driver-demographics Driver demographics in road crashes, Queensland
#> 12 au-road-deaths Australian Road Deaths Database, fatalities
pd_datasets(topic = "roads", jurisdiction = "Qld")$slug
#> [1] "qld-road-crash-driver-demographics" "qld-road-crash-factors"
#> [3] "qld-road-casualties" "qld-road-crash-locations"
#> [5] "qld-road-crash-restraint-helmet-use" "qld-road-crash-vehicle-types"pd_catalogue() searches every dataset on the government
portals, including the many the site does not serve yet. Each record
says whether it is served; one that is not can be voted for on its
page.
pd_catalogue("water quality", jurisdiction = "Queensland", limit = 3)[, c("title", "publisher", "status")]
#> # A tibble: 3 × 3
#> title publisher status
#> <chr> <chr> <chr>
#> 1 Pumicestone Passage Bulcock Beach - Water quality monitoring Environment, Tour… votab…
#> 2 Brisbane River - Colmslie Site - Water Quality Monitoring Buoy Environment, Tour… votab…
#> 3 Sentinel Water Quality City of Gold Coast votab…pd_fields() lists each field with its type, the
publisher’s description, its range, and its values when it holds few. A
query names fields and values exactly, so this is the first call to
make.
pd_fields("act-road-crashes")[1:8, c("name", "type", "min", "max")]
#> # A tibble: 8 × 4
#> name type min max
#> <chr> <chr> <chr> <chr>
#> 1 crash_id integer 1 354433
#> 2 crash_date date 2015-01-01 2026-09-07
#> 3 crash_time string <NA> <NA>
#> 4 suburb_location string <NA> <NA>
#> 5 longitude number 148.7876728 149.39631165
#> 6 latitude number -35.89116025 -35.14329768
#> 7 intersection boolean <NA> <NA>
#> 8 midblock boolean <NA> <NA>
pd_fields("act-road-crashes")$values[[11]]
#> [1] "Fatal" "Injury" "Property damage only"pd_rows() and pd_aggregate() ask the query
API, so a filter or a total runs over the whole table without a
download. Each column comes back typed as its field says and labelled
with its description.
crashes <- pd_rows("act-road-crashes", crash_severity = "Fatal", crash_date = pd_gte("2025-01-01"),
.select = c("crash_id", "crash_date", "crash_type", "sa2_2021_name"))
crashes
#> # A tibble: 14 × 4
#> crash_id crash_date crash_type sa2_2021_name
#> <int> <date> <chr> <chr>
#> 1 340074 2025-10-01 Struck pedestrian (Off Road) Canberra East
#> 2 347129 2026-02-16 Struck object (Off Road) Hume
#> 3 336058 2025-03-11 Right angle collision Nicholls
#> 4 351537 2025-11-02 Collision with parked vehicle Mitchell
#> 5 342444 2025-12-05 Head on collision Kaleen
#> 6 343635 2026-01-09 Right angle collision Tuggeranong
#> 7 330178 2025-03-11 Other - vehicle to vehicle Lyneham
#> 8 340260 2025-09-27 Struck pedestrian (Off Road) Lyneham
#> 9 347489 2025-03-23 Struck object (Off Road) Watson
#> 10 343981 2025-12-03 Rear end collision ACT - South West
#> 11 340806 2025-10-06 Struck object (Off Road) ACT - South West
#> 12 345222 2026-01-24 Struck object (Off Road) O'Malley
#> 13 347390 2026-04-04 Other - Single vehicle (Off Road) ACT - South West
#> 14 345211 2026-02-17 Struck pedestrian (On Road) Lyneham
class(crashes$crash_date)
#> [1] "Date"
pd_aggregate("act-road-crashes", group = "crash_severity")
#> # A tibble: 3 × 2
#> crash_severity count
#> <chr> <int>
#> 1 Fatal 105
#> 2 Injury 6576
#> 3 Property damage only 69976Every answer carries the attribution the publisher’s licence requires.
pd_read() downloads a version’s Parquet file and reads
it with ‘arrow’. columns reads only the fields asked
for.
rate <- pd_read("rba-cash-rate")
tail(rate, 3)
#> # A tibble: 3 × 7
#> date cash_rate_target_change cash_rate_target es_rate_change es_rate
#> <date> <dbl> <dbl> <dbl> <dbl>
#> 1 2026-03-18 0.25 4.1 0.25 4
#> 2 2026-05-06 0.25 4.35 0.25 4.25
#> 3 2026-09-30 0.25 4.6 0.25 4.5
#> # ℹ 2 more variables: overnight_repo_rate_change <dbl>, overnight_repo_rate <dbl>A version never changes once published, so a file can be kept and
reused. Nothing is kept unless you ask, with cache = TRUE
on a call or options(publicdataau.cache = TRUE) for every
call; pd_cache_list() shows what is kept and
pd_cache_clear() deletes it.
Every version has a DuckDB file. pd_tbl() attaches it
over HTTPS and returns a table for ‘dplyr’; verbs become SQL that runs
against the file, reading only the blocks they touch.
library(dplyr, warn.conflicts = FALSE)
pd_tbl("act-road-crashes") |>
filter(crash_severity == "Fatal") |>
count(lighting_condition, sort = TRUE) |>
collect()
#> # A tibble: 5 × 2
#> lighting_condition n
#> <chr> <dbl>
#> 1 Daylight 63
#> 2 Dark - good street lighting 21
#> 3 Dark - no street lights 11
#> 4 Dark - poor street lighting 6
#> 5 Semi-darkness 4G-NAF, the national address file, is a database of 37 tables served
as one DuckDB file. Its licence sets a condition beyond attribution, on
compiling addresses for mail, and the package states it once per session
when G-NAF is first read; this vignette turns that notice off with
options(publicdataau.quiet = TRUE).
Rows of a point dataset carry the codes of the ABS areas their point
falls in. Total by one of them and pd_join_boundaries()
attaches the boundaries, in GDA2020.
by_sa2 <- pd_aggregate("act-road-crashes", group = "sa2_2021_code")
map <- pd_join_boundaries(by_sa2)
map
#> Simple feature collection with 100 features and 3 fields
#> Geometry type: MULTIPOLYGON
#> Dimension: XY
#> Bounding box: xmin: 148.9614 ymin: -35.48032 xmax: 149.3993 ymax: -35.1244
#> Geodetic CRS: GDA2020
#> # A tibble: 100 × 4
#> sa2_2021_code count sa2_2021_name geometry
#> <chr> <int> <chr> <MULTIPOLYGON [°]>
#> 1 101021012 2 Queanbeyan West - Jerrabomberra (((149.1957 -35.36126, 149.1997 -3…
#> 2 801011001 107 Aranda (((149.0741 -35.25529, 149.0742 -3…
#> 3 801011002 2712 Belconnen (((149.057 -35.23908, 149.0574 -35…
#> 4 801011003 1836 Bruce (((149.0738 -35.24299, 149.0734 -3…
#> 5 801011004 301 Charnwood (((149.0285 -35.19852, 149.0284 -3…
#> 6 801011005 191 Cook (((149.0572 -35.25635, 149.058 -35…
#> 7 801011006 200 Dunlop (((149.0077 -35.19727, 149.0082 -3…
#> 8 801011007 431 Evatt (((149.0673 -35.20722, 149.0673 -3…
#> 9 801011008 671 Florey (((149.0409 -35.22017, 149.0411 -3…
#> 10 801011009 338 Flynn (ACT) (((149.0495 -35.2059, 149.0492 -35…
#> # ℹ 90 more rows
plot(map["count"], main = "Road crashes by SA2, ACT", border = NA, logz = TRUE)pd_boundary_layers() lists the layers, and
pd_sf() reads any dataset’s own map layer.
Each release is compared with the one before it on the dataset’s key.
pd_changes("rba-money-market-daily")[, c("from", "to", "added", "removed", "changed")]
#> # A tibble: 1 × 5
#> from to added removed changed
#> <chr> <chr> <dbl> <dbl> <dbl>
#> 1 2026-09-30 2026-10-01 1 0 1pd_provenance() gives the record kept with a version:
the publisher’s file it was read from, its checksum and when it was
fetched.
pd_provenance("act-road-crashes")
#> <pd_provenance> act-road-crashes 2026-10-01
#> Source https://www.data.act.gov.au/api/views/6jn4-m8rx/rows.csv?accessType=DOWNLOAD
#> File 6jn4-m8rx.csv
#> Bytes 14,256,520
#> SHA-256 45dbb9445b51fdbd831d2c89efa8965f5a3071d50ccf04e0e63374a49ed39a00
#> Fetched 2026-09-30T19:25:31+00:00
#> Licence Creative Commons Attribution 4.0 International (read 2026-09-30T19:25:24+00:00)
#> Rows 76,657
#> Version https://publicdata.au/d/act-road-crashes/v/2026-10-01/An answer without a version comes from the newest one and changes
when the publisher releases again. Pass a date from
pd_versions() for one that never changes.
pd_url() gives a fixed file address for another tool, such
as a ‘targets’ pipeline with format = "url".
pd_cite() gives a version’s citation, with the
attribution its licence requires; utils::toBibtex() turns
it into a BibTeX entry.
utils::toBibtex(pd_cite("rba-cash-rate"))
#> @Misc{rba-cash-rate-2026-09-29,
#> title = {Cash rate target changes, Reserve Bank of Australia},
#> author = {{Reserve Bank of Australia}},
#> year = {2026},
#> howpublished = {Version 2026-09-29, serialised and versioned by National Digital at publicdata.au},
#> url = {https://publicdata.au/d/rba-cash-rate/v/2026-09-29/},
#> note = {Source: Reserve Bank of Australia, statistical table A2 Changes in Monetary Policy and Administered Rates, sourced 30 September 2026 from https://www.rba.gov.au/statistics/tables/, republished under sections 4 and 5 of the RBA copyright notice, https://www.rba.gov.au/copyright/. The RBA does not endorse this site or any use of this data. The RBA publishes this data free of charge at rba.gov.au},
#> }