The hardware and bandwidth for this mirror is donated by dogado GmbH, the Webhosting and Full Service-Cloud Provider. Check out our Wordpress Tutorial.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]dogado.de.
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},
#> }These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.
Health stats visible at Monitor.