class: monash-bg-blue center middle hide-slide-number <div class="bg-black white" style="width:45%;right:0;bottom:0;padding-left:5px;border: solid 4px white;margin: auto;"> <i class="fas fa-exclamation-circle"></i> These slides are viewed best by Chrome and occasionally need to be refreshed if elements did not load properly. See here for <a href=part2-session2.pdf>PDF <i class="fas fa-file-pdf"></i></a>. </div> <br> .white[Push the **right arrow key** to see the next slide.] --- count: false background-image: url(images/d2bg5.jpg) background-size: cover class: hide-slide-number title-slide <div class="grid-row" style="grid: 1fr / 2fr;"> .item.center[ # <span style="text-shadow: 2px 2px 30px white;">Data Visualization with R <br> Workshop Part 2</span> <!-- ## <span style="color:yellow;text-shadow: 2px 2px 30px black;">Making maps</span> --> ] .center.shade_black.animated.bounceInUp.slower[ <br><br> ## Making maps <br> Presented by Di Cook Department of Econometrics and Business Statistics <img src="images/monash-one-line-reversed.png" style="width:500px"><br>
<i class="fas fa-envelope faa-float animated "></i>
dicook@monash.edu
<i class="fab fa-twitter faa-float animated faa-fast "></i>
@statsgen .bottom_abs.width100.bg-black[ 6th Dec 2021 @ Statistical Society of Australia NSW Branch | Zoom ] ] </div> --- class: font_smaller # <img src="images/1920px-World_Health_Organization_Logo.svg.png" width="50px" style="vertical-align: middle;"> Tuberculosis incidence The TB data is from the [WHO]( https://www.who.int/tb/country/data/download/en/). ``` ## # A tibble: 40,800 × 5 ## country year age_group sex count ## <chr> <dbl> <fct> <chr> <dbl> ## 1 Afghanistan 1997 15-24 m 10 ## 2 Afghanistan 1997 25-34 m 6 ## 3 Afghanistan 1997 35-44 m 3 ## 4 Afghanistan 1997 45-54 m 5 ## 5 Afghanistan 1997 55-64 m 2 ## 6 Afghanistan 1997 65- m 0 ## 7 Afghanistan 1997 15-24 f 38 ## 8 Afghanistan 1997 25-34 f 36 ## 9 Afghanistan 1997 35-44 f 14 ## 10 Afghanistan 1997 45-54 f 8 ## # … with 40,790 more rows ``` --- class: question What is a choropleth map? -- <br> Why use a choropleth map? -- --- # How do we get a map? A polygon map of the world can be extracted from the `maps` package. .font_small[ ```r world_map <- map_data("world") world_map %>% filter(region == "Australia") %>% DT::datatable(width=1150, height=100) ```
] --- # Maps are basically groups of connected dots .left-code[ <br> <br> These are the points, defining the country boundary for Australia <br> <br> .font_small[ ```r oz <- world_map %>% filter(region == "Australia") ggplot(oz, aes(x = long, y = lat)) + geom_point() + * coord_map() ``` ] ] .right-plot[ <br> <br> <img src="images/day2-session2/unnamed-chunk-4-1.png" width="110%" style="display: block; margin: auto;" /> ] --- # Maps are basically groups of connected dots .left-code[ <br> <br> Connect the dots <br> <br> .font_small[ ```r ggplot(oz, aes(x = long, y = lat, * group = group)) + geom_point() + * geom_line() + coord_map() ``` ] <br>
What happened?
] .right-plot[ <br> <br> <img src="images/day2-session2/unnamed-chunk-5-1.png" width="110%" style="display: block; margin: auto;" /> ] --- # Maps are basically groups of connected dots .left-code[ <br> <br> Connect the dots <br> <br> .font_small[ ```r ggplot(oz, aes(x = long, y = lat, * group = group)) + #geom_point() + * geom_path() + coord_map() ``` ] ] .right-plot[ <br> <br> <img src="images/day2-session2/unnamed-chunk-6-1.png" width="110%" style="display: block; margin: auto;" /> ] --- # Maps are basically groups of connected dots <br> <br> .left-code[ This map doesn't have states and territory connections, and also sub-regions is not uniquely defining islands. <br><br> .font_small[ ```r ggplot(oz, aes(x = long, y = lat, * group = subregion)) + geom_path() + coord_map() ``` ] ] .right-plot[ <img src="images/day2-session2/unnamed-chunk-7-1.png" width="110%" style="display: block; margin: auto;" /> ] --- # Maps are basically groups of connected dots <br> <br> .left-code[ We can also plot the map using `geom_polygon`, and fill with colour. <br><br> .font_small[ ```r ggplot(oz, aes(x = long, y = lat, group = group)) + * geom_polygon() + coord_map() ``` ] ] .right-plot[ <img src="images/day2-session2/unnamed-chunk-8-1.png" width="110%" style="display: block; margin: auto;" /> ] --- # Maps are basically groups of connected dots <br> <br> .left-code[ Using a .monash-orange2[map theme] makes the result look more map-like <br><br> .font_small[ ```r ggplot(oz, aes(x = long, y = lat, group = group)) + geom_polygon() + coord_map() + * theme_map() ``` ] ] .right-plot[ <img src="images/day2-session2/unnamed-chunk-10-1.png" width="110%" style="display: block; margin: auto;" /> ] --- # Tips for mapping .top-color-box[For data analysis, maps are a set of points, connected correctly to generate polygons.] -- .color-box[Note: It is important when converting spatial objects from a mapping software to a data analysis project is .monash-blue2["thinning" the map] to make it smaller and efficient to work with. See the `rmapshapr` package to help with this.] --- class: transition middle # Let's make a choropleth map of tuberculosis --- # Pre-process the data Aggregate counts across sex and age group for 2012 <br> .font_small[ ```r tb_2012 <- tb %>% filter(year == 2012) %>% rename(region = country) %>% group_by(region) %>% summarise(count = sum(count)) ggplot(tb_2012, aes(map_id = region)) + * geom_map(aes(fill = count), map = world_map, * color="grey70", size = 0.1, na.rm = TRUE) + expand_limits(x = world_map$long, y = world_map$lat) + scale_fill_viridis("Count") + theme_map() ``` ] --- <img src="images/day2-session2/unnamed-chunk-11-1.png" width="100%" style="display: block; margin: auto;" /> -- .corner-box[What happened to the USA? UK?] --- # Check the name matching .font_small[ ```r wm_names <- world_map %>% select(region) %>% distinct() tb_names <- tb %>% filter(year == 2012) %>% select(country) %>% distinct() *tb_miss_from_wm <- anti_join(tb_names, wm_names, * by=c("country" = "region")) *wm_miss_from_tb <- anti_join(wm_names, tb_names, * by=c("region" = "country")) ``` ] --- ```r DT::datatable(tb_miss_from_wm, width = 1150, height = 100) ```
--- ```r DT::datatable(wm_miss_from_tb, width = 1150, height = 100) ```
--- .top-color-box[Countries often have different names across data sets. Ideally one could use isocodes (e.g. AUS, AU) but this is not common practice.] -- .code-box[.font_small[ ```r tb_fixed <- tb %>% mutate(region=recode(country, "United States of America" = "USA", "United Kingdom of Great Britain and Northern Ireland" = "UK", "Russian Federation" = "Russia", "Viet Nam" = "Vietnam", "Venezuela (Bolivarian Republic of)" = "Venezuela", "Bolivia (Plurinational State of)" = "Bolivia", "Czechia" = "Czech Republic", "Iran (Islamic Republic of)" = "Iran", "Iran (Islamic Republic of)" = "Laos", "Democratic People's Republic of Korea" = "North Korea", "Republic of Korea" = "South Korea", "United Republic of Tanzania" = "Tanzania", "Congo" = "Republic of Congo")) ``` ] ] --- <br><br> 😄
Try again!
.font_small[ ```r *tb_2012 <- tb_fixed %>% filter(year == 2012) %>% group_by(region) %>% summarise(count = sum(count)) ggplot(tb_2012, aes(map_id = region)) + * geom_map(aes(fill = count), map = world_map, * color = "grey70", size = 0.1, na.rm = TRUE) + expand_limits(x = world_map$long, y = world_map$lat) + scale_fill_viridis("Count") + theme_map() ``` ] --- <img src="images/day2-session2/unnamed-chunk-16-1.png" width="100%" style="display: block; margin: auto;" /> --- # Counts are typically skewed .left-code[ .font_small[ ```r ggplot(tb_2012, aes(x = count)) + geom_histogram() ``` ] <br> <br> Symmetrising count, helps visual perception of a choropleth map. <br> <br> <br> .font_small[ ```r ggplot(tb_2012, aes(x = count)) + geom_histogram() + * scale_x_log10() ``` ] ] .right-plot[ <img src="images/day2-session2/unnamed-chunk-17-1.png" width="60%" style="display: block; margin: auto;" /> <img src="images/day2-session2/unnamed-chunk-18-1.png" width="60%" style="display: block; margin: auto;" /> ] --- # Choropleth on log scale <br><br> .font_small[ ```r *tb_2012_map <- world_map %>% left_join(tb_2012) ggplot(tb_2012_map, aes(x = long, y = lat, group=group)) + geom_polygon(aes(fill = count), color="grey70", size = 0.1, na.rm = TRUE) + expand_limits(x = world_map$long*1.1, y = world_map$lat*1.1) + * scale_fill_viridis("Count", trans = "log10") + theme_map() ``` ] <br> <br> .corner-box[Note: `geom_polygon` can be used instead of `geom_map`.] --- <img src="images/day2-session2/unnamed-chunk-19-1.png" width="100%" style="display: block; margin: auto;" /> --- class: transition middle # COMPLEX EXAMPLE: COVID incidence in Victoria choropleth vs cartogram --- ## Get the data This is extracted from https://www.covid19data.com.au/victoria .panelset[ .panel[.panel-name[data]
] .panel[.panel-name[R] .font_small[ ```r # Read the data # Replace null with 0, for three LGAs # Convert to long form to join with polygons # Make the date variables a proper date # Set NAs to 0, this is a reasonable assumption covid <- read_csv(here::here("data/melb_lga_covid.csv")) %>% mutate(Buloke = as.numeric(ifelse(Buloke == "null", "0", Buloke))) %>% mutate(Hindmarsh = as.numeric(ifelse(Hindmarsh == "null", "0", Hindmarsh))) %>% mutate(Towong = as.numeric(ifelse(Towong == "null", "0", Towong))) %>% pivot_longer(cols = Alpine:Yarriambiack, names_to="NAME", values_to="cases") %>% mutate(Date = ydm(paste0("2020/",Date))) %>% mutate(cases=replace_na(cases, 0)) DT::datatable(covid, width=1150, height=100) ``` ] ] ] --- ## Fix LGA names .panelset[ .panel[.panel-name[data] - Read the LGA data from `ozmaps` package. - This has LGAs for all of Australia. - Need to filter out Victoria LGAs, avoiding LGAs from other states with same name, and make the names match covid data names. This is done using a regex expression removing () state and LGA type text strings ] .panel[.panel-name[R] .font_small[ ```r data("abs_lga") vic_lga <- abs_lga %>% mutate(NAME = ifelse(NAME == "Latrobe (M) (Tas.)", "LatrobeM", NAME)) %>% mutate(NAME = ifelse(NAME == "Kingston (DC) (SA)", "KingstonSA", NAME)) %>% mutate(NAME = ifelse(NAME == "Bayside (A)", "BaysideA", NAME)) %>% mutate(NAME = str_replace(NAME, " \\(.+\\)", "")) %>% mutate(NAME = ifelse(NAME == "Colac-Otway", "Colac Otway", NAME)) vic_lga <- st_transform(vic_lga, 3395) # 3395 is EPSG CRS, equiv to WGS84 mercator, # see https://spatialreference.org/ref/epsg/?page=28 # cartogram() needs this to be set ``` ] ] ] --- ## Join and colour the map .panelset[ .panel[.panel-name[plot] <img src="images/day2-session2/covid-choropleth-1.png" width="50%" style="display: block; margin: auto;" /> ] .panel[.panel-name[R] .font_small[ ```r # Filter to final day, which is cumulative count covid_cum <- covid %>% filter(Date == max(Date)) # Join covid data to polygon data, remove LGAs with # missing values which should leave just Vic LGAs vic_lga_covid <- vic_lga %>% left_join(covid_cum, by="NAME") %>% filter(!is.na(cases)) # Make choropleth map, with appropriate colour palette p <- ggplot(vic_lga_covid) + geom_sf(aes(fill = cases, label=NAME), colour="white") + scale_fill_distiller("Cases", palette = "YlOrRd", direction=1) + theme_map() + theme(legend.position="bottom") p #ggplotly(p) ``` ] ] ] --- ## Get population data .panelset[ .panel[.panel-name[data] - Incorporate population data to make cartogram - Population from https://www.planning.vic.gov.au/land-use-and-population-research/victoria-in-future/tab-pages/victoria-in-future-data-tables - Polygons are transformed so that area matches, as best possible, to the population
] .panel[.panel-name[R] .font_small[ ```r pop <- read_xlsx("../data/VIF2019_Population_Service_Ages_LGA_2036.xlsx", sheet=3, skip=13, col_names = FALSE) %>% select(`...4`, `...22`) %>% rename(NAME = `...4`, pop=`...22`) %>% filter(NAME != "Unincorporated Vic") %>% mutate(NAME = str_replace(NAME, " \\(.+\\)", "")) %>% mutate(NAME = ifelse(NAME == "Colac-Otway", "Colac Otway", NAME)) %>% mutate(pop = round(pop, 0)) DT::datatable(pop, width=1150, height=100) vic_lga_covid <- vic_lga_covid %>% left_join(pop, by="NAME") # Compute additional statistics vic_lga_covid <- vic_lga_covid %>% group_by(NAME) %>% mutate(cases_per10k = max(cases/pop*10000, 0), lnew_cases = log10(cases - min(cases) + 1)) %>% ungroup() ``` ] ] ] --- ## Make a cartogram .panelset[ .panel[.panel-name[plot] <img src="images/day2-session2/vic-cartogram-1.png" width="50%" style="display: block; margin: auto;" /> ] .panel[.panel-name[R] .font_small[ ```r # Make a contiguous cartogram vic_lga_covid_carto <- cartogram_cont(vic_lga_covid, "pop") # This st_cast() is necessary to get plotly to work vic_lga_covid_carto <- st_cast(vic_lga_covid_carto, "MULTIPOLYGON") p <- ggplot(vic_lga_covid_carto) + geom_sf(aes(fill = cases, label=NAME), colour="white") + scale_fill_distiller("Cases", palette = "YlOrRd", direction=1) + theme_map() + theme(legend.position="bottom") p ``` ] ] ] --- class: transition middle # Raster map with data overlaid --- .left-code[ .font_small[ ```r load(here::here("data/platypus.rda")) p <- ggplot(platypus) + geom_point(aes(x = Longitude, y = Latitude), alpha = 0.1) p ``` <img src="images/day2-session2/unnamed-chunk-27-1.png" width="100%" style="display: block; margin: auto;" /> ] ] .right-plot[ <br> <br> .font_small[ ```r p + coord_map() ``` <img src="images/day2-session2/unnamed-chunk-28-1.png" width="100%" style="display: block; margin: auto;" /> ] ] --- # Extract Open Street Map using `ggmap` <br><br> Download and save the map, so that you don't need to do multiple downloads. <br><br> .font_small[ ```r oz_bbox <- c(112.9, # min long -45, # min lat 159, # max long -10) # max lat *oz_map <- get_map(location = oz_bbox, source = "osm") save(oz_map, file=here::here("data/oz_map.rda")) ``` ] --- # Platypus occurrences across Australia <br><br> .left-code[ .font_small[ ```r load(here::here("data/oz_map.rda")) ggmap(oz_map) + geom_point(data = platypus, aes(x = Longitude, y = Latitude), alpha = 0.1, colour = "orange") + theme_map() ``` ] ] .right-plot[ <img src="images/day2-session2/unnamed-chunk-31-1.png" width="100%" style="display: block; margin: auto;" /> ] --- class: exercise middle hide-slide-number <i class="fas fa-users"></i> # <i class="fas fa-code"></i> Open `part2-exercise-02.Rmd` <center>
15
:
00
</center> --- # Resources These are sites with lots of useful information about making maps in R: <br> - `ozmaps` package: https://github.com/mdsumner/ozmaps, https://mdsumner.github.io/ozmaps/ - `strayr` package: https://runapp-aus.github.io/strayr/ - https://www.littlemissdata.com/blog/maps - https://www.r-spatial.org/r/2018/10/25/ggplot2-sf.html - https://www.paulamoraga.com/book-geospatial/sec-spatialdataandCRS.html - https://rspatialdata.github.io --- class: font_smaller background-color: #e5e5e5 # Session Information .scroll-350[ ```r devtools::session_info() ``` ``` ## ─ Session info ─────────────────────────────────────────────────────────────── ## setting value ## version R version 4.1.0 (2021-05-18) ## os macOS Big Sur 10.16 ## system x86_64, darwin17.0 ## ui X11 ## language (EN) ## collate en_AU.UTF-8 ## ctype en_AU.UTF-8 ## tz Australia/Melbourne ## date 2021-12-01 ## ## ─ Packages ─────────────────────────────────────────────────────────────────── ## package * version date lib ## anicon 0.1.0 2021-07-14 [1] ## assertthat 0.2.1 2019-03-21 [1] ## backports 1.2.1 2020-12-09 [1] ## bit 4.0.4 2020-08-04 [1] ## bit64 4.0.5 2020-08-30 [1] ## bitops 1.0-7 2021-04-24 [1] ## broom 0.7.9 2021-07-27 [1] ## bslib 0.3.1 2021-10-06 [1] ## cachem 1.0.6 2021-08-19 [1] ## callr 3.7.0 2021-04-20 [1] ## cartogram * 0.2.2 2020-08-26 [1] ## cellranger 1.1.0 2016-07-27 [1] ## class 7.3-19 2021-05-03 [1] ## classInt 0.4-3 2020-04-07 [1] ## cli 3.1.0 2021-10-27 [1] ## colorspace 2.0-2 2021-06-24 [1] ## countdown 0.3.5 2021-07-14 [1] ## crayon 1.4.2 2021-10-29 [1] ## crosstalk 1.2.0 2021-11-04 [1] ## data.table 1.14.2 2021-09-27 [1] ## DBI 1.1.1 2021-01-15 [1] ## dbplyr 2.1.1 2021-04-06 [1] ## desc 1.4.0 2021-09-28 [1] ## devtools 2.4.2 2021-06-07 [1] ## digest 0.6.28 2021-09-23 [1] ## dplyr * 1.0.7.9000 2021-11-30 [1] ## DT 0.20 2021-11-15 [1] ## e1071 1.7-9 2021-09-16 [1] ## ellipsis 0.3.2 2021-04-29 [1] ## emo 0.0.0.9000 2021-07-14 [1] ## evaluate 0.14 2019-05-28 [1] ## fansi 0.5.0 2021-05-25 [1] ## farver 2.1.0 2021-02-28 [1] ## fastmap 1.1.0 2021-01-25 [1] ## forcats * 0.5.1 2021-01-27 [1] ## fs 1.5.0 2020-07-31 [1] ## generics 0.1.1 2021-10-25 [1] ## ggmap * 3.0.0 2019-02-05 [1] ## ggplot2 * 3.3.5 2021-06-25 [1] ## ggthemes * 4.2.4 2021-01-20 [1] ## glue 1.5.0 2021-11-07 [1] ## gridExtra 2.3 2017-09-09 [1] ## gtable 0.3.0 2019-03-25 [1] ## haven 2.4.1 2021-04-23 [1] ## here 1.0.1 2020-12-13 [1] ## highr 0.9 2021-04-16 [1] ## hms 1.1.1 2021-09-26 [1] ## htmltools 0.5.2 2021-08-25 [1] ## htmlwidgets 1.5.4 2021-09-08 [1] ## httr 1.4.2 2020-07-20 [1] ## icon 0.1.0 2021-07-14 [1] ## jpeg 0.1-9 2021-07-24 [1] ## jquerylib 0.1.4 2021-04-26 [1] ## jsonlite 1.7.2 2020-12-09 [1] ## KernSmooth 2.23-20 2021-05-03 [1] ## knitr 1.36 2021-09-29 [1] ## labeling 0.4.2 2020-10-20 [1] ## lattice 0.20-44 2021-05-02 [1] ## lazyeval 0.2.2 2019-03-15 [1] ## lifecycle 1.0.1 2021-09-24 [1] ## lubridate * 1.8.0 2021-10-07 [1] ## magrittr 2.0.1 2020-11-17 [1] ## mapproj 1.2.7 2020-02-03 [1] ## maps 3.3.0 2018-04-03 [1] ## memoise 2.0.0 2021-01-26 [1] ## modelr 0.1.8 2020-05-19 [1] ## munsell 0.5.0 2018-06-12 [1] ## oz 1.0-21 2016-12-08 [1] ## ozmaps * 0.4.5 2021-08-03 [1] ## packcircles 0.3.4 2020-12-12 [1] ## pillar 1.6.4 2021-10-18 [1] ## pkgbuild 1.2.0 2020-12-15 [1] ## pkgconfig 2.0.3 2019-09-22 [1] ## pkgload 1.2.1 2021-04-06 [1] ## plotly * 4.10.0 2021-10-09 [1] ## plyr 1.8.6 2020-03-03 [1] ## png 0.1-7 2013-12-03 [1] ## prettyunits 1.1.1 2020-01-24 [1] ## processx 3.5.2 2021-04-30 [1] ## proxy 0.4-26 2021-06-07 [1] ## ps 1.6.0 2021-02-28 [1] ## purrr * 0.3.4 2020-04-17 [1] ## R6 2.5.1 2021-08-19 [1] ## RColorBrewer 1.1-2 2014-12-07 [1] ## Rcpp 1.0.7 2021-07-07 [1] ## readr * 2.1.0 2021-11-11 [1] ## readxl * 1.3.1 2019-03-13 [1] ## remotes 2.4.0 2021-06-02 [1] ## reprex 2.0.0 2021-04-02 [1] ## RgoogleMaps 1.4.5.3 2020-02-12 [1] ## rjson 0.2.20 2018-06-08 [1] ## rlang 0.99.0.9001 2021-11-30 [1] ## rmarkdown 2.11.3 2021-10-18 [1] ## rprojroot 2.0.2 2020-11-15 [1] ## rstudioapi 0.13 2020-11-12 [1] ## rvest 1.0.1 2021-07-26 [1] ## sass 0.4.0 2021-05-12 [1] ## scales 1.1.1 2020-05-11 [1] ## sessioninfo 1.1.1 2018-11-05 [1] ## sf * 1.0-4 2021-11-14 [1] ## sp 1.4-6 2021-11-14 [1] ## stringi 1.7.5 2021-10-04 [1] ## stringr * 1.4.0 2019-02-10 [1] ## testthat 3.0.4 2021-07-01 [1] ## tibble * 3.1.6 2021-11-07 [1] ## tidyr * 1.1.4 2021-09-27 [1] ## tidyselect 1.1.1 2021-04-30 [1] ## tidyverse * 1.3.1 2021-04-15 [1] ## tzdb 0.2.0 2021-10-27 [1] ## units 0.7-2 2021-06-08 [1] ## usethis 2.1.0 2021-10-16 [1] ## utf8 1.2.2 2021-07-24 [1] ## vctrs 0.3.8 2021-04-29 [1] ## viridis * 0.6.1 2021-05-11 [1] ## viridisLite * 0.4.0 2021-04-13 [1] ## vroom 1.5.6 2021-11-10 [1] ## whisker 0.4 2019-08-28 [1] ## withr 2.4.2 2021-04-18 [1] ## xaringan 0.22 2021-06-23 [1] ## xaringanExtra 0.5.4 2021-09-02 [1] ## xfun 0.28 2021-11-04 [1] ## xml2 1.3.2 2020-04-23 [1] ## yaml 2.2.1 2020-02-01 [1] ## source ## Github (emitanaka/anicon@0b756df) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## Github (gadenbuie/countdown@a544fa4) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## Github (tidyverse/dplyr@3d61d99) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## Github (hadley/emo@3f03b11) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## Github (emitanaka/icon@8458546) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## Github (r-lib/rlang@5aefc4a) ## Github (rstudio/rmarkdown@ebf0d09) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## Github (gadenbuie/xaringanExtra@5e2d80b) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## CRAN (R 4.1.0) ## ## [1] /Library/Frameworks/R.framework/Versions/4.1/Resources/library ``` ] These slides are licensed under <br><center><a href="https://creativecommons.org/licenses/by-sa/3.0/au/"><img src="images/cc.svg" style="height:2em;"/><img src="images/by.svg" style="height:2em;"/><img src="images/sa.svg" style="height:2em;"/></a></center>