From ab0702651243806f3487639dbf4b7ac9657d27e4 Mon Sep 17 00:00:00 2001 From: lcolladotor Date: Thu, 17 Aug 2023 21:51:01 -0400 Subject: [PATCH] Re-render the full site after auto-styling the code --- .../index/execute-results/html.json | 4 ++-- .../index/execute-results/html.json | 4 ++-- .../index/execute-results/html.json | 4 ++-- .../index/execute-results/html.json | 4 ++-- .../index/execute-results/html.json | 4 ++-- .../index/execute-results/html.json | 4 ++-- .../index/execute-results/html.json | 4 ++-- .../index/execute-results/html.json | 4 ++-- .../index/execute-results/html.json | 4 ++-- .../index/execute-results/html.json | 4 ++-- .../index/figure-html/unnamed-chunk-15-1.png | Bin 115836 -> 103973 bytes .../index/figure-html/unnamed-chunk-16-1.png | Bin 67324 -> 64855 bytes .../index/figure-html/unnamed-chunk-17-1.png | Bin 137409 -> 117208 bytes .../index/figure-html/unnamed-chunk-18-1.png | Bin 138803 -> 118244 bytes .../index/execute-results/html.json | 4 ++-- .../index/execute-results/html.json | 4 ++-- .../index/execute-results/html.json | 4 ++-- .../index/execute-results/html.json | 4 ++-- .../index/execute-results/html.json | 4 ++-- .../index/execute-results/html.json | 4 ++-- .../index/execute-results/html.json | 4 ++-- .../index/execute-results/html.json | 4 ++-- .../index/execute-results/html.json | 4 ++-- .../index/figure-html/unnamed-chunk-38-1.png | Bin 253040 -> 249303 bytes .../index/execute-results/html.json | 4 ++-- .../index/execute-results/html.json | 4 ++-- .../index/figure-html/unnamed-chunk-26-1.png | Bin 120334 -> 120179 bytes .../project-1/index/execute-results/html.json | 4 ++-- .../project-2/index/execute-results/html.json | 4 ++-- .../project-3/index/execute-results/html.json | 4 ++-- 30 files changed, 48 insertions(+), 48 deletions(-) diff --git a/_freeze/posts/02-introduction-to-r-and-rstudio/index/execute-results/html.json b/_freeze/posts/02-introduction-to-r-and-rstudio/index/execute-results/html.json index 083d7be..ce18255 100644 --- a/_freeze/posts/02-introduction-to-r-and-rstudio/index/execute-results/html.json +++ b/_freeze/posts/02-introduction-to-r-and-rstudio/index/execute-results/html.json @@ -1,7 +1,7 @@ { - "hash": "f1d609aa26ae665593d37bd091989900", + "hash": "27583eecf8d325ba0fbc85dc5d42cee3", "result": { - "markdown": "---\ntitle: \"02 - Introduction to R and RStudio!\"\nauthor:\n - name: Leonardo Collado Torres\n url: http://lcolladotor.github.io/\n affiliations:\n - id: libd\n name: Lieber Institute for Brain Development\n url: https://libd.org/\n - id: jhsph\n name: Johns Hopkins Bloomberg School of Public Health Department of Biostatistics\n url: https://publichealth.jhu.edu/departments/biostatistics\ndescription: \"Let's dig into the R programming language and the RStudio integrated developer environment\"\nimage: https://github.com/njtierney/rmd4sci/raw/master/figs/rstudio-screenshot.png\ncategories: [module 1, week 1, R, programming, RStudio]\n---\n\n\n*This lecture, as the rest of the course, is adapted from the version [Stephanie C. Hicks](https://www.stephaniehicks.com/) designed and maintained in 2021 and 2022. Check the recent changes to this file through the [GitHub history](https://github.com/lcolladotor/jhustatcomputing2023/commits/main/posts/02-introduction-to-r-and-rstudio/index.qmd).*\n\n> There are only two kinds of languages: the ones people complain about and the ones nobody uses. ---*Bjarne Stroustrup*\n\n# Pre-lecture materials\n\n### Read ahead\n\n::: callout-note\n### Read ahead\n\n**Before class, you can prepare by reading the following materials:**\n\n1. [An overview and history of R](https://rdpeng.github.io/Biostat776/lecture-introduction-and-overview.html) from Roger Peng\n2. [Installing R and RStudio](https://rafalab.github.io/dsbook/installing-r-rstudio.html) from Rafael Irizarry\n3. [Getting Started in R and RStudio](https://rafalab.github.io/dsbook/getting-started.html) from Rafael Irizarry\n:::\n\n### Acknowledgements\n\nMaterial for this lecture was borrowed and adopted from\n\n- \n- \n- \n- \n\n# Learning objectives\n\n::: callout-note\n## Learning objectives\n\n**At the end of this lesson you will:**\n\n- Learn about (some of) the history of R.\n- Identify some of the strengths and weaknesses of R.\n- Install R and Rstudio on your computer.\n- Know how to install and load R packages.\n:::\n\n# Overview and history of R\n\nBelow is a very quick introduction to R, to get you set up and running. We'll go deeper into R and coding later.\n\n### tl;dr (R in a nutshell)\n\nLike every programming language, R has its advantages and disadvantages. If you search the internet, you will quickly discover lots of folks with opinions about R. Some of the features that are useful to know are:\n\n- R is open-source, freely accessible, and cross-platform (multiple OS).\n- R is a [\"high-level\" programming language](https://en.wikipedia.org/wiki/High-level_programming_language), relatively easy to learn.\n - While \"Low-level\" programming languages (e.g. Fortran, C, etc) often have more efficient code, they can also be harder to learn because it is designed to be close to a machine language.\n - In contrast, high-level languages deal more with variables, objects, functions, loops, and other abstract CS concepts with a focus on usability over optimal program efficiency.\n- R is great for statistics, data analysis, websites, web apps, data visualizations, and so much more!\n- R integrates easily with document preparation systems like $\\LaTeX$, but R files can also be used to create `.docx`, `.pdf`, `.html`, `.ppt` files with integrated R code output and graphics.\n- The R Community is very dynamic, helpful and welcoming.\n - Check out the [#rstats](https://twitter.com/search?q=%23rstats) or [#rtistry](https://twitter.com/search?q=%23rtistry) on Twitter, [TidyTuesday](https://www.tidytuesday.com) podcast and community activity in the [R4DS Online Learning Community](https://www.rfordatasci.com), and [r/rstats](https://www.reddit.com/r/rstats/) subreddit.\n - If you are looking for more local resources, check out [R-Ladies Baltimore](https://www.meetup.com/rladies-baltimore/).\n- Through R packages, it is easy to get lots of state-of-the-art algorithms.\n- Documentation and help files for R are generally good.\n\nWhile we use R in this course, it is not the only option to analyze data. Maybe the most similar to R, and widely used, is Python, which is also free. There is also commercial software that can be used to analyze data (e.g., Matlab, Mathematica, Tableau, SAS, SPSS). Other more general programming languages are suitable for certain types of analyses as well (e.g., C, Fortran, Perl, Java, Julia).\n\nDepending on your future needs or jobs, you might have to learn one or several of those additional languages. The good news is that even though those languages are all different, they all share general ways of thinking and structuring code. So once you understand a specific concept (e.g., variables, loops, branching statements or functions), it applies to all those languages. Thus, learning a new programming language is much easier once you already know one. And R is a good one to get started with.\n\nWith the skills gained in this course, hopefully you will find R a fun and useful programming language for your future projects.\n\n![Artwork by Allison Horst on learning R](https://github.com/allisonhorst/stats-illustrations/raw/main/rstats-artwork/r_first_then.png){width=\"80%\"}\n\n\\[**Source**: [Artwork by Allison Horst](https://github.com/allisonhorst/stats-illustrations)\\]\n\n### Basic Features of R\n\nToday R runs on almost any standard computing platform and operating system. Its open source nature means that anyone is free to adapt the software to whatever platform they choose. Indeed, R has been reported to be running on modern tablets, phones, PDAs, and game consoles.\n\nOne nice feature that R shares with many popular open source projects is frequent releases. These days there is a major annual release, typically in October, where major new features are incorporated and released to the public. Throughout the year, smaller-scale bugfix releases will be made as needed. The frequent releases and regular release cycle indicates active development of the software and ensures that bugs will be addressed in a timely manner. Of course, while the core developers control the primary source tree for R, many people around the world make contributions in the form of new feature, bug fixes, or both.\n\nAnother key advantage that R has over many other statistical packages (even today) is its sophisticated graphics capabilities. R's ability to create \"publication quality\" graphics has existed since the very beginning and has generally been better than competing packages. Today, with many more visualization packages available than before, that trend continues. R's base graphics system allows for very fine control over essentially every aspect of a plot or graph. Other newer graphics systems, like lattice and ggplot2 allow for complex and sophisticated visualizations of high-dimensional data.\n\nR has maintained the original S philosophy (see box below), which is that **it provides a language that is both useful for interactive work, but contains a powerful programming language for developing new tools**. This allows the user, who takes existing tools and applies them to data, to slowly but surely become a developer who is creating new tools.\n\n::: callout-tip\nFor a great discussion on an overview and history of R and the S programming language, read through [this chapter](https://rdpeng.github.io/Biostat776/lecture-introduction-and-overview.html) from Roger D. Peng.\n:::\n\nFinally, one of the joys of using R has nothing to do with the language itself, but rather with the active and vibrant user community. In many ways, a language is successful inasmuch as it creates a platform with which many people can create new things. R is that platform and thousands of people around the world have come together to make contributions to R, to develop packages, and help each other use R for all kinds of applications. The R-help and R-devel mailing lists have been highly active for over a decade now and there is considerable activity on web sites like Stack Overflow, Twitter [#rstats](https://twitter.com/search?q=%23rstats), [#rtistry](https://twitter.com/search?q=%23rtistry), and [Reddit](https://www.reddit.com/r/rstats/).\n\n### Free Software\n\nA major advantage that R has over many other statistical packages and is that it's free in the sense of free software (it's also free in the sense of free beer). The copyright for the primary source code for R is held by the [R Foundation](http://www.r-project.org/foundation/) and is published under the [GNU General Public License version 2.0](http://www.gnu.org/licenses/gpl-2.0.html).\n\nAccording to the Free Software Foundation, with *free software*, you are granted the following [four freedoms](http://www.gnu.org/philosophy/free-sw.html)\n\n- The freedom to run the program, for any purpose (freedom 0).\n\n- The freedom to study how the program works, and adapt it to your needs (freedom 1). Access to the source code is a precondition for this.\n\n- The freedom to redistribute copies so you can help your neighbor (freedom 2).\n\n- The freedom to improve the program, and release your improvements to the public, so that the whole community benefits (freedom 3). Access to the source code is a precondition for this.\n\n::: callout-tip\nYou can visit the [Free Software Foundation's web site](http://www.fsf.org) to learn a lot more about free software. The Free Software Foundation was founded by Richard Stallman in 1985 and [Stallman's personal web site](https://stallman.org) is an interesting read if you happen to have some spare time.\n:::\n\n### Design of the R System\n\nThe primary R system is available from the [Comprehensive R Archive Network](http://cran.r-project.org), also known as CRAN. CRAN also hosts many add-on packages that can be used to extend the functionality of R.\n\nThe R system is divided into 2 conceptual parts:\n\n1. The \"base\" R system that you download from CRAN:\n\n- [Linux](http://cran.r-project.org/bin/linux/)\n- [Windows](http://cran.r-project.org/bin/windows/)\n- [Mac](http://cran.r-project.org/bin/macosx/)\n\n2. Everything else.\n\nR functionality is divided into a number of *packages*.\n\n- The \"base\" R system contains, among other things, the `base` package which is required to run R and contains the most fundamental functions.\n\n- The other packages contained in the \"base\" system include `utils`, `stats`, `datasets`, `graphics`, `grDevices`, `grid`, `methods`, `tools`, `parallel`, `compiler`, `splines`, `tcltk`, `stats4`.\n\n- There are also \"Recommended\" packages: `boot`, `class`, `cluster`, `codetools`, `foreign`, `KernSmooth`, `lattice`, `mgcv`, `nlme`, `rpart`, `survival`, `MASS`, `spatial`, `nnet`, `Matrix`.\n\nWhen you download a fresh installation of R from CRAN, you get all of the above, which represents a substantial amount of functionality. However, there are many other packages available:\n\n- There are over 10,000 packages on CRAN that have been developed by users and programmers around the world.\n\n- There are also many packages associated with the [Bioconductor project](http://bioconductor.org).\n\n- People often make packages available on their personal websites; there is no reliable way to keep track of how many packages are available in this fashion.\n\n::: callout-note\n## Questions\n\n1. How many R packages are on CRAN today?\n2. How many R packages are on Bioconductor today?\n3. How many R packages are on GitHub today?\n:::\n\n### Limitations of R\n\nNo programming language or statistical analysis system is perfect. R certainly has a number of drawbacks. For starters, R is essentially based on **almost 50 year old technology**, going back to the original S system developed at Bell Labs. There was originally little built in support for dynamic or 3-D graphics (but things have improved greatly since the \"old days\").\n\nAnother commonly cited limitation of R is that **objects must generally be stored in physical memory** (though this is increasingly not true anymore). This is in part due to the scoping rules of the language, but R generally is more of a memory hog than other statistical packages. However, there have been a number of advancements to deal with this, both in the R core and also in a number of packages developed by contributors. Also, computing power and capacity has continued to grow over time and amount of physical memory that can be installed on even a consumer-level laptop is substantial. While we will likely never have enough physical memory on a computer to handle the increasingly large datasets that are being generated, the situation has gotten quite a bit easier over time.\n\nAt a higher level one \"limitation\" of R is that **its functionality is based on consumer demand and (voluntary) user contributions**. If no one feels like implementing your favorite method, then it's *your* job to implement it (or you need to pay someone to do it). The capabilities of the R system generally reflect the interests of the R user community. As the community has ballooned in size over the past 10 years, the capabilities have similarly increased. When I first started using R, there was very little in the way of functionality for the physical sciences (physics, astronomy, etc.). However, now some of those communities have adopted R and we are seeing more code being written for those kinds of applications.\n\n# Using R and RStudio\n\n> If R is the engine and bare bones of your car, then RStudio is like the rest of the car. The engine is super critical part of your car. But in order to make things properly functional, you need to have a steering wheel, comfy seats, a radio, rear and side view mirrors, storage, and seatbelts. --- *Nicholas Tierney*\n\n\\[[Source](https://rmd4sci.njtierney.com)\\]\n\nThe RStudio layout has the following features:\n\n- On the upper left, something called a Rmarkdown script\n- On the lower left, the R console\n- On the lower right, the view for files, plots, packages, help, and viewer.\n- On the upper right, the environment / history pane\n\n![A screenshot of the RStudio integrated developer environment (IDE) -- aka the working environment](https://github.com/njtierney/rmd4sci/raw/master/figs/rstudio-screenshot.png)\n\nThe R console is the bit where you can run your code. This is where the R code in your Rmarkdown document gets sent to run (we'll learn about these files later).\n\nThe file/plot/pkg viewer is a handy browser for your current files, like Finder, or File Explorer, plots are where your plots appear, you can view packages, see the help files. And the environment / history pane contains the list of things you have created, and the past commands that you have run.\n\n### Installing R and RStudio\n\n- If you have not already, [install R first](http://cran.r-project.org). If you already have R installed, make sure it is a fairly recent version, version 4.0 or newer. If yours is older, I suggest you update (install a new R version).\n- Once you have R installed, install the free version of [RStudio Desktop](https://www.rstudio.com/products/rstudio/download/). Again, make sure it's a recent version.\n\n::: callout-tip\nInstalling R and RStudio should be fairly straightforward. However, a great set of detailed instructions is in Rafael Irizarry's `dsbook`\n\n- \n:::\n\nIf things don't work, ask for help in the Courseplus discussion board.\n\nI personally only have experience with Mac, but everything should work on all the standard operating systems (Windows, Mac, and even Linux).\n\n### RStudio default options\n\nTo first get set up, I highly recommend changing the following setting\n\nTools \\> Global Options (or `Cmd + ,` on macOS)\n\nUnder the **General** tab:\n\n- For **workspace**\n - Uncheck restore .RData into workspace at startup\n - Save workspace to .RData on exit : \"Never\"\n- For **History**\n - Uncheck \"Always save history (even when not saving .RData)\n - Uncheck \"Remove duplicate entries in history\"\n\nThis means that you won't save the objects and other things that you create in your R session and reload them. This is important for two reasons\n\n1. **Reproducibility**: you don't want to have objects from last week cluttering your session\n2. **Privacy**: you don't want to save private data or other things to your session. You only want to read these in.\n\nYour \"history\" is the commands that you have entered into R.\n\nAdditionally, not saving your history means that you won't be relying on things that you typed in the last session, which is a good habit to get into!\n\n### Installing and loading R packages\n\nAs we discussed, most of the functionality and features in R come in the form of add-on packages. There are tens of thousands of packages available, some big, some small, some well documented, some not. We will be using many different packages in this course. Of course, you are free to install and use any package you come across for any of the assignments.\n\nThe \"official\" place for packages is the [CRAN website](https://cran.r-project.org/web/packages/available_packages_by_name.html). If you are interested in packages on a specific topic, the [CRAN task views](http://cran.r-project.org/web/views/) provide curated descriptions of packages sorted by topic.\n\nTo install an R package from CRAN, one can simply call the `install.packages()` function and pass the name of the package as an argument. For example, to install the `ggplot2` package from CRAN: open RStudio,go to the R prompt (the `>` symbol) in the lower-left corner and type\n\n\n::: {.cell}\n\n```{.r .cell-code}\ninstall.packages(\"ggplot2\")\n```\n:::\n\n\nand the appropriate version of the package will be installed.\n\nOften, a package needs other packages to work (called dependencies), and they are installed automatically. It usually does not matter if you use a single or double quotation mark around the name of the package.\n\n::: callout-note\n## Questions\n\n1. As you installed the `ggplot2` package, what other packages were installed?\n2. What happens if you tried to install `GGplot2`?\n:::\n\nIt could be that you already have all packages required by `ggplot2` installed. In that case, you will not see any other packages installed. To see which of the packages above `ggplot2` needs (and thus installs if it is not present), type into the R console:\n\n\n::: {.cell}\n\n```{.r .cell-code}\ntools::package_dependencies(\"ggplot2\")\n```\n:::\n\n\nIn RStudio, you can also install (and update/remove) packages by clicking on the 'Packages' tab in the bottom right window.\n\nIt is very common these days for packages to be developed on GitHub. It is possible to install packages from GitHub directly. Those usually contain the latest version of the package, with features that might not be available yet on the CRAN website. Sometimes, in early development stages, a package is only on GitHub until the developer(s) feel it is good enough for CRAN submission. So installing from GitHub gives you the latest. The downside is that packages under development can often be buggy and not working right. To install packages from GitHub, you need to install the `remotes` package and then use the following function\n\n\n::: {.cell}\n\n```{.r .cell-code}\nremotes::install_github()\n```\n:::\n\n\nWe will not do that now, but it is quite likely that at one point later in this course we will.\n\nYou only need to install a package once, unless you upgrade/re-install R. Once installed, you still need to load the package before you can use it. That has to happen every time you start a new R session. You do that using the `library()` command. For instance to load the `ggplot2` package, type\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary('ggplot2')\n```\n:::\n\n\nYou may or may not see a short message on the screen. Some packages show messages when you load them, and others do not.\n\nThis was a quick overview of R packages. We will use a lot of them, so you will get used to them rather quickly.\n\n### Getting started in RStudio\n\nWhile one can use R and do pretty much every task, including all the ones we cover in this class, without using RStudio, RStudio is very useful, has lots of features that make your R coding life easier and has become pretty much the default integrated development environment (IDE) for R. Since RStudio has lots of features, it takes time to learn them. A good resource to learn more about RStudio are the [R Studio Essentials](https://resources.rstudio.com/) collection of videos.\n\n::: callout-tip\nFor more information on setting up and getting started with R, RStudio, and R packages, read the Getting Started chapter in the `dsbook`:\n\n- \n\nThis chapter gives some tips, shortcuts, and ideas that might be of interest even to those of you who already have R and/or RStudio experience.\n:::\n\n# Post-lecture materials\n\n### Final Questions\n\nHere are some post-lecture questions to help you think about the material discussed.\n\n::: callout-note\n## Questions\n\n1. If a software company asks you, as a requirement for using their software, to sign a license that restricts you from using their software to commit illegal activities, is this consistent with the \"Four Freedoms\" of Free Software?\n\n2. What is an R package and what is it used for?\n\n3. What function in R can be used to install packages from CRAN?\n\n4. What is a limitation of the current R system?\n:::\n\n### Additional Resources\n\n::: callout-tip\n- [R for Data Science](https://r4ds.had.co.nz) by Wickham & Grolemund (2017). Covers most of the basics of using R for data analysis.\n\n- [Advanced R](https://adv-r.hadley.nz) by Wickham (2014). Covers a number of areas including object-oriented, programming, functional programming, profiling and other advanced topics.\n\n- [RStudio IDE cheatsheet](https://github.com/rstudio/cheatsheets/raw/master/rstudio-ide.pdf)\n:::\n\n## rtistry\n\n\n::: {.cell .fig-cap-location-top}\n::: {.cell-output-display}\n![](https://github.com/djnavarro/art/raw/master/static/gallery/water-colours/watercolour_splash.jpg)\n:::\n:::\n\n\n\\['Water Colours' from Danielle Navarro \\]\n\n# R session information\n\n\n::: {.cell}\n\n```{.r .cell-code}\noptions(width = 120)\nsessioninfo::session_info()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────\n setting value\n version R version 4.3.1 (2023-06-16)\n os macOS Ventura 13.5\n system aarch64, darwin20\n ui X11\n language (EN)\n collate en_US.UTF-8\n ctype en_US.UTF-8\n tz America/New_York\n date 2023-08-17\n pandoc 3.1.5 @ /opt/homebrew/bin/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────\n package * version date (UTC) lib source\n cli 3.6.1 2023-03-23 [1] CRAN (R 4.3.0)\n colorout 1.2-2 2023-05-06 [1] Github (jalvesaq/colorout@79931fd)\n digest 0.6.33 2023-07-07 [1] CRAN (R 4.3.0)\n evaluate 0.21 2023-05-05 [1] CRAN (R 4.3.0)\n fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.3.0)\n htmltools 0.5.6 2023-08-10 [1] CRAN (R 4.3.0)\n htmlwidgets 1.6.2 2023-03-17 [1] CRAN (R 4.3.0)\n jsonlite 1.8.7 2023-06-29 [1] CRAN (R 4.3.0)\n knitr 1.43 2023-05-25 [1] CRAN (R 4.3.0)\n rlang 1.1.1 2023-04-28 [1] CRAN (R 4.3.0)\n rmarkdown 2.24 2023-08-14 [1] CRAN (R 4.3.1)\n rstudioapi 0.15.0 2023-07-07 [1] CRAN (R 4.3.0)\n sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.3.0)\n xfun 0.40 2023-08-09 [1] CRAN (R 4.3.0)\n yaml 2.3.7 2023-01-23 [1] CRAN (R 4.3.0)\n\n [1] /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library\n\n──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n```\n:::\n:::\n", + "markdown": "---\ntitle: \"02 - Introduction to R and RStudio!\"\nauthor:\n - name: Leonardo Collado Torres\n url: http://lcolladotor.github.io/\n affiliations:\n - id: libd\n name: Lieber Institute for Brain Development\n url: https://libd.org/\n - id: jhsph\n name: Johns Hopkins Bloomberg School of Public Health Department of Biostatistics\n url: https://publichealth.jhu.edu/departments/biostatistics\ndescription: \"Let's dig into the R programming language and the RStudio integrated developer environment\"\nimage: https://github.com/njtierney/rmd4sci/raw/master/figs/rstudio-screenshot.png\ncategories: [module 1, week 1, R, programming, RStudio]\n---\n\n\n*This lecture, as the rest of the course, is adapted from the version [Stephanie C. Hicks](https://www.stephaniehicks.com/) designed and maintained in 2021 and 2022. Check the recent changes to this file through the [GitHub history](https://github.com/lcolladotor/jhustatcomputing2023/commits/main/posts/02-introduction-to-r-and-rstudio/index.qmd).*\n\n> There are only two kinds of languages: the ones people complain about and the ones nobody uses. ---*Bjarne Stroustrup*\n\n# Pre-lecture materials\n\n### Read ahead\n\n::: callout-note\n### Read ahead\n\n**Before class, you can prepare by reading the following materials:**\n\n1. [An overview and history of R](https://rdpeng.github.io/Biostat776/lecture-introduction-and-overview.html) from Roger Peng\n2. [Installing R and RStudio](https://rafalab.github.io/dsbook/installing-r-rstudio.html) from Rafael Irizarry\n3. [Getting Started in R and RStudio](https://rafalab.github.io/dsbook/getting-started.html) from Rafael Irizarry\n:::\n\n### Acknowledgements\n\nMaterial for this lecture was borrowed and adopted from\n\n- \n- \n- \n- \n\n# Learning objectives\n\n::: callout-note\n## Learning objectives\n\n**At the end of this lesson you will:**\n\n- Learn about (some of) the history of R.\n- Identify some of the strengths and weaknesses of R.\n- Install R and Rstudio on your computer.\n- Know how to install and load R packages.\n:::\n\n# Overview and history of R\n\nBelow is a very quick introduction to R, to get you set up and running. We'll go deeper into R and coding later.\n\n### tl;dr (R in a nutshell)\n\nLike every programming language, R has its advantages and disadvantages. If you search the internet, you will quickly discover lots of folks with opinions about R. Some of the features that are useful to know are:\n\n- R is open-source, freely accessible, and cross-platform (multiple OS).\n- R is a [\"high-level\" programming language](https://en.wikipedia.org/wiki/High-level_programming_language), relatively easy to learn.\n - While \"Low-level\" programming languages (e.g. Fortran, C, etc) often have more efficient code, they can also be harder to learn because it is designed to be close to a machine language.\n - In contrast, high-level languages deal more with variables, objects, functions, loops, and other abstract CS concepts with a focus on usability over optimal program efficiency.\n- R is great for statistics, data analysis, websites, web apps, data visualizations, and so much more!\n- R integrates easily with document preparation systems like $\\LaTeX$, but R files can also be used to create `.docx`, `.pdf`, `.html`, `.ppt` files with integrated R code output and graphics.\n- The R Community is very dynamic, helpful and welcoming.\n - Check out the [#rstats](https://twitter.com/search?q=%23rstats) or [#rtistry](https://twitter.com/search?q=%23rtistry) on Twitter, [TidyTuesday](https://www.tidytuesday.com) podcast and community activity in the [R4DS Online Learning Community](https://www.rfordatasci.com), and [r/rstats](https://www.reddit.com/r/rstats/) subreddit.\n - If you are looking for more local resources, check out [R-Ladies Baltimore](https://www.meetup.com/rladies-baltimore/).\n- Through R packages, it is easy to get lots of state-of-the-art algorithms.\n- Documentation and help files for R are generally good.\n\nWhile we use R in this course, it is not the only option to analyze data. Maybe the most similar to R, and widely used, is Python, which is also free. There is also commercial software that can be used to analyze data (e.g., Matlab, Mathematica, Tableau, SAS, SPSS). Other more general programming languages are suitable for certain types of analyses as well (e.g., C, Fortran, Perl, Java, Julia).\n\nDepending on your future needs or jobs, you might have to learn one or several of those additional languages. The good news is that even though those languages are all different, they all share general ways of thinking and structuring code. So once you understand a specific concept (e.g., variables, loops, branching statements or functions), it applies to all those languages. Thus, learning a new programming language is much easier once you already know one. And R is a good one to get started with.\n\nWith the skills gained in this course, hopefully you will find R a fun and useful programming language for your future projects.\n\n![Artwork by Allison Horst on learning R](https://github.com/allisonhorst/stats-illustrations/raw/main/rstats-artwork/r_first_then.png){width=\"80%\"}\n\n\\[**Source**: [Artwork by Allison Horst](https://github.com/allisonhorst/stats-illustrations)\\]\n\n### Basic Features of R\n\nToday R runs on almost any standard computing platform and operating system. Its open source nature means that anyone is free to adapt the software to whatever platform they choose. Indeed, R has been reported to be running on modern tablets, phones, PDAs, and game consoles.\n\nOne nice feature that R shares with many popular open source projects is frequent releases. These days there is a major annual release, typically in October, where major new features are incorporated and released to the public. Throughout the year, smaller-scale bugfix releases will be made as needed. The frequent releases and regular release cycle indicates active development of the software and ensures that bugs will be addressed in a timely manner. Of course, while the core developers control the primary source tree for R, many people around the world make contributions in the form of new feature, bug fixes, or both.\n\nAnother key advantage that R has over many other statistical packages (even today) is its sophisticated graphics capabilities. R's ability to create \"publication quality\" graphics has existed since the very beginning and has generally been better than competing packages. Today, with many more visualization packages available than before, that trend continues. R's base graphics system allows for very fine control over essentially every aspect of a plot or graph. Other newer graphics systems, like lattice and ggplot2 allow for complex and sophisticated visualizations of high-dimensional data.\n\nR has maintained the original S philosophy (see box below), which is that **it provides a language that is both useful for interactive work, but contains a powerful programming language for developing new tools**. This allows the user, who takes existing tools and applies them to data, to slowly but surely become a developer who is creating new tools.\n\n::: callout-tip\nFor a great discussion on an overview and history of R and the S programming language, read through [this chapter](https://rdpeng.github.io/Biostat776/lecture-introduction-and-overview.html) from Roger D. Peng.\n:::\n\nFinally, one of the joys of using R has nothing to do with the language itself, but rather with the active and vibrant user community. In many ways, a language is successful inasmuch as it creates a platform with which many people can create new things. R is that platform and thousands of people around the world have come together to make contributions to R, to develop packages, and help each other use R for all kinds of applications. The R-help and R-devel mailing lists have been highly active for over a decade now and there is considerable activity on web sites like Stack Overflow, Twitter [#rstats](https://twitter.com/search?q=%23rstats), [#rtistry](https://twitter.com/search?q=%23rtistry), and [Reddit](https://www.reddit.com/r/rstats/).\n\n### Free Software\n\nA major advantage that R has over many other statistical packages and is that it's free in the sense of free software (it's also free in the sense of free beer). The copyright for the primary source code for R is held by the [R Foundation](http://www.r-project.org/foundation/) and is published under the [GNU General Public License version 2.0](http://www.gnu.org/licenses/gpl-2.0.html).\n\nAccording to the Free Software Foundation, with *free software*, you are granted the following [four freedoms](http://www.gnu.org/philosophy/free-sw.html)\n\n- The freedom to run the program, for any purpose (freedom 0).\n\n- The freedom to study how the program works, and adapt it to your needs (freedom 1). Access to the source code is a precondition for this.\n\n- The freedom to redistribute copies so you can help your neighbor (freedom 2).\n\n- The freedom to improve the program, and release your improvements to the public, so that the whole community benefits (freedom 3). Access to the source code is a precondition for this.\n\n::: callout-tip\nYou can visit the [Free Software Foundation's web site](http://www.fsf.org) to learn a lot more about free software. The Free Software Foundation was founded by Richard Stallman in 1985 and [Stallman's personal web site](https://stallman.org) is an interesting read if you happen to have some spare time.\n:::\n\n### Design of the R System\n\nThe primary R system is available from the [Comprehensive R Archive Network](http://cran.r-project.org), also known as CRAN. CRAN also hosts many add-on packages that can be used to extend the functionality of R.\n\nThe R system is divided into 2 conceptual parts:\n\n1. The \"base\" R system that you download from CRAN:\n\n- [Linux](http://cran.r-project.org/bin/linux/)\n- [Windows](http://cran.r-project.org/bin/windows/)\n- [Mac](http://cran.r-project.org/bin/macosx/)\n\n2. Everything else.\n\nR functionality is divided into a number of *packages*.\n\n- The \"base\" R system contains, among other things, the `base` package which is required to run R and contains the most fundamental functions.\n\n- The other packages contained in the \"base\" system include `utils`, `stats`, `datasets`, `graphics`, `grDevices`, `grid`, `methods`, `tools`, `parallel`, `compiler`, `splines`, `tcltk`, `stats4`.\n\n- There are also \"Recommended\" packages: `boot`, `class`, `cluster`, `codetools`, `foreign`, `KernSmooth`, `lattice`, `mgcv`, `nlme`, `rpart`, `survival`, `MASS`, `spatial`, `nnet`, `Matrix`.\n\nWhen you download a fresh installation of R from CRAN, you get all of the above, which represents a substantial amount of functionality. However, there are many other packages available:\n\n- There are over 10,000 packages on CRAN that have been developed by users and programmers around the world.\n\n- There are also many packages associated with the [Bioconductor project](http://bioconductor.org).\n\n- People often make packages available on their personal websites; there is no reliable way to keep track of how many packages are available in this fashion.\n\n::: callout-note\n## Questions\n\n1. How many R packages are on CRAN today?\n2. How many R packages are on Bioconductor today?\n3. How many R packages are on GitHub today?\n:::\n\n### Limitations of R\n\nNo programming language or statistical analysis system is perfect. R certainly has a number of drawbacks. For starters, R is essentially based on **almost 50 year old technology**, going back to the original S system developed at Bell Labs. There was originally little built in support for dynamic or 3-D graphics (but things have improved greatly since the \"old days\").\n\nAnother commonly cited limitation of R is that **objects must generally be stored in physical memory** (though this is increasingly not true anymore). This is in part due to the scoping rules of the language, but R generally is more of a memory hog than other statistical packages. However, there have been a number of advancements to deal with this, both in the R core and also in a number of packages developed by contributors. Also, computing power and capacity has continued to grow over time and amount of physical memory that can be installed on even a consumer-level laptop is substantial. While we will likely never have enough physical memory on a computer to handle the increasingly large datasets that are being generated, the situation has gotten quite a bit easier over time.\n\nAt a higher level one \"limitation\" of R is that **its functionality is based on consumer demand and (voluntary) user contributions**. If no one feels like implementing your favorite method, then it's *your* job to implement it (or you need to pay someone to do it). The capabilities of the R system generally reflect the interests of the R user community. As the community has ballooned in size over the past 10 years, the capabilities have similarly increased. When I first started using R, there was very little in the way of functionality for the physical sciences (physics, astronomy, etc.). However, now some of those communities have adopted R and we are seeing more code being written for those kinds of applications.\n\n# Using R and RStudio\n\n> If R is the engine and bare bones of your car, then RStudio is like the rest of the car. The engine is super critical part of your car. But in order to make things properly functional, you need to have a steering wheel, comfy seats, a radio, rear and side view mirrors, storage, and seatbelts. --- *Nicholas Tierney*\n\n\\[[Source](https://rmd4sci.njtierney.com)\\]\n\nThe RStudio layout has the following features:\n\n- On the upper left, something called a Rmarkdown script\n- On the lower left, the R console\n- On the lower right, the view for files, plots, packages, help, and viewer.\n- On the upper right, the environment / history pane\n\n![A screenshot of the RStudio integrated developer environment (IDE) -- aka the working environment](https://github.com/njtierney/rmd4sci/raw/master/figs/rstudio-screenshot.png)\n\nThe R console is the bit where you can run your code. This is where the R code in your Rmarkdown document gets sent to run (we'll learn about these files later).\n\nThe file/plot/pkg viewer is a handy browser for your current files, like Finder, or File Explorer, plots are where your plots appear, you can view packages, see the help files. And the environment / history pane contains the list of things you have created, and the past commands that you have run.\n\n### Installing R and RStudio\n\n- If you have not already, [install R first](http://cran.r-project.org). If you already have R installed, make sure it is a fairly recent version, version 4.0 or newer. If yours is older, I suggest you update (install a new R version).\n- Once you have R installed, install the free version of [RStudio Desktop](https://www.rstudio.com/products/rstudio/download/). Again, make sure it's a recent version.\n\n::: callout-tip\nInstalling R and RStudio should be fairly straightforward. However, a great set of detailed instructions is in Rafael Irizarry's `dsbook`\n\n- \n:::\n\nIf things don't work, ask for help in the Courseplus discussion board.\n\nI personally only have experience with Mac, but everything should work on all the standard operating systems (Windows, Mac, and even Linux).\n\n### RStudio default options\n\nTo first get set up, I highly recommend changing the following setting\n\nTools \\> Global Options (or `Cmd + ,` on macOS)\n\nUnder the **General** tab:\n\n- For **workspace**\n - Uncheck restore .RData into workspace at startup\n - Save workspace to .RData on exit : \"Never\"\n- For **History**\n - Uncheck \"Always save history (even when not saving .RData)\n - Uncheck \"Remove duplicate entries in history\"\n\nThis means that you won't save the objects and other things that you create in your R session and reload them. This is important for two reasons\n\n1. **Reproducibility**: you don't want to have objects from last week cluttering your session\n2. **Privacy**: you don't want to save private data or other things to your session. You only want to read these in.\n\nYour \"history\" is the commands that you have entered into R.\n\nAdditionally, not saving your history means that you won't be relying on things that you typed in the last session, which is a good habit to get into!\n\n### Installing and loading R packages\n\nAs we discussed, most of the functionality and features in R come in the form of add-on packages. There are tens of thousands of packages available, some big, some small, some well documented, some not. We will be using many different packages in this course. Of course, you are free to install and use any package you come across for any of the assignments.\n\nThe \"official\" place for packages is the [CRAN website](https://cran.r-project.org/web/packages/available_packages_by_name.html). If you are interested in packages on a specific topic, the [CRAN task views](http://cran.r-project.org/web/views/) provide curated descriptions of packages sorted by topic.\n\nTo install an R package from CRAN, one can simply call the `install.packages()` function and pass the name of the package as an argument. For example, to install the `ggplot2` package from CRAN: open RStudio,go to the R prompt (the `>` symbol) in the lower-left corner and type\n\n\n::: {.cell}\n\n```{.r .cell-code}\ninstall.packages(\"ggplot2\")\n```\n:::\n\n\nand the appropriate version of the package will be installed.\n\nOften, a package needs other packages to work (called dependencies), and they are installed automatically. It usually does not matter if you use a single or double quotation mark around the name of the package.\n\n::: callout-note\n## Questions\n\n1. As you installed the `ggplot2` package, what other packages were installed?\n2. What happens if you tried to install `GGplot2`?\n:::\n\nIt could be that you already have all packages required by `ggplot2` installed. In that case, you will not see any other packages installed. To see which of the packages above `ggplot2` needs (and thus installs if it is not present), type into the R console:\n\n\n::: {.cell}\n\n```{.r .cell-code}\ntools::package_dependencies(\"ggplot2\")\n```\n:::\n\n\nIn RStudio, you can also install (and update/remove) packages by clicking on the 'Packages' tab in the bottom right window.\n\nIt is very common these days for packages to be developed on GitHub. It is possible to install packages from GitHub directly. Those usually contain the latest version of the package, with features that might not be available yet on the CRAN website. Sometimes, in early development stages, a package is only on GitHub until the developer(s) feel it is good enough for CRAN submission. So installing from GitHub gives you the latest. The downside is that packages under development can often be buggy and not working right. To install packages from GitHub, you need to install the `remotes` package and then use the following function\n\n\n::: {.cell}\n\n```{.r .cell-code}\nremotes::install_github()\n```\n:::\n\n\nWe will not do that now, but it is quite likely that at one point later in this course we will.\n\nYou only need to install a package once, unless you upgrade/re-install R. Once installed, you still need to load the package before you can use it. That has to happen every time you start a new R session. You do that using the `library()` command. For instance to load the `ggplot2` package, type\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(\"ggplot2\")\n```\n:::\n\n\nYou may or may not see a short message on the screen. Some packages show messages when you load them, and others do not.\n\nThis was a quick overview of R packages. We will use a lot of them, so you will get used to them rather quickly.\n\n### Getting started in RStudio\n\nWhile one can use R and do pretty much every task, including all the ones we cover in this class, without using RStudio, RStudio is very useful, has lots of features that make your R coding life easier and has become pretty much the default integrated development environment (IDE) for R. Since RStudio has lots of features, it takes time to learn them. A good resource to learn more about RStudio are the [R Studio Essentials](https://resources.rstudio.com/) collection of videos.\n\n::: callout-tip\nFor more information on setting up and getting started with R, RStudio, and R packages, read the Getting Started chapter in the `dsbook`:\n\n- \n\nThis chapter gives some tips, shortcuts, and ideas that might be of interest even to those of you who already have R and/or RStudio experience.\n:::\n\n# Post-lecture materials\n\n### Final Questions\n\nHere are some post-lecture questions to help you think about the material discussed.\n\n::: callout-note\n## Questions\n\n1. If a software company asks you, as a requirement for using their software, to sign a license that restricts you from using their software to commit illegal activities, is this consistent with the \"Four Freedoms\" of Free Software?\n\n2. What is an R package and what is it used for?\n\n3. What function in R can be used to install packages from CRAN?\n\n4. What is a limitation of the current R system?\n:::\n\n### Additional Resources\n\n::: callout-tip\n- [R for Data Science](https://r4ds.had.co.nz) by Wickham & Grolemund (2017). Covers most of the basics of using R for data analysis.\n\n- [Advanced R](https://adv-r.hadley.nz) by Wickham (2014). Covers a number of areas including object-oriented, programming, functional programming, profiling and other advanced topics.\n\n- [RStudio IDE cheatsheet](https://github.com/rstudio/cheatsheets/raw/master/rstudio-ide.pdf)\n:::\n\n## rtistry\n\n\n::: {.cell .fig-cap-location-top}\n::: {.cell-output-display}\n![](https://github.com/djnavarro/art/raw/master/static/gallery/water-colours/watercolour_splash.jpg)\n:::\n:::\n\n\n\\['Water Colours' from Danielle Navarro \\]\n\n# R session information\n\n\n::: {.cell}\n\n```{.r .cell-code}\noptions(width = 120)\nsessioninfo::session_info()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────\n setting value\n version R version 4.3.1 (2023-06-16)\n os macOS Ventura 13.5\n system aarch64, darwin20\n ui X11\n language (EN)\n collate en_US.UTF-8\n ctype en_US.UTF-8\n tz America/New_York\n date 2023-08-17\n pandoc 3.1.5 @ /opt/homebrew/bin/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────\n package * version date (UTC) lib source\n cli 3.6.1 2023-03-23 [1] CRAN (R 4.3.0)\n colorout 1.2-2 2023-05-06 [1] Github (jalvesaq/colorout@79931fd)\n digest 0.6.33 2023-07-07 [1] CRAN (R 4.3.0)\n evaluate 0.21 2023-05-05 [1] CRAN (R 4.3.0)\n fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.3.0)\n htmltools 0.5.6 2023-08-10 [1] CRAN (R 4.3.0)\n htmlwidgets 1.6.2 2023-03-17 [1] CRAN (R 4.3.0)\n jsonlite 1.8.7 2023-06-29 [1] CRAN (R 4.3.0)\n knitr 1.43 2023-05-25 [1] CRAN (R 4.3.0)\n rlang 1.1.1 2023-04-28 [1] CRAN (R 4.3.0)\n rmarkdown 2.24 2023-08-14 [1] CRAN (R 4.3.1)\n rstudioapi 0.15.0 2023-07-07 [1] CRAN (R 4.3.0)\n sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.3.0)\n xfun 0.40 2023-08-09 [1] CRAN (R 4.3.0)\n yaml 2.3.7 2023-01-23 [1] CRAN (R 4.3.0)\n\n [1] /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library\n\n──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n```\n:::\n:::\n", "supporting": [], "filters": [ "rmarkdown/pagebreak.lua" diff --git a/_freeze/posts/05-literate-programming/index/execute-results/html.json b/_freeze/posts/05-literate-programming/index/execute-results/html.json index a5f3c3b..658affc 100644 --- a/_freeze/posts/05-literate-programming/index/execute-results/html.json +++ b/_freeze/posts/05-literate-programming/index/execute-results/html.json @@ -1,7 +1,7 @@ { - "hash": "4e89eeba2590cab5734e048c12e3697e", + "hash": "781f56af33f440fc1c8df4db96a05562", "result": { - "markdown": "---\ntitle: \"05 - Literate Statistical Programming\"\nauthor:\n - name: Leonardo Collado Torres\n url: http://lcolladotor.github.io/\n affiliations:\n - id: libd\n name: Lieber Institute for Brain Development\n url: https://libd.org/\n - id: jhsph\n name: Johns Hopkins Bloomberg School of Public Health Department of Biostatistics\n url: https://publichealth.jhu.edu/departments/biostatistics\ndescription: \"Introduction to literate statistical programming tools including R Markdown\"\nimage: https://github.com/allisonhorst/stats-illustrations/raw/main/rstats-artwork/rmarkdown_rockstar.png\ncategories: [module 1, week 1, R Markdown, programming]\nbibliography: my-refs.bib\n---\n\n\n*This lecture, as the rest of the course, is adapted from the version [Stephanie C. Hicks](https://www.stephaniehicks.com/) designed and maintained in 2021 and 2022. Check the recent changes to this file through the [GitHub history](https://github.com/lcolladotor/jhustatcomputing2023/commits/main/posts/05-literate-programming/index.qmd).*\n\n\n\n# Pre-lecture materials\n\n### Read ahead\n\n::: callout-note\n### Read ahead\n\n**Before class, you can prepare by reading the following materials:**\n\n1. \n2. \n:::\n\n### Acknowledgements\n\nMaterial for this lecture was borrowed and adopted from\n\n- \n- \n\n# Learning objectives\n\n::: callout-note\n# Learning objectives\n\n**At the end of this lesson you will:**\n\n- Be able to define literate programming\n- Recognize differences between available tools to for literate programming\n- Know how to efficiently work within RStudio for efficient literate programming\n- Create a R Markdown document\n:::\n\n# Introduction\n\nOne basic idea to make writing reproducible reports easier is what's known as *literate statistical programming* (or sometimes called [literate statistical practice](http://www.r-project.org/conferences/DSC-2001/Proceedings/Rossini.pdf)). This comes from the idea of [literate programming](https://en.wikipedia.org/wiki/Literate_programming) in the area of writing computer programs.\n\nThe idea is to **think of a report or a publication as a stream of text and code**.\n\n- The text is readable by people and the code is readable by computers.\n\n- The analysis is described in a series of text and code chunks.\n\n- Each kind of code chunk will do something like load some data or compute some results.\n\n- Each text chunk will relay something in a human readable language.\n\nThere might also be **presentation code** that formats tables and figures and there's article text that explains what's going on around all this code. This stream of text and code is a literate statistical program or a literate statistical analysis.\n\n### Weaving and Tangling\n\nLiterate programs by themselves are a bit difficult to work with, but they can be processed in two important ways.\n\nLiterate programs can be **weaved** to produce human readable documents like PDFs or HTML web pages, and they can **tangled** to produce machine-readable \"documents\", or in other words, machine readable code.\n\nThe basic idea behind literate programming in order to generate the different kinds of output you might need, **you only need a single source document**---you can weave and tangle to get the rest.\n\nIn order to use a system like this you need a documentational language, that's human readable, and you need a programming language that's machine readable (or can be compiled/interpreted into something that's machine readable).\n\n### Sweave\n\nOne of the original literate programming systems in R that was designed to do this was called Sweave. Sweave enables users to combine R code with a documentation program called LaTeX.\n\n**Sweave files ends a `.Rnw`** and have R code weaved through the document:\n\n``` \n<>=\ndata(airquality)\nplot(airquality$Ozone ~ airquality$Wind)\n@\n```\n\nOnce you have created your `.Rnw` file, Sweave will process the file, executing the R chunks and replacing them with output as appropriate before creating the PDF document.\n\nIt was originally developed by Fritz Leisch, who is a core member of R, and the code base is still maintained by R Core. The Sweave system comes with any installation of R.\n\nThere are many limitations to the original Sweave system.\n\n- One of the limitations is that it is **focused primarily on LaTeX**, which is not a documentation language that many people are familiar with.\n- Therefore, it **can be difficult to learn this type of markup language** if you're not already in a field that uses it regularly.\n- Sweave also **lacks a lot of features that people find useful** like caching, and multiple plots per page and mixing programming languages.\n\nInstead, folks have **moved towards using something called knitr**, which offers everything Sweave does, plus it extends it further.\n\n- With Sweave, additional tools are required for advanced operations, whereas knitr supports more internally. We'll discuss knitr below.\n\n### rmarkdown\n\nAnother choice for literate programming is to build documents based on [Markdown](https://en.wikipedia.org/wiki/Markdown) language. A markdown file is a plain text file that is typically given the extension `.md.`. The [`rmarkdown`](https://CRAN.R-project.org/package=rmarkdown) R package takes a R Markdown file (`.Rmd`) and weaves together R code chunks like this:\n\n```` \n```{r plot1, height=4, width=5, eval=FALSE, echo=TRUE}\ndata(airquality)\nplot(airquality$Ozone ~ airquality$Wind)\n```\n````\n\n::: callout-tip\nThe best resource for learning about R Markdown this by Yihui Xie, J. J. Allaire, and Garrett Grolemund:\n\n- \n\nThe R Markdown Cookbook by Yihui Xie, Christophe Dervieux, and Emily Riederer is really good too:\n\n- \n\nThe authors of the 2nd book describe the motivation for the 2nd book as:\n\n> \"However, we have received comments from our readers and publisher that it would be beneficial to provide more practical and relatively short examples to show the interesting and useful usage of R Markdown, because it can be daunting to find out how to achieve a certain task from the aforementioned reference book (put another way, that book is too dry to read). As a result, this cookbook was born.\"\n:::\n\nBecause this is lecture is built in a `.qmd` file (which is very similar to a `.Rmd` file), let's demonstrate how this work. I am going to change `eval=FALSE` to `eval=TRUE`.\n\n\n::: {.cell height='4' width='5'}\n\n```{.r .cell-code}\ndata(airquality)\nplot(airquality$Ozone ~ airquality$Wind)\n```\n\n::: {.cell-output-display}\n![](index_files/figure-html/plot2-1.png){width=672}\n:::\n:::\n\n\n::: callout-tip\n### Questions\n\n1. Why do we not see the back ticks \\`\\`\\` anymore in the code chunk above that made the plot?\n2. What do you think we should do if we want to have the code executed, but we want to hide the code that made it?\n:::\n\nBefore we leave this section, I find that there is quite a bit of terminology to understand the magic behind `rmarkdown` that can be confusing, so let's break it down:\n\n- [Pandoc](https://pandoc.org). Pandoc is a command line tool with no GUI that converts documents (e.g. from number of different markup formats to many other formats, such as .doc, .pdf etc). It is completely independent from R (but does come bundled with RStudio).\n- [Markdown](https://en.wikipedia.org/wiki/Markdown) (**markup language**). Markdown is a lightweight [markup language](https://en.wikipedia.org/wiki/Markup_language) with plain text formatting syntax designed so that it can be converted to HTML and many other formats. A markdown file is a plain text file that is typically given the extension `.md.` It is completely independent from R.\n- [`markdown`](https://CRAN.R-project.org/package=markdown) (**R package**). `markdown` is an R package which converts `.md` files into HTML. It is no longer recommended for use has been surpassed by [`rmarkdown`](https://CRAN.R-project.org/package=rmarkdown) (discussed below).\n- R Markdown (**markup language**). R Markdown is an extension of the markdown syntax. R Markdown files are plain text files that typically have the file extension `.Rmd`.\n- [`rmarkdown`](https://CRAN.R-project.org/package=rmarkdown) (**R package**). The R package `rmarkdown` is a library that uses pandoc to process and convert `.Rmd` files into a number of different formats. This core function is `rmarkdown::render()`. **Note**: this package only deals with the markdown language. If the input file is e.g. `.Rhtml` or `.Rnw`, then you need to use `knitr` prior to calling pandoc (see below).\n\n::: callout-tip\nCheck out the R Markdown Quick Tour for more:\n\n- \n:::\n\n![Artwork by Allison Horst on RMarkdown](https://github.com/allisonhorst/stats-illustrations/raw/main/rstats-artwork/rmarkdown_rockstar.png){width=\"80%\"}\n\n### knitr\n\nOne of the alternative that has come up in recent times is something called `knitr`.\n\n- The `knitr` package for R takes a lot of these ideas of literate programming and updates and improves upon them.\n- `knitr` still uses R as its programming language, but it allows you to mix other programming languages in.\n- You can also use a variety of documentation languages now, such as LaTeX, markdown and HTML.\n- `knitr` was developed by Yihui Xie while he was a graduate student at Iowa State and it has become a very popular package for writing literate statistical programs.\n\nKnitr takes a plain text document with embedded code, executes the code and 'knits' the results back into the document.\n\nFor for example, it converts\n\n- An R Markdown (`.Rmd)` file into a standard markdown file (`.md`)\n- An `.Rnw` (Sweave) file into to `.tex` format.\n- An `.Rhtml` file into to `.html`.\n\nThe core function is `knitr::knit()` and by default this will look at the input document and try and guess what type it is e.g. `Rnw`, `Rmd` etc.\n\nThis core function performs three roles:\n\n- A **source parser**, which looks at the input document and detects which parts are code that the user wants to be evaluated.\n- A **code evaluator**, which evaluates this code\n- An **output renderer**, which writes the results of evaluation back to the document in a format which is interpretable by the raw output type. For instance, if the input file is an `.Rmd`, the output render marks up the output of code evaluation in `.md` format.\n\n\n::: {.cell layout-align=\"center\" preview='true'}\n::: {.cell-output-display}\n![Converting a Rmd file to many outputs using knitr and pandoc](https://d33wubrfki0l68.cloudfront.net/61d189fd9cdf955058415d3e1b28dd60e1bd7c9b/9791d/images/rmarkdownflow.png){fig-align='center' width=60%}\n:::\n:::\n\n\n\\[[Source](https://rmarkdown.rstudio.com/authoring_quick_tour.html)\\]\n\nAs seen in the figure above, from there pandoc is used to convert e.g. a `.md` file into many other types of file formats into a `.html`, etc.\n\nSo in summary:\n\n> \"R Markdown stands on the shoulders of knitr and Pandoc. The former executes the computer code embedded in Markdown, and converts R Markdown to Markdown. The latter renders Markdown to the output format you want (such as PDF, HTML, Word, and so on).\"\n\n\\[[Source](https://bookdown.org/yihui/rmarkdown/)\\]\n\n# Create and Knit Your First R Markdown Document\n\n\n\nWhen creating your first R Markdown document, in RStudio you can\n\n1. Go to File \\> New File \\> R Markdown...\n\n2. Feel free to edit the Title\n\n3. Make sure to select \"Default Output Format\" to be HTML\n\n4. Click \"OK\". RStudio creates the R Markdown document and places some boilerplate text in there just so you can see how things are setup.\n\n5. Click the \"Knit\" button (or go to File \\> Knit Document) to make sure you can create the HTML output\n\nIf you successfully knit your first R Markdown document, then congratulations!\n\n\n::: {.cell}\n::: {.cell-output-display}\n![Mission accomplished!](https://media.giphy.com/media/L4ZZNbDpOCfiX8uYSd/giphy.gif){width=60%}\n:::\n:::\n\n\n# Websites and Books in R Markdown\n\nNow that you are on the road to using R Markdown documents, it is important to know about other wonderful things you do with these documents. For example, let's say you have multiple `.Rmd` documents that you want to put together into a website, blog, book, etc.\n\nThere are primarily two ways to build multiple `.Rmd` documents together:\n\n1. [**blogdown**](https://bookdown.org/yihui/blogdown/) for building websites\n2. [**bookdown**](https://bookdown.org/yihui/bookdown/) for authoring books\n\nIn this section, we briefly introduce both packages, but it's worth mentioning that the [**rmarkdown** package also has a built-in site generator](https://bookdown.org/yihui/rmarkdown/rmarkdown-site.html) to build websites.\n\n### blogdown\n\n\n::: {.cell}\n::: {.cell-output-display}\n![blogdown logo](https://bookdown.org/yihui/blogdown/images/logo.png){width=30%}\n:::\n:::\n\n\n\\[[Source](https://bookdown.org/yihui/bookdown/images/logo.png)\\]\n\nThe `blogdown` R package is built on top of R Markdown, supports multi-page HTML output to write a blog post or a general page in an Rmd document, or a plain Markdown document.\n\n- These source documents (e.g. `.Rmd` or `.md`) are built into a static website (i.e. a bunch of static HTML files, images and CSS files).\n- Using this folder of files, it is very easy to publish it to any web server as a website.\n- Also, it is easy to maintain because it is only a single folder.\n\n::: callout-tip\nFor example, my personal website was built in blogdown:\n\n- \n\nOther really great examples can be found here:\n\n- \n:::\n\nOther advantages include the content likely being reproducible, easier to maintain, and easy to convert pages to e.g. PDF or other formats in the future if you do not want to convert to HTML files.\n\nBecause it is based on the Markdown syntax, it is easy to write technical documents, including math equations, insert figures or tables with captions, cross-reference with figure or table numbers, add citations, and present theorems or proofs.\n\nHere's a video you can watch of someone making a blogdown website.\n\n

\n\n\n\n

\n\n\\[[Source](https://www.youtube.com/watch?v=AADnslLpzJ4) on YouTube\\]\n\n### bookdown\n\n\n::: {.cell}\n::: {.cell-output-display}\n![book logo](https://bookdown.org/yihui/bookdown/images/logo.png){width=30%}\n:::\n:::\n\n\n\\[[Source](https://bookdown.org/yihui/bookdown/images/logo.png)\\]\n\nSimilar to `blogdown`, the `bookdown` R package is built on top of R Markdown, but also offers features like multi-page HTML output, numbering and cross-referencing figures/tables/sections/equations, inserting parts/appendices, and imported the GitBook style () to create elegant and appealing HTML book pages. Share\n\n::: callout-tip\nFor example, the previous version of this course was built in bookdown:\n\n- \n\nAnother example is the [Tidyverse Skills for Data Science](https://jhudatascience.org/tidyversecourse/) book that the JHU Data Science Lab wrote. The github repo that contains all the `.Rmd` files can be found [here](https://github.com/jhudsl/tidyversecourse).\n\n- \n- \n:::\n\n**Note**: Even though the word \"book\" is in \"bookdown\", this package is not only for books. It really can be anything that consists of multiple `.Rmd` documents meant to be read in a linear sequence such as course dissertation/thesis, handouts, study notes, a software manual, a thesis, or even a diary.\n\n- https://bookdown.org/yihui/rmarkdown/basics-examples.html#examples-books\n\n### distill\n\nThere is another great way to build blogs or websites using the [distill for R Markdown](https://rstudio.github.io/distill/).\n\n- \n\nDistill for R Markdown combines the technical authoring features of the [Distill web framework](https://github.com/distillpub/template) (optimized for scientific and technical communication) with [R Markdown](https://rmarkdown.rstudio.com), enabling a fully reproducible workflow based on literate programming [@knuth1984].\n\nDistill articles include:\n\n- Reader-friendly typography that adapts well to mobile devices.\n- Features essential to technical writing like LaTeX math, citations, and footnotes.\n- Flexible figure layout options (e.g. displaying figures at a larger width than the article text).\n- Attractively rendered tables with optional support for pagination.\n- Support for a wide variety of diagramming tools for illustrating concepts. The ability to incorporate JavaScript and D3-based interactive visualizations.\n- A variety of ways to publish articles, including support for publishing sets of articles as a Distill website or as a Distill blog.\n\nThe course website from last year was built in Distill for R Markdown:\n\n- Website: \n- Github: \n\nSome other cool things about distill is the use of footnotes and asides.\n\nFor example [^1]. The number of the footnote will be automatically generated.\n\n[^1]: This will become a hover-able footnote\n\nYou can also optionally include notes in the gutter of the article (immediately to the right of the article text). To do this use the aside tag.\n\n\n\nYou can also include figures in the gutter. Just enclose the code chunk which generates the figure in an aside tag\n\n# Tips and tricks in R Markdown in RStudio\n\nHere are shortcuts and tips on efficiently using RStudio to improve how you write code.\n\n### Run code\n\nIf you want to run a code chunk:\n\n``` \ncommand + Enter on Mac\nCtrl + Enter on Windows\n```\n\n### Insert a comment in R and R Markdown\n\nTo insert a comment:\n\n``` \ncommand + Shift + C on Mac\nCtrl + Shift + C on Windows\n```\n\nThis shortcut can be used both for:\n\n- R code when you want to comment your code. It will add a `#` at the beginning of the line\n- for text in R Markdown. It will add `` around the text\n\nNote that if you want to comment more than one line, select all the lines you want to comment then use the shortcut. If you want to uncomment a comment, apply the same shortcut.\n\n### Knit a R Markdown document\n\nYou can knit R Markdown documents by using this shortcut:\n\n``` \ncommand + Shift + K on Mac\nCtrl + Shift + K on Windows\n```\n\n### Code snippets\n\nCode snippets is usually a few characters long and is used as a shortcut to insert a common piece of code. You simply type a few characters then press `Tab` and it will complete your code with a larger code. `Tab` is then used again to navigate through the code where customization is required. For instance, if you type `fun` then press `Tab`, it will auto-complete the code with the required code to create a function:\n\n``` \nname <- function(variables) {\n \n}\n```\n\nPressing `Tab` again will jump through the placeholders for you to edit it. So you can first edit the name of the function, then the variables and finally the code inside the function (try by yourself!).\n\nThere are many code snippets by default in RStudio. Here are the code snippets I use most often:\n\n- `lib` to call `library()`\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(package)\n```\n:::\n\n\n- `mat` to create a matrix\n\n\n::: {.cell}\n\n```{.r .cell-code}\nmatrix(data, nrow = rows, ncol = cols)\n```\n:::\n\n\n- `if`, `el`, and `ei` to create conditional expressions such as `if() {}`, `else {}` and `else if () {}`\n\n\n::: {.cell}\n\n```{.r .cell-code}\nif (condition) {\n \n}\n\nelse {\n \n}\n\nelse if (condition) {\n \n}\n```\n:::\n\n\n- `fun` to create a function\n\n\n::: {.cell}\n\n```{.r .cell-code}\nname <- function(variables) {\n \n}\n```\n:::\n\n\n- `for` to create for loops\n\n\n::: {.cell}\n\n```{.r .cell-code}\nfor (variable in vector) {\n \n}\n```\n:::\n\n\n- `ts` to insert a comment with the current date and time (useful if you have very long code and share it with others so they see when it has been edited)\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# Tue Jan 21 20:20:14 2020 ------------------------------\n```\n:::\n\n\nYou can see all default code snippets and add yours by clicking on Tools \\> Global Options... \\> Code (left sidebar) \\> Edit Snippets...\n\n### Ordered list in R Markdown\n\nIn R Markdown, when creating an ordered list such as this one:\n\n1. Item 1\n2. Item 2\n3. Item 3\n\nInstead of bothering with the numbers and typing\n\n``` \n1. Item 1\n2. Item 2\n3. Item 3\n```\n\nyou can simply type\n\n``` \n1. Item 1\n1. Item 2\n1. Item 3\n```\n\nfor the exact same result (try it yourself or check the code of this article!). This way you do not need to bother which number is next when creating a new item.\n\nTo go even further, any numeric will actually render the same result as long as the first item is the number you want to start from. For example, you could type:\n\n``` \n1. Item 1\n7. Item 2\n3. Item 3\n```\n\nwhich renders\n\n1. Item 1\n2. Item 2\n3. Item 3\n\nHowever, I suggest always using the number you want to start from for all items because if you move one item at the top, the list will start with this new number. For instance, if we move `7. Item 2` from the previous list at the top, the list becomes:\n\n``` \n7. Item 2\n1. Item 1\n3. Item 3\n```\n\nwhich incorrectly renders\n\n7. Item 2\n8. Item 1\n9. Item 3\n\n### New code chunk in R Markdown\n\nWhen editing R Markdown documents, you will need to insert a new R code chunk many times. The following shortcuts will make your life easier:\n\n``` \ncommand + option + I on Mac (or command + alt + I depending on your keyboard)\nCtrl + ALT + I on Windows\n```\n\n### Reformat code\n\nA clear and readable code is always easier and faster to read (and look more professional when sharing it to collaborators). To automatically apply the most common coding guidelines such as white spaces, indents, etc., use:\n\n``` \ncmd + Shift + A on Mac\nCtrl + Shift + A on Windows\n```\n\nSo for example the following code which does not respect the guidelines (and which is not easy to read):\n\n``` \n1+1\n for(i in 1:10){if(!i%%2){next}\nprint(i)\n }\n```\n\nbecomes much more neat and readable:\n\n``` \n1 + 1\nfor (i in 1:10) {\n if (!i %% 2) {\n next\n }\n print(i)\n}\n```\n\n### RStudio addins\n\nRStudio addins are extensions which provide a simple mechanism for executing advanced R functions from within RStudio. In simpler words, when executing an addin (by clicking a button in the Addins menu), the corresponding code is executed without you having to write the code. RStudio addins have the advantage that they allow you to execute complex and advanced code much more easily than if you would have to write it yourself.\n\n::: callout-tip\n**For more information about RStudio addins, check out**:\n\n- \n- \n:::\n\n### Others\n\nSimilar to many other programs, you can also use:\n\n- `command + Shift + N` on Mac and `Ctrl + Shift + N` on Windows to open a new R Script\n- `command + S` on Mac and `Ctrl + S` on Windows to save your current script or R Markdown document\n\nCheck out Tools --\\> Keyboard Shortcuts Help to see a long list of these shortcuts.\n\n# Post-lecture materials\n\n### Final Questions\n\nHere are some post-lecture questions to help you think about the material discussed.\n\n::: questions\n### Questions\n\n1. What is literate programming?\n\n2. What was the first literate statistical programming tool to weave together a statistical language (R) with a markup language (LaTeX)?\n\n3. What is `knitr` and how is different than other literate statistical programming tools?\n\n4. Where can you find a list of other commands that help make your code writing more efficient in RStudio?\n:::\n\n### Additional Resources\n\n::: callout-tip\n- [RMarkdown Tips and Tricks](https://indrajeetpatil.github.io/RmarkdownTips/) by Indrajeet Patil\n- \n- \n:::\n\n# R session information\n\n\n::: {.cell}\n\n```{.r .cell-code}\noptions(width = 120)\nsessioninfo::session_info()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────\n setting value\n version R version 4.3.1 (2023-06-16)\n os macOS Ventura 13.5\n system aarch64, darwin20\n ui X11\n language (EN)\n collate en_US.UTF-8\n ctype en_US.UTF-8\n tz America/New_York\n date 2023-08-17\n pandoc 3.1.5 @ /opt/homebrew/bin/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────\n package * version date (UTC) lib source\n cli 3.6.1 2023-03-23 [1] CRAN (R 4.3.0)\n colorout 1.2-2 2023-05-06 [1] Github (jalvesaq/colorout@79931fd)\n digest 0.6.33 2023-07-07 [1] CRAN (R 4.3.0)\n evaluate 0.21 2023-05-05 [1] CRAN (R 4.3.0)\n fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.3.0)\n htmltools 0.5.6 2023-08-10 [1] CRAN (R 4.3.0)\n htmlwidgets 1.6.2 2023-03-17 [1] CRAN (R 4.3.0)\n jsonlite 1.8.7 2023-06-29 [1] CRAN (R 4.3.0)\n knitr 1.43 2023-05-25 [1] CRAN (R 4.3.0)\n rlang 1.1.1 2023-04-28 [1] CRAN (R 4.3.0)\n rmarkdown 2.24 2023-08-14 [1] CRAN (R 4.3.1)\n rstudioapi 0.15.0 2023-07-07 [1] CRAN (R 4.3.0)\n sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.3.0)\n xfun 0.40 2023-08-09 [1] CRAN (R 4.3.0)\n yaml 2.3.7 2023-01-23 [1] CRAN (R 4.3.0)\n\n [1] /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library\n\n──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n```\n:::\n:::\n", + "markdown": "---\ntitle: \"05 - Literate Statistical Programming\"\nauthor:\n - name: Leonardo Collado Torres\n url: http://lcolladotor.github.io/\n affiliations:\n - id: libd\n name: Lieber Institute for Brain Development\n url: https://libd.org/\n - id: jhsph\n name: Johns Hopkins Bloomberg School of Public Health Department of Biostatistics\n url: https://publichealth.jhu.edu/departments/biostatistics\ndescription: \"Introduction to literate statistical programming tools including R Markdown\"\nimage: https://github.com/allisonhorst/stats-illustrations/raw/main/rstats-artwork/rmarkdown_rockstar.png\ncategories: [module 1, week 1, R Markdown, programming]\nbibliography: my-refs.bib\n---\n\n\n*This lecture, as the rest of the course, is adapted from the version [Stephanie C. Hicks](https://www.stephaniehicks.com/) designed and maintained in 2021 and 2022. Check the recent changes to this file through the [GitHub history](https://github.com/lcolladotor/jhustatcomputing2023/commits/main/posts/05-literate-programming/index.qmd).*\n\n\n\n# Pre-lecture materials\n\n### Read ahead\n\n::: callout-note\n### Read ahead\n\n**Before class, you can prepare by reading the following materials:**\n\n1. \n2. \n:::\n\n### Acknowledgements\n\nMaterial for this lecture was borrowed and adopted from\n\n- \n- \n\n# Learning objectives\n\n::: callout-note\n# Learning objectives\n\n**At the end of this lesson you will:**\n\n- Be able to define literate programming\n- Recognize differences between available tools to for literate programming\n- Know how to efficiently work within RStudio for efficient literate programming\n- Create a R Markdown document\n:::\n\n# Introduction\n\nOne basic idea to make writing reproducible reports easier is what's known as *literate statistical programming* (or sometimes called [literate statistical practice](http://www.r-project.org/conferences/DSC-2001/Proceedings/Rossini.pdf)). This comes from the idea of [literate programming](https://en.wikipedia.org/wiki/Literate_programming) in the area of writing computer programs.\n\nThe idea is to **think of a report or a publication as a stream of text and code**.\n\n- The text is readable by people and the code is readable by computers.\n\n- The analysis is described in a series of text and code chunks.\n\n- Each kind of code chunk will do something like load some data or compute some results.\n\n- Each text chunk will relay something in a human readable language.\n\nThere might also be **presentation code** that formats tables and figures and there's article text that explains what's going on around all this code. This stream of text and code is a literate statistical program or a literate statistical analysis.\n\n### Weaving and Tangling\n\nLiterate programs by themselves are a bit difficult to work with, but they can be processed in two important ways.\n\nLiterate programs can be **weaved** to produce human readable documents like PDFs or HTML web pages, and they can **tangled** to produce machine-readable \"documents\", or in other words, machine readable code.\n\nThe basic idea behind literate programming in order to generate the different kinds of output you might need, **you only need a single source document**---you can weave and tangle to get the rest.\n\nIn order to use a system like this you need a documentational language, that's human readable, and you need a programming language that's machine readable (or can be compiled/interpreted into something that's machine readable).\n\n### Sweave\n\nOne of the original literate programming systems in R that was designed to do this was called Sweave. Sweave enables users to combine R code with a documentation program called LaTeX.\n\n**Sweave files ends a `.Rnw`** and have R code weaved through the document:\n\n``` \n<>=\ndata(airquality)\nplot(airquality$Ozone ~ airquality$Wind)\n@\n```\n\nOnce you have created your `.Rnw` file, Sweave will process the file, executing the R chunks and replacing them with output as appropriate before creating the PDF document.\n\nIt was originally developed by Fritz Leisch, who is a core member of R, and the code base is still maintained by R Core. The Sweave system comes with any installation of R.\n\nThere are many limitations to the original Sweave system.\n\n- One of the limitations is that it is **focused primarily on LaTeX**, which is not a documentation language that many people are familiar with.\n- Therefore, it **can be difficult to learn this type of markup language** if you're not already in a field that uses it regularly.\n- Sweave also **lacks a lot of features that people find useful** like caching, and multiple plots per page and mixing programming languages.\n\nInstead, folks have **moved towards using something called knitr**, which offers everything Sweave does, plus it extends it further.\n\n- With Sweave, additional tools are required for advanced operations, whereas knitr supports more internally. We'll discuss knitr below.\n\n### rmarkdown\n\nAnother choice for literate programming is to build documents based on [Markdown](https://en.wikipedia.org/wiki/Markdown) language. A markdown file is a plain text file that is typically given the extension `.md.`. The [`rmarkdown`](https://CRAN.R-project.org/package=rmarkdown) R package takes a R Markdown file (`.Rmd`) and weaves together R code chunks like this:\n\n```` \n```{r plot1, height=4, width=5, eval=FALSE, echo=TRUE}\ndata(airquality)\nplot(airquality$Ozone ~ airquality$Wind)\n```\n````\n\n::: callout-tip\nThe best resource for learning about R Markdown this by Yihui Xie, J. J. Allaire, and Garrett Grolemund:\n\n- \n\nThe R Markdown Cookbook by Yihui Xie, Christophe Dervieux, and Emily Riederer is really good too:\n\n- \n\nThe authors of the 2nd book describe the motivation for the 2nd book as:\n\n> \"However, we have received comments from our readers and publisher that it would be beneficial to provide more practical and relatively short examples to show the interesting and useful usage of R Markdown, because it can be daunting to find out how to achieve a certain task from the aforementioned reference book (put another way, that book is too dry to read). As a result, this cookbook was born.\"\n:::\n\nBecause this is lecture is built in a `.qmd` file (which is very similar to a `.Rmd` file), let's demonstrate how this work. I am going to change `eval=FALSE` to `eval=TRUE`.\n\n\n::: {.cell height='4' width='5'}\n\n```{.r .cell-code}\ndata(airquality)\nplot(airquality$Ozone ~ airquality$Wind)\n```\n\n::: {.cell-output-display}\n![](index_files/figure-html/plot2-1.png){width=672}\n:::\n:::\n\n\n::: callout-tip\n### Questions\n\n1. Why do we not see the back ticks \\`\\`\\` anymore in the code chunk above that made the plot?\n2. What do you think we should do if we want to have the code executed, but we want to hide the code that made it?\n:::\n\nBefore we leave this section, I find that there is quite a bit of terminology to understand the magic behind `rmarkdown` that can be confusing, so let's break it down:\n\n- [Pandoc](https://pandoc.org). Pandoc is a command line tool with no GUI that converts documents (e.g. from number of different markup formats to many other formats, such as .doc, .pdf etc). It is completely independent from R (but does come bundled with RStudio).\n- [Markdown](https://en.wikipedia.org/wiki/Markdown) (**markup language**). Markdown is a lightweight [markup language](https://en.wikipedia.org/wiki/Markup_language) with plain text formatting syntax designed so that it can be converted to HTML and many other formats. A markdown file is a plain text file that is typically given the extension `.md.` It is completely independent from R.\n- [`markdown`](https://CRAN.R-project.org/package=markdown) (**R package**). `markdown` is an R package which converts `.md` files into HTML. It is no longer recommended for use has been surpassed by [`rmarkdown`](https://CRAN.R-project.org/package=rmarkdown) (discussed below).\n- R Markdown (**markup language**). R Markdown is an extension of the markdown syntax. R Markdown files are plain text files that typically have the file extension `.Rmd`.\n- [`rmarkdown`](https://CRAN.R-project.org/package=rmarkdown) (**R package**). The R package `rmarkdown` is a library that uses pandoc to process and convert `.Rmd` files into a number of different formats. This core function is `rmarkdown::render()`. **Note**: this package only deals with the markdown language. If the input file is e.g. `.Rhtml` or `.Rnw`, then you need to use `knitr` prior to calling pandoc (see below).\n\n::: callout-tip\nCheck out the R Markdown Quick Tour for more:\n\n- \n:::\n\n![Artwork by Allison Horst on RMarkdown](https://github.com/allisonhorst/stats-illustrations/raw/main/rstats-artwork/rmarkdown_rockstar.png){width=\"80%\"}\n\n### knitr\n\nOne of the alternative that has come up in recent times is something called `knitr`.\n\n- The `knitr` package for R takes a lot of these ideas of literate programming and updates and improves upon them.\n- `knitr` still uses R as its programming language, but it allows you to mix other programming languages in.\n- You can also use a variety of documentation languages now, such as LaTeX, markdown and HTML.\n- `knitr` was developed by Yihui Xie while he was a graduate student at Iowa State and it has become a very popular package for writing literate statistical programs.\n\nKnitr takes a plain text document with embedded code, executes the code and 'knits' the results back into the document.\n\nFor for example, it converts\n\n- An R Markdown (`.Rmd)` file into a standard markdown file (`.md`)\n- An `.Rnw` (Sweave) file into to `.tex` format.\n- An `.Rhtml` file into to `.html`.\n\nThe core function is `knitr::knit()` and by default this will look at the input document and try and guess what type it is e.g. `Rnw`, `Rmd` etc.\n\nThis core function performs three roles:\n\n- A **source parser**, which looks at the input document and detects which parts are code that the user wants to be evaluated.\n- A **code evaluator**, which evaluates this code\n- An **output renderer**, which writes the results of evaluation back to the document in a format which is interpretable by the raw output type. For instance, if the input file is an `.Rmd`, the output render marks up the output of code evaluation in `.md` format.\n\n\n::: {.cell layout-align=\"center\" preview='true'}\n::: {.cell-output-display}\n![Converting a Rmd file to many outputs using knitr and pandoc](https://d33wubrfki0l68.cloudfront.net/61d189fd9cdf955058415d3e1b28dd60e1bd7c9b/9791d/images/rmarkdownflow.png){fig-align='center' width=60%}\n:::\n:::\n\n\n\\[[Source](https://rmarkdown.rstudio.com/authoring_quick_tour.html)\\]\n\nAs seen in the figure above, from there pandoc is used to convert e.g. a `.md` file into many other types of file formats into a `.html`, etc.\n\nSo in summary:\n\n> \"R Markdown stands on the shoulders of knitr and Pandoc. The former executes the computer code embedded in Markdown, and converts R Markdown to Markdown. The latter renders Markdown to the output format you want (such as PDF, HTML, Word, and so on).\"\n\n\\[[Source](https://bookdown.org/yihui/rmarkdown/)\\]\n\n# Create and Knit Your First R Markdown Document\n\n\n\nWhen creating your first R Markdown document, in RStudio you can\n\n1. Go to File \\> New File \\> R Markdown...\n\n2. Feel free to edit the Title\n\n3. Make sure to select \"Default Output Format\" to be HTML\n\n4. Click \"OK\". RStudio creates the R Markdown document and places some boilerplate text in there just so you can see how things are setup.\n\n5. Click the \"Knit\" button (or go to File \\> Knit Document) to make sure you can create the HTML output\n\nIf you successfully knit your first R Markdown document, then congratulations!\n\n\n::: {.cell}\n::: {.cell-output-display}\n![Mission accomplished!](https://media.giphy.com/media/L4ZZNbDpOCfiX8uYSd/giphy.gif){width=60%}\n:::\n:::\n\n\n# Websites and Books in R Markdown\n\nNow that you are on the road to using R Markdown documents, it is important to know about other wonderful things you do with these documents. For example, let's say you have multiple `.Rmd` documents that you want to put together into a website, blog, book, etc.\n\nThere are primarily two ways to build multiple `.Rmd` documents together:\n\n1. [**blogdown**](https://bookdown.org/yihui/blogdown/) for building websites\n2. [**bookdown**](https://bookdown.org/yihui/bookdown/) for authoring books\n\nIn this section, we briefly introduce both packages, but it's worth mentioning that the [**rmarkdown** package also has a built-in site generator](https://bookdown.org/yihui/rmarkdown/rmarkdown-site.html) to build websites.\n\n### blogdown\n\n\n::: {.cell}\n::: {.cell-output-display}\n![blogdown logo](https://bookdown.org/yihui/blogdown/images/logo.png){width=30%}\n:::\n:::\n\n\n\\[[Source](https://bookdown.org/yihui/bookdown/images/logo.png)\\]\n\nThe `blogdown` R package is built on top of R Markdown, supports multi-page HTML output to write a blog post or a general page in an Rmd document, or a plain Markdown document.\n\n- These source documents (e.g. `.Rmd` or `.md`) are built into a static website (i.e. a bunch of static HTML files, images and CSS files).\n- Using this folder of files, it is very easy to publish it to any web server as a website.\n- Also, it is easy to maintain because it is only a single folder.\n\n::: callout-tip\nFor example, my personal website was built in blogdown:\n\n- \n\nOther really great examples can be found here:\n\n- \n:::\n\nOther advantages include the content likely being reproducible, easier to maintain, and easy to convert pages to e.g. PDF or other formats in the future if you do not want to convert to HTML files.\n\nBecause it is based on the Markdown syntax, it is easy to write technical documents, including math equations, insert figures or tables with captions, cross-reference with figure or table numbers, add citations, and present theorems or proofs.\n\nHere's a video you can watch of someone making a blogdown website.\n\n

\n\n\n\n

\n\n\\[[Source](https://www.youtube.com/watch?v=AADnslLpzJ4) on YouTube\\]\n\n### bookdown\n\n\n::: {.cell}\n::: {.cell-output-display}\n![book logo](https://bookdown.org/yihui/bookdown/images/logo.png){width=30%}\n:::\n:::\n\n\n\\[[Source](https://bookdown.org/yihui/bookdown/images/logo.png)\\]\n\nSimilar to `blogdown`, the `bookdown` R package is built on top of R Markdown, but also offers features like multi-page HTML output, numbering and cross-referencing figures/tables/sections/equations, inserting parts/appendices, and imported the GitBook style () to create elegant and appealing HTML book pages. Share\n\n::: callout-tip\nFor example, the previous version of this course was built in bookdown:\n\n- \n\nAnother example is the [Tidyverse Skills for Data Science](https://jhudatascience.org/tidyversecourse/) book that the JHU Data Science Lab wrote. The github repo that contains all the `.Rmd` files can be found [here](https://github.com/jhudsl/tidyversecourse).\n\n- \n- \n:::\n\n**Note**: Even though the word \"book\" is in \"bookdown\", this package is not only for books. It really can be anything that consists of multiple `.Rmd` documents meant to be read in a linear sequence such as course dissertation/thesis, handouts, study notes, a software manual, a thesis, or even a diary.\n\n- https://bookdown.org/yihui/rmarkdown/basics-examples.html#examples-books\n\n### distill\n\nThere is another great way to build blogs or websites using the [distill for R Markdown](https://rstudio.github.io/distill/).\n\n- \n\nDistill for R Markdown combines the technical authoring features of the [Distill web framework](https://github.com/distillpub/template) (optimized for scientific and technical communication) with [R Markdown](https://rmarkdown.rstudio.com), enabling a fully reproducible workflow based on literate programming [@knuth1984].\n\nDistill articles include:\n\n- Reader-friendly typography that adapts well to mobile devices.\n- Features essential to technical writing like LaTeX math, citations, and footnotes.\n- Flexible figure layout options (e.g. displaying figures at a larger width than the article text).\n- Attractively rendered tables with optional support for pagination.\n- Support for a wide variety of diagramming tools for illustrating concepts. The ability to incorporate JavaScript and D3-based interactive visualizations.\n- A variety of ways to publish articles, including support for publishing sets of articles as a Distill website or as a Distill blog.\n\nThe course website from last year was built in Distill for R Markdown:\n\n- Website: \n- Github: \n\nSome other cool things about distill is the use of footnotes and asides.\n\nFor example [^1]. The number of the footnote will be automatically generated.\n\n[^1]: This will become a hover-able footnote\n\nYou can also optionally include notes in the gutter of the article (immediately to the right of the article text). To do this use the aside tag.\n\n\n\nYou can also include figures in the gutter. Just enclose the code chunk which generates the figure in an aside tag\n\n# Tips and tricks in R Markdown in RStudio\n\nHere are shortcuts and tips on efficiently using RStudio to improve how you write code.\n\n### Run code\n\nIf you want to run a code chunk:\n\n``` \ncommand + Enter on Mac\nCtrl + Enter on Windows\n```\n\n### Insert a comment in R and R Markdown\n\nTo insert a comment:\n\n``` \ncommand + Shift + C on Mac\nCtrl + Shift + C on Windows\n```\n\nThis shortcut can be used both for:\n\n- R code when you want to comment your code. It will add a `#` at the beginning of the line\n- for text in R Markdown. It will add `` around the text\n\nNote that if you want to comment more than one line, select all the lines you want to comment then use the shortcut. If you want to uncomment a comment, apply the same shortcut.\n\n### Knit a R Markdown document\n\nYou can knit R Markdown documents by using this shortcut:\n\n``` \ncommand + Shift + K on Mac\nCtrl + Shift + K on Windows\n```\n\n### Code snippets\n\nCode snippets is usually a few characters long and is used as a shortcut to insert a common piece of code. You simply type a few characters then press `Tab` and it will complete your code with a larger code. `Tab` is then used again to navigate through the code where customization is required. For instance, if you type `fun` then press `Tab`, it will auto-complete the code with the required code to create a function:\n\n``` \nname <- function(variables) {\n \n}\n```\n\nPressing `Tab` again will jump through the placeholders for you to edit it. So you can first edit the name of the function, then the variables and finally the code inside the function (try by yourself!).\n\nThere are many code snippets by default in RStudio. Here are the code snippets I use most often:\n\n- `lib` to call `library()`\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(package)\n```\n:::\n\n\n- `mat` to create a matrix\n\n\n::: {.cell}\n\n```{.r .cell-code}\nmatrix(data, nrow = rows, ncol = cols)\n```\n:::\n\n\n- `if`, `el`, and `ei` to create conditional expressions such as `if() {}`, `else {}` and `else if () {}`\n\n\n::: {.cell}\n\n```{.r .cell-code}\nif (condition) {\n ## Case 1\n} else if (condition) {\n ## Case 2\n} else if (condition) {\n ## Case 3\n}\n```\n:::\n\n\n- `fun` to create a function\n\n\n::: {.cell}\n\n```{.r .cell-code}\nname <- function(variables) {\n\n}\n```\n:::\n\n\n- `for` to create for loops\n\n\n::: {.cell}\n\n```{.r .cell-code}\nfor (variable in vector) {\n\n}\n```\n:::\n\n\n- `ts` to insert a comment with the current date and time (useful if you have very long code and share it with others so they see when it has been edited)\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# Tue Jan 21 20:20:14 2020 ------------------------------\n```\n:::\n\n\nYou can see all default code snippets and add yours by clicking on Tools \\> Global Options... \\> Code (left sidebar) \\> Edit Snippets...\n\n### Ordered list in R Markdown\n\nIn R Markdown, when creating an ordered list such as this one:\n\n1. Item 1\n2. Item 2\n3. Item 3\n\nInstead of bothering with the numbers and typing\n\n``` \n1. Item 1\n2. Item 2\n3. Item 3\n```\n\nyou can simply type\n\n``` \n1. Item 1\n1. Item 2\n1. Item 3\n```\n\nfor the exact same result (try it yourself or check the code of this article!). This way you do not need to bother which number is next when creating a new item.\n\nTo go even further, any numeric will actually render the same result as long as the first item is the number you want to start from. For example, you could type:\n\n``` \n1. Item 1\n7. Item 2\n3. Item 3\n```\n\nwhich renders\n\n1. Item 1\n2. Item 2\n3. Item 3\n\nHowever, I suggest always using the number you want to start from for all items because if you move one item at the top, the list will start with this new number. For instance, if we move `7. Item 2` from the previous list at the top, the list becomes:\n\n``` \n7. Item 2\n1. Item 1\n3. Item 3\n```\n\nwhich incorrectly renders\n\n7. Item 2\n8. Item 1\n9. Item 3\n\n### New code chunk in R Markdown\n\nWhen editing R Markdown documents, you will need to insert a new R code chunk many times. The following shortcuts will make your life easier:\n\n``` \ncommand + option + I on Mac (or command + alt + I depending on your keyboard)\nCtrl + ALT + I on Windows\n```\n\n### Reformat code\n\nA clear and readable code is always easier and faster to read (and look more professional when sharing it to collaborators). To automatically apply the most common coding guidelines such as white spaces, indents, etc., use:\n\n``` \ncmd + Shift + A on Mac\nCtrl + Shift + A on Windows\n```\n\nSo for example the following code which does not respect the guidelines (and which is not easy to read):\n\n``` \n1+1\n for(i in 1:10){if(!i%%2){next}\nprint(i)\n }\n```\n\nbecomes much more neat and readable:\n\n``` \n1 + 1\nfor (i in 1:10) {\n if (!i %% 2) {\n next\n }\n print(i)\n}\n```\n\n### RStudio addins\n\nRStudio addins are extensions which provide a simple mechanism for executing advanced R functions from within RStudio. In simpler words, when executing an addin (by clicking a button in the Addins menu), the corresponding code is executed without you having to write the code. RStudio addins have the advantage that they allow you to execute complex and advanced code much more easily than if you would have to write it yourself.\n\n::: callout-tip\n**For more information about RStudio addins, check out**:\n\n- \n- \n:::\n\n### Others\n\nSimilar to many other programs, you can also use:\n\n- `command + Shift + N` on Mac and `Ctrl + Shift + N` on Windows to open a new R Script\n- `command + S` on Mac and `Ctrl + S` on Windows to save your current script or R Markdown document\n\nCheck out Tools --\\> Keyboard Shortcuts Help to see a long list of these shortcuts.\n\n# Post-lecture materials\n\n### Final Questions\n\nHere are some post-lecture questions to help you think about the material discussed.\n\n::: questions\n### Questions\n\n1. What is literate programming?\n\n2. What was the first literate statistical programming tool to weave together a statistical language (R) with a markup language (LaTeX)?\n\n3. What is `knitr` and how is different than other literate statistical programming tools?\n\n4. Where can you find a list of other commands that help make your code writing more efficient in RStudio?\n:::\n\n### Additional Resources\n\n::: callout-tip\n- [RMarkdown Tips and Tricks](https://indrajeetpatil.github.io/RmarkdownTips/) by Indrajeet Patil\n- \n- \n:::\n\n# R session information\n\n\n::: {.cell}\n\n```{.r .cell-code}\noptions(width = 120)\nsessioninfo::session_info()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────\n setting value\n version R version 4.3.1 (2023-06-16)\n os macOS Ventura 13.5\n system aarch64, darwin20\n ui X11\n language (EN)\n collate en_US.UTF-8\n ctype en_US.UTF-8\n tz America/New_York\n date 2023-08-17\n pandoc 3.1.5 @ /opt/homebrew/bin/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────\n package * version date (UTC) lib source\n cli 3.6.1 2023-03-23 [1] CRAN (R 4.3.0)\n colorout 1.2-2 2023-05-06 [1] Github (jalvesaq/colorout@79931fd)\n digest 0.6.33 2023-07-07 [1] CRAN (R 4.3.0)\n evaluate 0.21 2023-05-05 [1] CRAN (R 4.3.0)\n fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.3.0)\n htmltools 0.5.6 2023-08-10 [1] CRAN (R 4.3.0)\n htmlwidgets 1.6.2 2023-03-17 [1] CRAN (R 4.3.0)\n jsonlite 1.8.7 2023-06-29 [1] CRAN (R 4.3.0)\n knitr 1.43 2023-05-25 [1] CRAN (R 4.3.0)\n rlang 1.1.1 2023-04-28 [1] CRAN (R 4.3.0)\n rmarkdown 2.24 2023-08-14 [1] CRAN (R 4.3.1)\n rstudioapi 0.15.0 2023-07-07 [1] CRAN (R 4.3.0)\n sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.3.0)\n xfun 0.40 2023-08-09 [1] CRAN (R 4.3.0)\n yaml 2.3.7 2023-01-23 [1] CRAN (R 4.3.0)\n\n [1] /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library\n\n──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n```\n:::\n:::\n", "supporting": [ "index_files" ], diff --git a/_freeze/posts/06-reference-management/index/execute-results/html.json b/_freeze/posts/06-reference-management/index/execute-results/html.json index 60fbf6e..bf3f70d 100644 --- a/_freeze/posts/06-reference-management/index/execute-results/html.json +++ b/_freeze/posts/06-reference-management/index/execute-results/html.json @@ -1,7 +1,7 @@ { - "hash": "16b0cad09428b521aecb026163f42472", + "hash": "7d57048944742a579c008b905e80a842", "result": { - "markdown": "---\ntitle: \"06 - Reference management\"\nauthor:\n - name: Leonardo Collado Torres\n url: http://lcolladotor.github.io/\n affiliations:\n - id: libd\n name: Lieber Institute for Brain Development\n url: https://libd.org/\n - id: jhsph\n name: Johns Hopkins Bloomberg School of Public Health Department of Biostatistics\n url: https://publichealth.jhu.edu/departments/biostatistics\ndescription: \"How to use citations and incorporate references from a bibliography in R Markdown.\"\nimage: https://www.bibtex.com/img/bibtex-format-700x402.png\ncategories: [module 1, week 1, R Markdown, programming]\nbibliography: my-refs.bib\n---\n\n\n*This lecture, as the rest of the course, is adapted from the version [Stephanie C. Hicks](https://www.stephaniehicks.com/) designed and maintained in 2021 and 2022. Check the recent changes to this file through the [GitHub history](https://github.com/lcolladotor/jhustatcomputing2023/commits/main/posts/06-reference-management/index.qmd).*\n\n\n\n# Pre-lecture materials\n\n### Read ahead\n\n::: callout-note\n## Read ahead\n\n**Before class, you can prepare by reading the following materials:**\n\n1. Authoring in [R Markdown from RStudio](https://rmarkdown.rstudio.com/authoring_bibliographies_and_citations.html)\n2. Citations from [Reproducible Research in R](https://monashdatafluency.github.io/r-rep-res/citations.html) from the [Monash Data Fluency](https://monashdatafluency.github.io) initiative\n3. Bibliography from [R Markdown Cookbook](https://bookdown.org/yihui/rmarkdown-cookbook/bibliography.html)\n:::\n\n### Acknowledgements\n\nMaterial for this lecture was borrowed and adopted from\n\n- \n- \n- \n- \n\n# Learning objectives\n\n::: callout-note\n# Learning objectives\n\n**At the end of this lesson you will:**\n\n- Know what types of bibliography file formats can be used in a R Markdown file\n- Learn how to add citations to a R Markdown file\n- Know how to change the citation style (e.g. APA, Chicago, etc)\n:::\n\n# Introduction\n\nFor almost any data analysis, especially if it is meant for publication in the academic literature, you will have to cite other people's work and include the references (bibliographies or citations) in your work. In this class, you are likely to need to include references and cite other people's work like in a regular research paper.\n\nR provides nice function `citation()` that helps us generating citation blob for R packages that we have used. Let's try generating citation text for rmarkdown package by using the following command\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncitation(\"rmarkdown\")\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nTo cite package 'rmarkdown' in publications use:\n\n Allaire J, Xie Y, Dervieux C, McPherson J, Luraschi J, Ushey K,\n Atkins A, Wickham H, Cheng J, Chang W, Iannone R (2023). _rmarkdown:\n Dynamic Documents for R_. R package version 2.24,\n .\n\n Xie Y, Allaire J, Grolemund G (2018). _R Markdown: The Definitive\n Guide_. Chapman and Hall/CRC, Boca Raton, Florida. ISBN\n 9781138359338, .\n\n Xie Y, Dervieux C, Riederer E (2020). _R Markdown Cookbook_. Chapman\n and Hall/CRC, Boca Raton, Florida. ISBN 9780367563837,\n .\n\nTo see these entries in BibTeX format, use 'print(,\nbibtex=TRUE)', 'toBibtex(.)', or set\n'options(citation.bibtex.max=999)'.\n```\n:::\n:::\n\n\nI assume you are familiar with how citing references works, and hopefully, you are already using a reference manager. If not, let me know in the discussion boards.\n\nTo have something that plays well with R Markdown, you need file format that stores all the references. Click here to learn more other possible file formats available to you to use within a R Markdown file:\n\n- \n\n### Citation management software\n\nAs you can see, there are ton of file formats including `.medline` (MEDLINE), `.bib` (BibTeX), `.ris` (RIS), `.enl` (EndNote).\n\nI will not discuss underlying citational management software itself, but I will talk briefly how you might create one of these file formats.\n\nIf you recall the output from `citation(\"rmarkdown\")` above, we might consider manually copying and pasting the output into a citation management software, but instead we can use `write_bib()` function from `knitr` package to create a bibliography file ending in `.bib`.\n\nLet's run the following code in order to generate a `my-refs.bib` file\n\n\n::: {.cell}\n\n```{.r .cell-code}\nknitr::write_bib(\"rmarkdown\", file = \"my-refs.bib\")\n```\n:::\n\n\nNow we can see we have the file saved locally.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlist.files()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"index.qmd\" \"index.rmarkdown\" \"my-refs.bib\" \n```\n:::\n:::\n\n\nIf you open up the `my-refs.bib` file, you will see\n\n``` \n@Manual{R-rmarkdown,\n title = {rmarkdown: Dynamic Documents for R},\n author = {JJ Allaire and Yihui Xie and Jonathan McPherson and Javier Luraschi and Kevin Ushey and Aron Atkins and Hadley Wickham and Joe Cheng and Winston Chang and Richard Iannone},\n year = {2021},\n note = {R package version 2.8},\n url = {https://CRAN.R-project.org/package=rmarkdown},\n}\n\n@Book{rmarkdown2018,\n title = {R Markdown: The Definitive Guide},\n author = {Yihui Xie and J.J. Allaire and Garrett Grolemund},\n publisher = {Chapman and Hall/CRC},\n address = {Boca Raton, Florida},\n year = {2018},\n note = {ISBN 9781138359338},\n url = {https://bookdown.org/yihui/rmarkdown},\n}\n\n@Book{rmarkdown2020,\n title = {R Markdown Cookbook},\n author = {Yihui Xie and Christophe Dervieux and Emily Riederer},\n publisher = {Chapman and Hall/CRC},\n address = {Boca Raton, Florida},\n year = {2020},\n note = {ISBN 9780367563837},\n url = {https://bookdown.org/yihui/rmarkdown-cookbook},\n}\n```\n\n::: resources\n**Note there are three keys that we will use later on**:\n\n- `R-rmarkdown`\n- `rmarkdown2018`\n- `rmarkdown2020`\n:::\n\n### Linking `.bib` file with `.rmd` (and `.qmd`) files\n\nIn order to use references within a R Markdown file, you will need to specify the name and a location of a bibliography file using the bibliography metadata field in a YAML metadata section. For example:\n\n``` yaml\n---\ntitle: \"My top ten favorite R packages\"\noutput: html_document\nbibliography: my-refs.bib\n---\n```\n\nYou can include multiple reference files using the following syntax, alternatively you can concatenate two bib files into one.\n\n``` yaml\n---\nbibliography: [\"my-refs1.bib\", \"my-refs2.bib\"]\n---\n```\n\n### Inline citation\n\nNow we can start using those bib keys that we have learned just before, using the following syntax\n\n- `[@key]` for single citation\n- `[@key1; @key2]` multiple citation can be separated by semi-colon\n- `[-@key]` in order to suppress author name, and just display the year\n- `[see @key1 p 12; also this ref @key2]` is also a valid syntax\n\nLet's start by citing the `rmarkdown` package using the following code and press `Knit` button:\n\n------------------------------------------------------------------------\n\nI have been using the amazing Rmarkdown package [@R-rmarkdown]! I should also go and read [@rmarkdown2018; and @rmarkdown2020] books.\n\n------------------------------------------------------------------------\n\nPretty cool, eh??\n\n### Citation styles\n\nBy default, Pandoc will use a Chicago author-date format for citations and references.\n\nTo use another style, you will need to specify a CSL (Citation Style Language) file in the `csl` metadata field, e.g.,\n\n``` yaml\n---\ntitle: \"My top ten favorite R packages\"\noutput: html_document\nbibliography: my-refs.bib\ncsl: biomed-central.csl\n---\n```\n\n::: resources\nTo find your required formats, we recommend using the [Zotero Style Repository](https://www.zotero.org/styles), which makes it easy to search for and download your desired style.\n:::\n\nCSL files can be tweaked to meet custom formatting requirements. For example, we can change the number of authors required before \"et al.\" is used to abbreviate them. This can be simplified through the use of visual editors such as the one available at https://editor.citationstyles.org.\n\n### Other cool features\n\n#### Add an item to a bibliography without using it\n\nBy default, the bibliography will only display items that are directly referenced in the document. If you want to include items in the bibliography without actually citing them in the body text, you can define a dummy nocite metadata field and put the citations there.\n\n``` yaml\n---\nnocite: |\n @item1, @item2\n---\n```\n\n#### Add all items to the bibliography\n\nIf we do not wish to explicitly state all of the items within the bibliography but would still like to show them in our references, we can use the following syntax:\n\n``` yaml\n---\nnocite: '@*'\n---\n```\n\nThis will force all items to be displayed in the bibliography.\n\n::: resources\nYou can also have an appendix appear after bibliography. For more on this, see:\n\n- \n:::\n\n# Other useful tips\n\nWe have learned that inside your file that contains all your references (e.g. `my-refs.bib`), typically each reference gets a key, which is a shorthand that is generated by the reference manager or you can create yourself.\n\nFor instance, I use a format of lower-case first author last name followed by 4 digit year for each reference followed by a keyword (e.g name of a software package). Alternatively, you can omit the keyword. But note that if I cite a paper by the same first author that was published in the same year, then a lower case letter is added to the end. For instance, for a paper that I wrote as 1st author in 2010, my bibtex key might be `hicks2022` or `hicks2022a`. You can decide what scheme to use, just pick one and use it *forever*.\n\nIn your R Markdown document, you can then cite the reference by adding the key, such as `...in the paper by Hicks et al. [@hicks2022]...`.\n\n# Post-lecture materials\n\n### Practice\n\nHere are some post-lecture tasks to practice some of the material discussed.\n\n::: callout-note\n### Questions\n\n**Try out the following:**\n\n1. What do you notice that's different when you run `citation(\"tidyverse\")` (compared to `citation(\"rmarkdown\")`)?\n\n2. Install the following packages:\n\n\n::: {.cell}\n\n```{.r .cell-code}\ninstall.packages(c(\"bibtex\", \"RefManageR\")\n```\n:::\n\n\nWhat do they do? How might they be helpful to you in terms of reference management?\n\n3. Instead of using a `.bib` file, try using a different bibliography file format in an R Markdown document.\n\n4. Practice using a different CSL file to change the citation style.\n:::\n\n### Additional Resources\n\n::: callout-tip\n- Add here.\n:::\n\n## rtistry\n\n\n::: {.cell .fig-cap-location-top}\n\n:::\n\n\n\\[Add here.\\]\n\n# R session information\n\n\n::: {.cell}\n\n```{.r .cell-code}\noptions(width = 120)\nsessioninfo::session_info()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────\n setting value\n version R version 4.3.1 (2023-06-16)\n os macOS Ventura 13.5\n system aarch64, darwin20\n ui X11\n language (EN)\n collate en_US.UTF-8\n ctype en_US.UTF-8\n tz America/New_York\n date 2023-08-17\n pandoc 3.1.5 @ /opt/homebrew/bin/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────\n package * version date (UTC) lib source\n cli 3.6.1 2023-03-23 [1] CRAN (R 4.3.0)\n colorout 1.2-2 2023-05-06 [1] Github (jalvesaq/colorout@79931fd)\n digest 0.6.33 2023-07-07 [1] CRAN (R 4.3.0)\n evaluate 0.21 2023-05-05 [1] CRAN (R 4.3.0)\n fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.3.0)\n htmltools 0.5.6 2023-08-10 [1] CRAN (R 4.3.0)\n htmlwidgets 1.6.2 2023-03-17 [1] CRAN (R 4.3.0)\n jsonlite 1.8.7 2023-06-29 [1] CRAN (R 4.3.0)\n knitr 1.43 2023-05-25 [1] CRAN (R 4.3.0)\n rlang 1.1.1 2023-04-28 [1] CRAN (R 4.3.0)\n rmarkdown 2.24 2023-08-14 [1] CRAN (R 4.3.1)\n rstudioapi 0.15.0 2023-07-07 [1] CRAN (R 4.3.0)\n sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.3.0)\n xfun 0.40 2023-08-09 [1] CRAN (R 4.3.0)\n yaml 2.3.7 2023-01-23 [1] CRAN (R 4.3.0)\n\n [1] /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library\n\n──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n```\n:::\n:::\n", + "markdown": "---\ntitle: \"06 - Reference management\"\nauthor:\n - name: Leonardo Collado Torres\n url: http://lcolladotor.github.io/\n affiliations:\n - id: libd\n name: Lieber Institute for Brain Development\n url: https://libd.org/\n - id: jhsph\n name: Johns Hopkins Bloomberg School of Public Health Department of Biostatistics\n url: https://publichealth.jhu.edu/departments/biostatistics\ndescription: \"How to use citations and incorporate references from a bibliography in R Markdown.\"\nimage: https://www.bibtex.com/img/bibtex-format-700x402.png\ncategories: [module 1, week 1, R Markdown, programming]\nbibliography: my-refs.bib\n---\n\n\n*This lecture, as the rest of the course, is adapted from the version [Stephanie C. Hicks](https://www.stephaniehicks.com/) designed and maintained in 2021 and 2022. Check the recent changes to this file through the [GitHub history](https://github.com/lcolladotor/jhustatcomputing2023/commits/main/posts/06-reference-management/index.qmd).*\n\n\n\n# Pre-lecture materials\n\n### Read ahead\n\n::: callout-note\n## Read ahead\n\n**Before class, you can prepare by reading the following materials:**\n\n1. Authoring in [R Markdown from RStudio](https://rmarkdown.rstudio.com/authoring_bibliographies_and_citations.html)\n2. Citations from [Reproducible Research in R](https://monashdatafluency.github.io/r-rep-res/citations.html) from the [Monash Data Fluency](https://monashdatafluency.github.io) initiative\n3. Bibliography from [R Markdown Cookbook](https://bookdown.org/yihui/rmarkdown-cookbook/bibliography.html)\n:::\n\n### Acknowledgements\n\nMaterial for this lecture was borrowed and adopted from\n\n- \n- \n- \n- \n\n# Learning objectives\n\n::: callout-note\n# Learning objectives\n\n**At the end of this lesson you will:**\n\n- Know what types of bibliography file formats can be used in a R Markdown file\n- Learn how to add citations to a R Markdown file\n- Know how to change the citation style (e.g. APA, Chicago, etc)\n:::\n\n# Introduction\n\nFor almost any data analysis, especially if it is meant for publication in the academic literature, you will have to cite other people's work and include the references (bibliographies or citations) in your work. In this class, you are likely to need to include references and cite other people's work like in a regular research paper.\n\nR provides nice function `citation()` that helps us generating citation blob for R packages that we have used. Let's try generating citation text for rmarkdown package by using the following command\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncitation(\"rmarkdown\")\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nTo cite package 'rmarkdown' in publications use:\n\n Allaire J, Xie Y, Dervieux C, McPherson J, Luraschi J, Ushey K,\n Atkins A, Wickham H, Cheng J, Chang W, Iannone R (2023). _rmarkdown:\n Dynamic Documents for R_. R package version 2.24,\n .\n\n Xie Y, Allaire J, Grolemund G (2018). _R Markdown: The Definitive\n Guide_. Chapman and Hall/CRC, Boca Raton, Florida. ISBN\n 9781138359338, .\n\n Xie Y, Dervieux C, Riederer E (2020). _R Markdown Cookbook_. Chapman\n and Hall/CRC, Boca Raton, Florida. ISBN 9780367563837,\n .\n\nTo see these entries in BibTeX format, use 'print(,\nbibtex=TRUE)', 'toBibtex(.)', or set\n'options(citation.bibtex.max=999)'.\n```\n:::\n:::\n\n\nI assume you are familiar with how citing references works, and hopefully, you are already using a reference manager. If not, let me know in the discussion boards.\n\nTo have something that plays well with R Markdown, you need file format that stores all the references. Click here to learn more other possible file formats available to you to use within a R Markdown file:\n\n- \n\n### Citation management software\n\nAs you can see, there are ton of file formats including `.medline` (MEDLINE), `.bib` (BibTeX), `.ris` (RIS), `.enl` (EndNote).\n\nI will not discuss underlying citational management software itself, but I will talk briefly how you might create one of these file formats.\n\nIf you recall the output from `citation(\"rmarkdown\")` above, we might consider manually copying and pasting the output into a citation management software, but instead we can use `write_bib()` function from `knitr` package to create a bibliography file ending in `.bib`.\n\nLet's run the following code in order to generate a `my-refs.bib` file\n\n\n::: {.cell}\n\n```{.r .cell-code}\nknitr::write_bib(\"rmarkdown\", file = \"my-refs.bib\")\n```\n:::\n\n\nNow we can see we have the file saved locally.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlist.files()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"index.qmd\" \"index.rmarkdown\" \"my-refs.bib\" \n```\n:::\n:::\n\n\nIf you open up the `my-refs.bib` file, you will see\n\n``` \n@Manual{R-rmarkdown,\n title = {rmarkdown: Dynamic Documents for R},\n author = {JJ Allaire and Yihui Xie and Jonathan McPherson and Javier Luraschi and Kevin Ushey and Aron Atkins and Hadley Wickham and Joe Cheng and Winston Chang and Richard Iannone},\n year = {2021},\n note = {R package version 2.8},\n url = {https://CRAN.R-project.org/package=rmarkdown},\n}\n\n@Book{rmarkdown2018,\n title = {R Markdown: The Definitive Guide},\n author = {Yihui Xie and J.J. Allaire and Garrett Grolemund},\n publisher = {Chapman and Hall/CRC},\n address = {Boca Raton, Florida},\n year = {2018},\n note = {ISBN 9781138359338},\n url = {https://bookdown.org/yihui/rmarkdown},\n}\n\n@Book{rmarkdown2020,\n title = {R Markdown Cookbook},\n author = {Yihui Xie and Christophe Dervieux and Emily Riederer},\n publisher = {Chapman and Hall/CRC},\n address = {Boca Raton, Florida},\n year = {2020},\n note = {ISBN 9780367563837},\n url = {https://bookdown.org/yihui/rmarkdown-cookbook},\n}\n```\n\n::: resources\n**Note there are three keys that we will use later on**:\n\n- `R-rmarkdown`\n- `rmarkdown2018`\n- `rmarkdown2020`\n:::\n\n### Linking `.bib` file with `.rmd` (and `.qmd`) files\n\nIn order to use references within a R Markdown file, you will need to specify the name and a location of a bibliography file using the bibliography metadata field in a YAML metadata section. For example:\n\n``` yaml\n---\ntitle: \"My top ten favorite R packages\"\noutput: html_document\nbibliography: my-refs.bib\n---\n```\n\nYou can include multiple reference files using the following syntax, alternatively you can concatenate two bib files into one.\n\n``` yaml\n---\nbibliography: [\"my-refs1.bib\", \"my-refs2.bib\"]\n---\n```\n\n### Inline citation\n\nNow we can start using those bib keys that we have learned just before, using the following syntax\n\n- `[@key]` for single citation\n- `[@key1; @key2]` multiple citation can be separated by semi-colon\n- `[-@key]` in order to suppress author name, and just display the year\n- `[see @key1 p 12; also this ref @key2]` is also a valid syntax\n\nLet's start by citing the `rmarkdown` package using the following code and press `Knit` button:\n\n------------------------------------------------------------------------\n\nI have been using the amazing Rmarkdown package [@R-rmarkdown]! I should also go and read [@rmarkdown2018; and @rmarkdown2020] books.\n\n------------------------------------------------------------------------\n\nPretty cool, eh??\n\n### Citation styles\n\nBy default, Pandoc will use a Chicago author-date format for citations and references.\n\nTo use another style, you will need to specify a CSL (Citation Style Language) file in the `csl` metadata field, e.g.,\n\n``` yaml\n---\ntitle: \"My top ten favorite R packages\"\noutput: html_document\nbibliography: my-refs.bib\ncsl: biomed-central.csl\n---\n```\n\n::: resources\nTo find your required formats, we recommend using the [Zotero Style Repository](https://www.zotero.org/styles), which makes it easy to search for and download your desired style.\n:::\n\nCSL files can be tweaked to meet custom formatting requirements. For example, we can change the number of authors required before \"et al.\" is used to abbreviate them. This can be simplified through the use of visual editors such as the one available at https://editor.citationstyles.org.\n\n### Other cool features\n\n#### Add an item to a bibliography without using it\n\nBy default, the bibliography will only display items that are directly referenced in the document. If you want to include items in the bibliography without actually citing them in the body text, you can define a dummy nocite metadata field and put the citations there.\n\n``` yaml\n---\nnocite: |\n @item1, @item2\n---\n```\n\n#### Add all items to the bibliography\n\nIf we do not wish to explicitly state all of the items within the bibliography but would still like to show them in our references, we can use the following syntax:\n\n``` yaml\n---\nnocite: '@*'\n---\n```\n\nThis will force all items to be displayed in the bibliography.\n\n::: resources\nYou can also have an appendix appear after bibliography. For more on this, see:\n\n- \n:::\n\n# Other useful tips\n\nWe have learned that inside your file that contains all your references (e.g. `my-refs.bib`), typically each reference gets a key, which is a shorthand that is generated by the reference manager or you can create yourself.\n\nFor instance, I use a format of lower-case first author last name followed by 4 digit year for each reference followed by a keyword (e.g name of a software package). Alternatively, you can omit the keyword. But note that if I cite a paper by the same first author that was published in the same year, then a lower case letter is added to the end. For instance, for a paper that I wrote as 1st author in 2010, my bibtex key might be `hicks2022` or `hicks2022a`. You can decide what scheme to use, just pick one and use it *forever*.\n\nIn your R Markdown document, you can then cite the reference by adding the key, such as `...in the paper by Hicks et al. [@hicks2022]...`.\n\n# Post-lecture materials\n\n### Practice\n\nHere are some post-lecture tasks to practice some of the material discussed.\n\n::: callout-note\n### Questions\n\n**Try out the following:**\n\n1. What do you notice that's different when you run `citation(\"tidyverse\")` (compared to `citation(\"rmarkdown\")`)?\n\n2. Install the following packages:\n\n\n::: {.cell}\n\n```{.r .cell-code}\ninstall.packages(c(\"bibtex\", \"RefManageR\"))\n```\n:::\n\n\nWhat do they do? How might they be helpful to you in terms of reference management?\n\n3. Instead of using a `.bib` file, try using a different bibliography file format in an R Markdown document.\n\n4. Practice using a different CSL file to change the citation style.\n:::\n\n### Additional Resources\n\n::: callout-tip\n- Add here.\n:::\n\n## rtistry\n\n\n::: {.cell .fig-cap-location-top}\n\n:::\n\n\n\\[Add here.\\]\n\n# R session information\n\n\n::: {.cell}\n\n```{.r .cell-code}\noptions(width = 120)\nsessioninfo::session_info()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────\n setting value\n version R version 4.3.1 (2023-06-16)\n os macOS Ventura 13.5\n system aarch64, darwin20\n ui X11\n language (EN)\n collate en_US.UTF-8\n ctype en_US.UTF-8\n tz America/New_York\n date 2023-08-17\n pandoc 3.1.5 @ /opt/homebrew/bin/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────\n package * version date (UTC) lib source\n cli 3.6.1 2023-03-23 [1] CRAN (R 4.3.0)\n colorout 1.2-2 2023-05-06 [1] Github (jalvesaq/colorout@79931fd)\n digest 0.6.33 2023-07-07 [1] CRAN (R 4.3.0)\n evaluate 0.21 2023-05-05 [1] CRAN (R 4.3.0)\n fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.3.0)\n htmltools 0.5.6 2023-08-10 [1] CRAN (R 4.3.0)\n htmlwidgets 1.6.2 2023-03-17 [1] CRAN (R 4.3.0)\n jsonlite 1.8.7 2023-06-29 [1] CRAN (R 4.3.0)\n knitr 1.43 2023-05-25 [1] CRAN (R 4.3.0)\n rlang 1.1.1 2023-04-28 [1] CRAN (R 4.3.0)\n rmarkdown 2.24 2023-08-14 [1] CRAN (R 4.3.1)\n rstudioapi 0.15.0 2023-07-07 [1] CRAN (R 4.3.0)\n sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.3.0)\n xfun 0.40 2023-08-09 [1] CRAN (R 4.3.0)\n yaml 2.3.7 2023-01-23 [1] CRAN (R 4.3.0)\n\n [1] /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library\n\n──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n```\n:::\n:::\n", "supporting": [], "filters": [ "rmarkdown/pagebreak.lua" diff --git a/_freeze/posts/07-reading-and-writing-data/index/execute-results/html.json b/_freeze/posts/07-reading-and-writing-data/index/execute-results/html.json index 75acc3f..4d72a5a 100644 --- a/_freeze/posts/07-reading-and-writing-data/index/execute-results/html.json +++ b/_freeze/posts/07-reading-and-writing-data/index/execute-results/html.json @@ -1,7 +1,7 @@ { - "hash": "da2ed2dbc83c00a905134a7a4a7fecbb", + "hash": "53f6a7572e4a213383e32cd28c924565", "result": { - "markdown": "---\ntitle: \"07 - Reading and Writing data\"\nauthor:\n - name: Leonardo Collado Torres\n url: http://lcolladotor.github.io/\n affiliations:\n - id: libd\n name: Lieber Institute for Brain Development\n url: https://libd.org/\n - id: jhsph\n name: Johns Hopkins Bloomberg School of Public Health Department of Biostatistics\n url: https://publichealth.jhu.edu/departments/biostatistics\ndescription: \"How to get data in and out of R using relative paths\"\ncategories: [module 2, week 2, R, programming, readr, here, tidyverse]\n---\n\n\n*This lecture, as the rest of the course, is adapted from the version [Stephanie C. Hicks](https://www.stephaniehicks.com/) designed and maintained in 2021 and 2022. Check the recent changes to this file through the [GitHub history](https://github.com/lcolladotor/jhustatcomputing2023/commits/main/posts/07-reading-and-writing-data/index.qmd).*\n\n\n::: {.cell}\n\n:::\n\n\n\n\n> \"When writing code, you're always collaborating with future-you; and past-you doesn't respond to emails\". ---*Hadley Wickham*\n\n\\[[Source](https://fivebooks.com/best-books/computer-science-data-science-hadley-wickham/)\\]\n\n# Pre-lecture materials\n\n### Read ahead\n\n::: callout-note\n## Read ahead\n\n**Before class, you can prepare by reading the following materials:**\n\n1. \n2. \n:::\n\n### Acknowledgements\n\nMaterial for this lecture was borrowed and adopted from\n\n- \n- \n\n# Learning objectives\n\n::: callout-note\n# Learning objectives\n\n**At the end of this lesson you will:**\n\n- Know difference between relative vs absolute paths\n- Be able to read and write text / csv files in R\n- Be able to read and write R data objects in R\n- Be able to calculate memory requirements for R objects\n- Use modern R packages for reading and writing data\n:::\n\n# Introduction\n\nThis lesson introduces **ways to read and write data** (e.g. `.txt` and `.csv` files) using base R functions as well as more modern R packages, such as `readr`, which is typically [10x faster than base R](https://r4ds.had.co.nz/data-import.html#compared-to-base-r).\n\nWe will also briefly describe different ways for reading and writing other data types such as, Excel files, google spreadsheets, or SQL databases.\n\n# Relative versus absolute paths\n\nWhen you are starting a data analysis, you can create a new `.Rproj` file that asks RStudio to change the path (location on your computer) to the `.Rproj` location.\n\nLet's try this out. In RStudio, click `Project: (None)` in the top right corner and `New Project`.\n\nAfter opening up a `.Rproj` file, you can test this by\n\n\n::: {.cell}\n\n```{.r .cell-code}\ngetwd()\n```\n:::\n\n\nWhen you open up someone else's R code or analysis, you might also see the\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsetwd()\n```\n:::\n\n\nfunction being used which explicitly tells R to change the absolute path or absolute location of which directory to move into.\n\nFor example, say I want to clone a GitHub repo from my colleague Brian, which has 100 R script files, and in every one of those files at the top is:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsetwd(\"C:\\Users\\Brian\\path\\only\\that\\Brian\\has\")\n```\n:::\n\n\nThe problem is, if I want to use his code, I will need to go and hand-edit every single one of those paths (`C:\\Users\\Brian\\path\\only\\that\\Brian\\has`) to the path that I want to use on my computer or wherever I saved the folder on my computer (e.g. `/Users/Stephanie/Documents/path/only/I/have`).\n\n1. This is an unsustainable practice.\n2. I can go in and manually edit the path, but this assumes I know how to set a working directory. Not everyone does.\n\nSo instead of absolute paths:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsetwd(\"/Users/bcaffo/data\")\nsetwd(\"~/Desktop/files/data\")\nsetwd(\"C:\\\\Users\\\\Michelle\\\\Downloads\")\n```\n:::\n\n\nA better idea is to use relative paths:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsetwd(\"../data\")\nsetwd(\"../files\")\nsetwd(\"..\\tmp\")\n```\n:::\n\n\nWithin R, an even better idea is to use the [here](https://github.com/r-lib/here) R package will recognize the top-level directory of a Git repo and supports building all paths relative to that. For more on project-oriented workflow suggestions, read [this post](https://www.tidyverse.org/articles/2017/12/workflow-vs-script/) from Jenny Bryan.\n\n![Artwork by Allison Horst on setwd() function](https://github.com/allisonhorst/stats-illustrations/raw/main/rstats-artwork/cracked_setwd.png){width=\"80%\"}\n\n\\[**Source**: [Artwork by Allison Horst](https://github.com/allisonhorst/stats-illustrations)\\]\n\n### The `here` package\n\nIn her post, Jenny Bryan writes\n\n> \"I suggest organizing each data analysis into a project: a folder on your computer that holds all the files relevant to that particular piece of work.\"\n\nInstead of using `setwd()` at the top your `.R` or `.Rmd` file, she suggests:\n\n- Organize each logical project into a folder on your computer.\n- Make sure the top-level folder advertises itself as such. This can be as simple as having an empty file named `.here`. Or, if you use RStudio and/or Git, those both leave characteristic files behind that will get the job done.\n- Use the `here()` function from the `here` package to build the path when you read or write a file. Create paths relative to the top-level directory.\n- Whenever you work on this project, launch the R process from the project's top-level directory. If you launch R from the shell, `cd` to the correct folder first.\n\nLet's test this out. We can use `getwd()` to see our current working directory path and the files available using `list.files()`\n\n\n::: {.cell}\n\n```{.r .cell-code}\ngetwd()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"/Users/leocollado/Dropbox/Code/jhustatcomputing2023/posts/07-reading-and-writing-data\"\n```\n:::\n\n```{.r .cell-code}\nlist.files()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"index.qmd\" \"index.rmarkdown\"\n```\n:::\n:::\n\n\nOK so our current location is in the reading and writing lectures sub-folder of the `jhustatcomputing2022` course repository. Let's try using the `here` package.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(here)\n\nlist.files(here::here())\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n [1] \"_freeze\" \"_post_template.qmd\" \n [3] \"_quarto.yml\" \"_site\" \n [5] \"data\" \"gh-pages\" \n [7] \"icon_32.png\" \"images\" \n [9] \"index.qmd\" \"jhustatcomputing2023.Rproj\"\n[11] \"lectures.qmd\" \"posts\" \n[13] \"profile.jpg\" \"projects\" \n[15] \"projects.qmd\" \"README.md\" \n[17] \"resources.qmd\" \"schedule.qmd\" \n[19] \"scripts\" \"site_libs\" \n[21] \"styles.css\" \"syllabus.qmd\" \n[23] \"videos\" \n```\n:::\n\n```{.r .cell-code}\nlist.files(here(\"data\"))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n [1] \"2016-07-19.csv.bz2\" \"b_lyrics.RDS\" \n [3] \"bmi_pm25_no2_sim.csv\" \"chicago.rds\" \n [5] \"chocolate.RDS\" \"flights.csv\" \n [7] \"maacs_sim.csv\" \"sales.RDS\" \n [9] \"storms_2004.csv.gz\" \"team_standings.csv\" \n[11] \"ts_lyrics.RDS\" \"tuesdata_rainfall.RDS\" \n[13] \"tuesdata_temperature.RDS\"\n```\n:::\n:::\n\n\nNow we see that using the `here::here()` function is a *relative* path (relative to the `.Rproj` file in our `jhustatcomputing2022` repository. We also see there is are two `.csv` files in the `data` folder. We will learn how to read those files into R in the next section.\n\n![Artwork by Allison Horst on here package](https://github.com/allisonhorst/stats-illustrations/raw/main/rstats-artwork/here.png){width=\"80%\"}\n\n\\[**Source**: [Artwork by Allison Horst](https://github.com/allisonhorst/stats-illustrations)\\]\n\n### Finding and creating files locally\n\nOne last thing. If you want to download a file, one way to use the `file.exists()`, `dir.create()` and `list.files()` functions.\n\n- `file.exists(here(\"my\", \"relative\", \"path\"))`: logical test if the file exists\n- `dir.create(here(\"my\", \"relative\", \"path\"))`: create a folder\n- `list.files(here(\"my\", \"relative\", \"path\"))`: list contents of folder\n- `file.create(here(\"my\", \"relative\", \"path\"))`: create a file\n- `file.remove(here(\"my\", \"relative\", \"path\"))`: delete a file\n\nFor example, I can put all this together by\n\n1. Checking to see if a file exists in my path. If not, then\n2. Create a directory in that path.\n3. List the files in the path.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nif(!file.exists(here(\"my\", \"relative\", \"path\"))){\n dir.create(here(\"my\", \"relative\", \"path\"))\n}\nlist.files(here(\"my\", \"relative\", \"path\"))\n```\n:::\n\n\nLet's put relative paths to use while reading and writing data.\n\n# Reading data in base R\n\nIn this section, we're going to demonstrate the essential functions you need to know to read and write (or save) data in R.\n\n## txt or csv\n\nThere are a few primary functions reading data from base R.\n\n- `read.table()`, `read.csv()`: for reading tabular data\n- `readLines()`: for reading lines of a text file\n\nThere are analogous functions for writing data to files\n\n- `write.table()`: for writing tabular data to text files (i.e. CSV) or connections\n- `writeLines()`: for writing character data line-by-line to a file or connection\n\nLet's try reading some data into R with the `read.csv()` function.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ndf <- read.csv(here(\"data\", \"team_standings.csv\"))\ndf\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n Standing Team\n1 1 Spain\n2 2 Netherlands\n3 3 Germany\n4 4 Uruguay\n5 5 Argentina\n6 6 Brazil\n7 7 Ghana\n8 8 Paraguay\n9 9 Japan\n10 10 Chile\n11 11 Portugal\n12 12 USA\n13 13 England\n14 14 Mexico\n15 15 South Korea\n16 16 Slovakia\n17 17 Ivory Coast\n18 18 Slovenia\n19 19 Switzerland\n20 20 South Africa\n21 21 Australia\n22 22 New Zealand\n23 23 Serbia\n24 24 Denmark\n25 25 Greece\n26 26 Italy\n27 27 Nigeria\n28 28 Algeria\n29 29 France\n30 30 Honduras\n31 31 Cameroon\n32 32 North Korea\n```\n:::\n:::\n\n\nWe can use the `$` symbol to pick out a specific column:\n\n\n::: {.cell}\n\n```{.r .cell-code}\ndf$Team\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n [1] \"Spain\" \"Netherlands\" \"Germany\" \"Uruguay\" \"Argentina\" \n [6] \"Brazil\" \"Ghana\" \"Paraguay\" \"Japan\" \"Chile\" \n[11] \"Portugal\" \"USA\" \"England\" \"Mexico\" \"South Korea\" \n[16] \"Slovakia\" \"Ivory Coast\" \"Slovenia\" \"Switzerland\" \"South Africa\"\n[21] \"Australia\" \"New Zealand\" \"Serbia\" \"Denmark\" \"Greece\" \n[26] \"Italy\" \"Nigeria\" \"Algeria\" \"France\" \"Honduras\" \n[31] \"Cameroon\" \"North Korea\" \n```\n:::\n:::\n\n\nWe can also ask for the full paths for specific files\n\n\n::: {.cell}\n\n```{.r .cell-code}\nhere(\"data\", \"team_standings.csv\")\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"/Users/leocollado/Dropbox/Code/jhustatcomputing2023/data/team_standings.csv\"\n```\n:::\n:::\n\n\n::: callout-note\n### Questions\n\n- What happens when you use `readLines()` function with the `team_standings.csv` data?\n- How would you only read in the first 5 lines?\n:::\n\n## R code\n\nSometimes, someone will give you a file that ends in a `.R`.\n\nThis is what's called an **R script file**. It may contain code someone has written (maybe even you!), for example, a function that you can use with your data. In this case, you want the function available for you to use.\n\nTo use the function, **you have to first, read in the function from R script file into R**.\n\nYou can check to see if the function already is loaded in R by looking at the Environment tab.\n\nThe function you want to use is\n\n- `source()`: for reading in R code files\n\nFor example, it might be something like this:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsource(here::here('functions.R'))\n```\n:::\n\n\n## R objects\n\nAlternatively, you might be interested in reading and writing R objects.\n\nWriting data in e.g. `.txt`, `.csv` or Excel file formats is good if you want to open these files with other analysis software, such as Excel. However, these formats do not preserve data structures, such as column data types (numeric, character or factor). In order to do that, the data should be written out in a R data format.\n\nThere are several types R data file formats to be aware of:\n\n- `.RData`: Stores **multiple** R objects\n- `.Rda`: This is short for `.RData` and is equivalent.\n- `.Rds`: Stores a **single** R object\n\n::: callout-note\n### Question\n\n**Why is saving data in as a R object useful?**\n\nSaving data into R data formats can **typically** reduce considerably the size of large files by compression.\n:::\n\nNext, we will learn how to read and save\n\n1. A single R object\n2. Multiple R objects\n3. Your entire work space in a specified file\n\n### Reading in data from files\n\n- `load()`: for reading in single or multiple R objects (opposite of `save()`) with a `.Rda` or `.RData` file format (objects must be same name)\n- `readRDS()`: for reading in a single object with a `.Rds` file format (can rename objects)\n- `unserialize()`: for reading single R objects in binary form\n\n### Writing data to files\n\n- `save()`: for saving an arbitrary number of R objects in binary format (possibly compressed) to a file.\n- `saveRDS()`: for saving a single object\n- `serialize()`: for converting an R object into a binary format for outputting to a connection (or file).\n- `save.image()`: short for 'save my current workspace'; while this **sounds** nice, it's not terribly useful for reproducibility (hence not suggested); it's also what happens when you try to quit R and it asks if you want to save your work space.\n\n\n::: {.cell}\n::: {.cell-output-display}\n![Save data into R data file formats: RDS and RDATA](http://www.sthda.com/sthda/RDoc/images/save-data-into-r-data-formats.png)\n:::\n:::\n\n\n\\[[Source](http://www.sthda.com/english/wiki/saving-data-into-r-data-format-rds-and-rdata)\\]\n\n### Example\n\nLet's try an example. Let's save a vector of length 5 into the two file formats.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- 1:5\nsave(x, file=here(\"data\", \"x.Rda\"))\nsaveRDS(x, file=here(\"data\", \"x.Rds\"))\nlist.files(path=here(\"data\"))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n [1] \"2016-07-19.csv.bz2\" \"b_lyrics.RDS\" \n [3] \"bmi_pm25_no2_sim.csv\" \"chicago.rds\" \n [5] \"chocolate.RDS\" \"flights.csv\" \n [7] \"maacs_sim.csv\" \"sales.RDS\" \n [9] \"storms_2004.csv.gz\" \"team_standings.csv\" \n[11] \"ts_lyrics.RDS\" \"tuesdata_rainfall.RDS\" \n[13] \"tuesdata_temperature.RDS\" \"x.Rda\" \n[15] \"x.Rds\" \n```\n:::\n:::\n\n\nHere we assign the imported data to an object using `readRDS()`\n\n\n::: {.cell}\n\n```{.r .cell-code}\nnew_x1 <- readRDS(here(\"data\", \"x.Rds\"))\nnew_x1\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 1 2 3 4 5\n```\n:::\n:::\n\n\nHere we assign the imported data to an object using `load()`\n\n\n::: {.cell}\n\n```{.r .cell-code}\nnew_x2 <- load(here(\"data\", \"x.Rda\"))\nnew_x2\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"x\"\n```\n:::\n:::\n\n\n::: callout-tip\n### Note\n\n`load()` simply returns the name of the objects loaded. Not the values.\n:::\n\nLet's clean up our space.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nfile.remove(here(\"data\", \"x.Rda\"))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] TRUE\n```\n:::\n\n```{.r .cell-code}\nfile.remove(here(\"data\", \"x.Rds\"))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] TRUE\n```\n:::\n\n```{.r .cell-code}\nrm(x)\n```\n:::\n\n\n::: callout-note\n### Question\n\nWhat do you think this code will do?\n\n**Hint**: change `eval=TRUE` to see result\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- 1:5\ny <- x^2\nsave(x,y, file=here(\"data\", \"x.Rda\"))\nnew_x2 <- load(here(\"data\", \"x.Rda\"))\n```\n:::\n\n\nWhen you are done:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nfile.remove(here(\"data\", \"x.Rda\"))\n```\n:::\n\n:::\n\n## Other data types\n\nNow, there are of course, many R packages that have been developed to read in all kinds of other datasets, and you may need to resort to one of these packages if you are working in a specific area.\n\nFor example, check out\n\n- [`DBI`](https://github.com/r-dbi/DBI) for relational databases\n- [`haven`](https://haven.tidyverse.org) for SPSS, Stata, and SAS data\n- [`httr`](https://github.com/r-lib/httr) for web APIs\n- [`readxl`](https://readxl.tidyverse.org) for `.xls` and `.xlsx` sheets\n- [`googlesheets4`](https://googlesheets4.tidyverse.org) for Google Sheets\n- [`googledrive`](https://googledrive.tidyverse.org) for Google Drive files\n- [`rvest`](https://github.com/tidyverse/rvest) for web scraping\n- [`jsonlite`](https://github.com/jeroen/jsonlite#jsonlite) for JSON\n- [`xml2`](https://github.com/r-lib/xml2) for XML.\n\n## Reading data files with `read.table()`\n\n
\n\nFor details on reading data with `read.table()`, click here.\n\nThe `read.table()` function is one of the most commonly used functions for reading data. The help file for `read.table()` is worth reading in its entirety if only because the function gets used a lot (run `?read.table` in R).\n\n**I know, I know**, everyone always says to read the help file, but this one is actually worth reading.\n\nThe `read.table()` function has a few important arguments:\n\n- `file`, the name of a file, or a connection\n- `header`, logical indicating if the file has a header line\n- `sep`, a string indicating how the columns are separated\n- `colClasses`, a character vector indicating the class of each column in the dataset\n- `nrows`, the number of rows in the dataset. By default `read.table()` reads an entire file.\n- `comment.char`, a character string indicating the comment character. This defaults to `\"#\"`. If there are no commented lines in your file, it's worth setting this to be the empty string `\"\"`.\n- `skip`, the number of lines to skip from the beginning\n- `stringsAsFactors`, should character variables be coded as factors? This defaults to `FALSE`. However, back in the \"old days\", it defaulted to `TRUE`. The reason for this was because, if you had data that were stored as strings, it was because those strings represented levels of a categorical variable. Now, we have lots of data that is text data and they do not always represent categorical variables. So you may want to set this to be `FALSE` in those cases. If you *always* want this to be `FALSE`, you can set a global option via `options(stringsAsFactors = FALSE)`.\n\nI've never seen so much heat generated on discussion forums about an R function argument than the `stringsAsFactors` argument. **Seriously**.\n\nFor small to moderately sized datasets, you can usually call `read.table()` without specifying any other arguments\n\n\n::: {.cell}\n\n```{.r .cell-code}\ndata <- read.table(\"foo.txt\")\n```\n:::\n\n\n::: callout-tip\n### Note\n\n`foo.txt` is not a real dataset here. It is only used as an example for how to use `read.table()`\n:::\n\nIn this case, R will automatically:\n\n- skip lines that begin with a \\#\n- figure out how many rows there are (and how much memory needs to be allocated)\n- figure what type of variable is in each column of the table.\n\nTelling R all these things directly makes R run faster and more efficiently.\n\n::: callout-tip\n### Note\n\nThe `read.csv()` function is identical to `read.table()` except that some of the defaults are set differently (like the `sep` argument).\n:::\n\n
\n\n## Reading in larger datasets with `read.table()`\n\n
\n\nFor details on reading larger datasets with `read.table()`, click here.\n\nWith much larger datasets, there are a few things that you can do that will make your life easier and will prevent R from choking.\n\n- Read the help page for `read.table()`, which contains many hints\n- Make a rough calculation of the memory required to store your dataset (see the next section for an example of how to do this). If the dataset is larger than the amount of RAM on your computer, you can probably stop right here.\n- Set `comment.char = \"\"` if there are no commented lines in your file.\n- Use the `colClasses` argument. Specifying this option instead of using the default can make `read.table()` run MUCH faster, often twice as fast. In order to use this option, you have to know the class of each column in your data frame. If all of the columns are \"numeric\", for example, then you can just set `colClasses = \"numeric\"`. A quick an dirty way to figure out the classes of each column is the following:\n\n\n::: {.cell}\n\n```{.r .cell-code}\ninitial <- read.table(\"datatable.txt\", nrows = 100)\nclasses <- sapply(initial, class)\ntabAll <- read.table(\"datatable.txt\", colClasses = classes)\n```\n:::\n\n\n**Note**: `datatable.txt` is not a real dataset here. It is only used as an example for how to use `read.table()`.\n\n- Set `nrows`. This does not make R run faster but it helps with memory usage. A mild overestimate is okay. You can use the Unix tool `wc` to calculate the number of lines in a file.\n\nIn general, when using R with larger datasets, it's also useful to know a few things about your system.\n\n- How much memory is available on your system?\n- What other applications are in use? Can you close any of them?\n- Are there other users logged into the same system?\n- What operating system ar you using? Some operating systems can limit the amount of memory a single process can access\n\n
\n\n# Calculating Memory Requirements for R Objects\n\nBecause **R stores all of its objects in physical memory**, it is important to be cognizant of how much memory is being used up by all of the data objects residing in your workspace.\n\nOne situation where it is particularly important to understand memory requirements is when you are reading in a new dataset into R. Fortunately, it is easy to make a back of the envelope calculation of how much memory will be required by a new dataset.\n\nFor example, suppose I have a data frame with 1,500,000 rows and 120 columns, all of which are numeric data. Roughly, how much memory is required to store this data frame?\n\nWell, on most modern computers [double precision floating point numbers](http://en.wikipedia.org/wiki/Double-precision_floating-point_format) are stored using 64 bits of memory, or 8 bytes. Given that information, you can do the following calculation\n\n1,500,000 × 120 × 8 bytes/numeric = 1,440,000,000 bytes\n\n= 1,440,000,000 / 2^20^ bytes/MB\n\n= 1,373.29 MB\n\n= 1.34 GB\n\nSo the dataset would require about 1.34 GB of RAM. Most computers these days have at least that much RAM. However, you need to be aware of\n\n- what other programs might be running on your computer, using up RAM\n- what other R objects might already be taking up RAM in your workspace\n\nReading in a large dataset for which you do not have enough RAM is one easy way to freeze up your computer (or at least your R session). This is usually an unpleasant experience that usually requires you to kill the R process, in the best case scenario, or reboot your computer, in the worst case. So make sure to do a rough calculation of memory requirements before reading in a large dataset. You'll thank me later.\n\n# Using the `readr` package\n\nThe `readr` package was developed by Posit (formerly known as RStudio) to deal with reading in large flat files quickly.\n\nThe package provides replacements for functions like `read.table()` and `read.csv()`. The analogous functions in `readr` are `read_table()` and `read_csv()`. These **functions are often much faster than their base R analogues** and provide a few other nice features such as progress meters.\n\nFor example, the package includes a variety of functions in the `read_*()` family that allow you to read in data from different formats of flat files. The following table gives a guide to several functions in the `read_*()` family.\n\n\n::: {.cell}\n::: {.cell-output-display}\n|`readr` function |Use |\n|:----------------|:--------------------------------------------|\n|`read_csv()` |Reads comma-separated file |\n|`read_csv2()` |Reads semicolon-separated file |\n|`read_tsv()` |Reads tab-separated file |\n|`read_delim()` |General function for reading delimited files |\n|`read_fwf()` |Reads fixed width files |\n|`read_log()` |Reads log files |\n:::\n:::\n\n\n::: callout-tip\n### Note\n\nIn this code, I used the `kable()` function from the `knitr` package to create the summary table in a table format, rather than as basic R output.\n\nThis function is very useful **for formatting basic tables in R markdown documents**. For more complex tables, check out the `pander` and `xtable` packages.\n:::\n\nFor the most part, you can read use `read_table()` and `read_csv()` pretty much anywhere you might use `read.table()` and `read.csv()`.\n\nIn addition, if there are non-fatal problems that occur while reading in the data, you will **get a warning and the returned data frame will have some information about which rows/observations triggered the warning**.\n\nThis can be very helpful for \"debugging\" problems with your data before you get neck deep in data analysis.\n\n## Advantages\n\nThe advantage of the `read_csv()` function is perhaps better understood from an historical perspective.\n\n- R's built in `read.csv()` function similarly reads CSV files, but the `read_csv()` function in `readr` builds on that by **removing some of the quirks and \"gotchas\"** of `read.csv()` as well as **dramatically optimizing the speed** with which it can read data into R.\n- The `read_csv()` function also adds some nice user-oriented features like a progress meter and a compact method for specifying column types.\n\n## Example\n\nA typical call to `read_csv()` will look as follows.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(readr)\nteams <- read_csv(here(\"data\", \"team_standings.csv\"))\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nRows: 32 Columns: 2\n── Column specification ────────────────────────────────────────────────────────\nDelimiter: \",\"\nchr (1): Team\ndbl (1): Standing\n\nℹ Use `spec()` to retrieve the full column specification for this data.\nℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.\n```\n:::\n\n```{.r .cell-code}\nteams\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 32 × 2\n Standing Team \n \n 1 1 Spain \n 2 2 Netherlands\n 3 3 Germany \n 4 4 Uruguay \n 5 5 Argentina \n 6 6 Brazil \n 7 7 Ghana \n 8 8 Paraguay \n 9 9 Japan \n10 10 Chile \n# ℹ 22 more rows\n```\n:::\n:::\n\n\nBy default, `read_csv()` will open a CSV file and read it in line-by-line. Similar to `read.table()`, you can tell the function to `skip` lines or which lines are comments:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nread_csv(\"The first line of metadata\n The second line of metadata\n x,y,z\n 1,2,3\",\n skip = 2)\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nRows: 1 Columns: 3\n── Column specification ────────────────────────────────────────────────────────\nDelimiter: \",\"\ndbl (3): x, y, z\n\nℹ Use `spec()` to retrieve the full column specification for this data.\nℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.\n```\n:::\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 1 × 3\n x y z\n \n1 1 2 3\n```\n:::\n:::\n\n\nAlternatively, you can use the `comment` argument:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nread_csv(\"# A comment I want to skip\n x,y,z\n 1,2,3\",\n comment = \"#\")\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nRows: 1 Columns: 3\n── Column specification ────────────────────────────────────────────────────────\nDelimiter: \",\"\ndbl (3): x, y, z\n\nℹ Use `spec()` to retrieve the full column specification for this data.\nℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.\n```\n:::\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 1 × 3\n x y z\n \n1 1 2 3\n```\n:::\n:::\n\n\nIt will also (**by default**), **read in the first few rows of the table** in order to figure out the type of each column (i.e. integer, character, etc.). From the `read_csv()` help page:\n\n> If 'NULL', all column types will be imputed from the first 1000 rows on the input. This is convenient (and fast), but not robust. If the imputation fails, you'll need to supply the correct types yourself.\n\nYou can specify the type of each column with the `col_types` argument.\n\n::: callout-tip\n### Note\n\nIn general, it is a good idea to **specify the column types explicitly**.\n\nThis rules out any possible guessing errors on the part of `read_csv()`.\n\nAlso, specifying the column types explicitly provides a useful safety check in case anything about the dataset should change without you knowing about it.\n:::\n\nHere is an example of how to specify the column types explicitly:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nteams <- read_csv(here(\"data\", \"team_standings.csv\"), \n col_types = \"cc\")\n```\n:::\n\n\nNote that the `col_types` argument accepts a compact representation. Here `\"cc\"` indicates that the first column is `character` and the second column is `character` (there are only two columns). Using the `col_types` argument is useful because often it is not easy to automatically figure out the type of a column by looking at a few rows (especially if a column has many missing values).\n\n::: callout-tip\n### Note\n\nThe `read_csv()` function **will also read compressed files** automatically.\n\nThere is no need to decompress the file first or use the `gzfile` connection function.\n:::\n\nThe following call reads a gzip-compressed CSV file containing download logs from the RStudio CRAN mirror.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlogs <- read_csv(here(\"data\", \"2016-07-19.csv.bz2\"), \n n_max = 10)\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nRows: 10 Columns: 10\n── Column specification ────────────────────────────────────────────────────────\nDelimiter: \",\"\nchr (6): r_version, r_arch, r_os, package, version, country\ndbl (2): size, ip_id\ndate (1): date\ntime (1): time\n\nℹ Use `spec()` to retrieve the full column specification for this data.\nℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.\n```\n:::\n:::\n\n\nNote that the warnings indicate that `read_csv()` may have had some difficulty identifying the type of each column. This can be solved by using the `col_types` argument.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlogs <- read_csv(here(\"data\", \"2016-07-19.csv.bz2\"), \n col_types = \"ccicccccci\", \n n_max = 10)\nlogs\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 10 × 10\n date time size r_version r_arch r_os package version country ip_id\n \n 1 2016-07-19 22:00… 1.89e6 3.3.0 x86_64 ming… data.t… 1.9.6 US 1\n 2 2016-07-19 22:00… 4.54e4 3.3.1 x86_64 ming… assert… 0.1 US 2\n 3 2016-07-19 22:00… 1.43e7 3.3.1 x86_64 ming… stringi 1.1.1 DE 3\n 4 2016-07-19 22:00… 1.89e6 3.3.1 x86_64 ming… data.t… 1.9.6 US 4\n 5 2016-07-19 22:00… 3.90e5 3.3.1 x86_64 ming… foreach 1.4.3 US 4\n 6 2016-07-19 22:00… 4.88e4 3.3.1 x86_64 linu… tree 1.0-37 CO 5\n 7 2016-07-19 22:00… 5.25e2 3.3.1 x86_64 darw… surviv… 2.39-5 US 6\n 8 2016-07-19 22:00… 3.23e6 3.3.1 x86_64 ming… Rcpp 0.12.5 US 2\n 9 2016-07-19 22:00… 5.56e5 3.3.1 x86_64 ming… tibble 1.1 US 2\n10 2016-07-19 22:00… 1.52e5 3.3.1 x86_64 ming… magrit… 1.5 US 2\n```\n:::\n:::\n\n\nYou can **specify the column type in a more detailed fashion** by using the various `col_*()` functions.\n\nFor example, in the log data above, the first column is actually a date, so it might make more sense to read it in as a `Date` object.\n\nIf we wanted to just read in that first column, we could do\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlogdates <- read_csv(here(\"data\", \"2016-07-19.csv.bz2\"), \n col_types = cols_only(date = col_date()),\n n_max = 10)\nlogdates\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 10 × 1\n date \n \n 1 2016-07-19\n 2 2016-07-19\n 3 2016-07-19\n 4 2016-07-19\n 5 2016-07-19\n 6 2016-07-19\n 7 2016-07-19\n 8 2016-07-19\n 9 2016-07-19\n10 2016-07-19\n```\n:::\n:::\n\n\nNow the `date` column is stored as a `Date` object which can be used for relevant date-related computations (for example, see the `lubridate` package).\n\n::: callout-tip\n### Note\n\nThe `read_csv()` function has a `progress` option that defaults to TRUE.\n\nThis options provides a nice progress meter while the CSV file is being read.\n\nHowever, if you are using `read_csv()` in a function, or perhaps embedding it in a loop, it is probably best to set `progress = FALSE`.\n:::\n\n# Post-lecture materials\n\n### Final Questions\n\nHere are some post-lecture questions to help you think about the material discussed.\n\n::: callout-note\n### Questions\n\n1. What is the point of reference for using relative paths with the `here::here()` function?\n\n2. Why was the argument `stringsAsFactors=TRUE` historically used?\n\n3. What is the difference between `.Rds` and `.Rda` file formats?\n\n4. What function in `readr` would you use to read a file where fields were separated with \"\\|\"?\n:::\n\n### Additional Resources\n\n::: callout-tip\n- \n- \n- \n:::\n\n# R session information\n\n\n::: {.cell}\n\n```{.r .cell-code}\noptions(width = 120)\nsessioninfo::session_info()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────\n setting value\n version R version 4.3.1 (2023-06-16)\n os macOS Ventura 13.5\n system aarch64, darwin20\n ui X11\n language (EN)\n collate en_US.UTF-8\n ctype en_US.UTF-8\n tz America/New_York\n date 2023-08-17\n pandoc 3.1.5 @ /opt/homebrew/bin/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────\n package * version date (UTC) lib source\n bit 4.0.5 2022-11-15 [1] CRAN (R 4.3.0)\n bit64 4.0.5 2020-08-30 [1] CRAN (R 4.3.0)\n cli 3.6.1 2023-03-23 [1] CRAN (R 4.3.0)\n colorout 1.2-2 2023-05-06 [1] Github (jalvesaq/colorout@79931fd)\n crayon 1.5.2 2022-09-29 [1] CRAN (R 4.3.0)\n digest 0.6.33 2023-07-07 [1] CRAN (R 4.3.0)\n evaluate 0.21 2023-05-05 [1] CRAN (R 4.3.0)\n fansi 1.0.4 2023-01-22 [1] CRAN (R 4.3.0)\n fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.3.0)\n glue 1.6.2 2022-02-24 [1] CRAN (R 4.3.0)\n here * 1.0.1 2020-12-13 [1] CRAN (R 4.3.0)\n hms 1.1.3 2023-03-21 [1] CRAN (R 4.3.0)\n htmltools 0.5.6 2023-08-10 [1] CRAN (R 4.3.0)\n htmlwidgets 1.6.2 2023-03-17 [1] CRAN (R 4.3.0)\n jsonlite 1.8.7 2023-06-29 [1] CRAN (R 4.3.0)\n knitr 1.43 2023-05-25 [1] CRAN (R 4.3.0)\n lifecycle 1.0.3 2022-10-07 [1] CRAN (R 4.3.0)\n magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.3.0)\n pillar 1.9.0 2023-03-22 [1] CRAN (R 4.3.0)\n pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 4.3.0)\n R6 2.5.1 2021-08-19 [1] CRAN (R 4.3.0)\n readr * 2.1.4 2023-02-10 [1] CRAN (R 4.3.0)\n rlang 1.1.1 2023-04-28 [1] CRAN (R 4.3.0)\n rmarkdown 2.24 2023-08-14 [1] CRAN (R 4.3.1)\n rprojroot 2.0.3 2022-04-02 [1] CRAN (R 4.3.0)\n rstudioapi 0.15.0 2023-07-07 [1] CRAN (R 4.3.0)\n sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.3.0)\n tibble 3.2.1 2023-03-20 [1] CRAN (R 4.3.0)\n tidyselect 1.2.0 2022-10-10 [1] CRAN (R 4.3.0)\n tzdb 0.4.0 2023-05-12 [1] CRAN (R 4.3.0)\n utf8 1.2.3 2023-01-31 [1] CRAN (R 4.3.0)\n vctrs 0.6.3 2023-06-14 [1] CRAN (R 4.3.0)\n vroom 1.6.3 2023-04-28 [1] CRAN (R 4.3.0)\n withr 2.5.0 2022-03-03 [1] CRAN (R 4.3.0)\n xfun 0.40 2023-08-09 [1] CRAN (R 4.3.0)\n yaml 2.3.7 2023-01-23 [1] CRAN (R 4.3.0)\n\n [1] /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library\n\n──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n```\n:::\n:::\n", + "markdown": "---\ntitle: \"07 - Reading and Writing data\"\nauthor:\n - name: Leonardo Collado Torres\n url: http://lcolladotor.github.io/\n affiliations:\n - id: libd\n name: Lieber Institute for Brain Development\n url: https://libd.org/\n - id: jhsph\n name: Johns Hopkins Bloomberg School of Public Health Department of Biostatistics\n url: https://publichealth.jhu.edu/departments/biostatistics\ndescription: \"How to get data in and out of R using relative paths\"\ncategories: [module 2, week 2, R, programming, readr, here, tidyverse]\n---\n\n\n*This lecture, as the rest of the course, is adapted from the version [Stephanie C. Hicks](https://www.stephaniehicks.com/) designed and maintained in 2021 and 2022. Check the recent changes to this file through the [GitHub history](https://github.com/lcolladotor/jhustatcomputing2023/commits/main/posts/07-reading-and-writing-data/index.qmd).*\n\n\n::: {.cell}\n\n:::\n\n\n\n\n> \"When writing code, you're always collaborating with future-you; and past-you doesn't respond to emails\". ---*Hadley Wickham*\n\n\\[[Source](https://fivebooks.com/best-books/computer-science-data-science-hadley-wickham/)\\]\n\n# Pre-lecture materials\n\n### Read ahead\n\n::: callout-note\n## Read ahead\n\n**Before class, you can prepare by reading the following materials:**\n\n1. \n2. \n:::\n\n### Acknowledgements\n\nMaterial for this lecture was borrowed and adopted from\n\n- \n- \n\n# Learning objectives\n\n::: callout-note\n# Learning objectives\n\n**At the end of this lesson you will:**\n\n- Know difference between relative vs absolute paths\n- Be able to read and write text / csv files in R\n- Be able to read and write R data objects in R\n- Be able to calculate memory requirements for R objects\n- Use modern R packages for reading and writing data\n:::\n\n# Introduction\n\nThis lesson introduces **ways to read and write data** (e.g. `.txt` and `.csv` files) using base R functions as well as more modern R packages, such as `readr`, which is typically [10x faster than base R](https://r4ds.had.co.nz/data-import.html#compared-to-base-r).\n\nWe will also briefly describe different ways for reading and writing other data types such as, Excel files, google spreadsheets, or SQL databases.\n\n# Relative versus absolute paths\n\nWhen you are starting a data analysis, you can create a new `.Rproj` file that asks RStudio to change the path (location on your computer) to the `.Rproj` location.\n\nLet's try this out. In RStudio, click `Project: (None)` in the top right corner and `New Project`.\n\nAfter opening up a `.Rproj` file, you can test this by\n\n\n::: {.cell}\n\n```{.r .cell-code}\ngetwd()\n```\n:::\n\n\nWhen you open up someone else's R code or analysis, you might also see the\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsetwd()\n```\n:::\n\n\nfunction being used which explicitly tells R to change the absolute path or absolute location of which directory to move into.\n\nFor example, say I want to clone a GitHub repo from my colleague Brian, which has 100 R script files, and in every one of those files at the top is:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsetwd(\"C:\\\\Users\\\\Brian\\\\path\\\\only\\\\that\\\\Brian\\\\has\")\n```\n:::\n\n\nThe problem is, if I want to use his code, I will need to go and hand-edit every single one of those paths (`C:\\Users\\Brian\\path\\only\\that\\Brian\\has`) to the path that I want to use on my computer or wherever I saved the folder on my computer (e.g. `/Users/leocollado/Documents/path/only/I/have`).\n\n1. This is an unsustainable practice.\n2. I can go in and manually edit the path, but this assumes I know how to set a working directory. Not everyone does.\n\nSo instead of absolute paths:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsetwd(\"/Users/bcaffo/data\")\nsetwd(\"~/Desktop/files/data\")\nsetwd(\"C:\\\\Users\\\\Michelle\\\\Downloads\")\n```\n:::\n\n\nA better idea is to use relative paths:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsetwd(\"../data\")\nsetwd(\"../files\")\nsetwd(\"..\\tmp\")\n```\n:::\n\n\nWithin R, an even better idea is to use the [here](https://github.com/r-lib/here) R package will recognize the top-level directory of a Git repo and supports building all paths relative to that. For more on project-oriented workflow suggestions, read [this post](https://www.tidyverse.org/articles/2017/12/workflow-vs-script/) from Jenny Bryan.\n\n![Artwork by Allison Horst on setwd() function](https://github.com/allisonhorst/stats-illustrations/raw/main/rstats-artwork/cracked_setwd.png){width=\"80%\"}\n\n\\[**Source**: [Artwork by Allison Horst](https://github.com/allisonhorst/stats-illustrations)\\]\n\n### The `here` package\n\nIn her post, Jenny Bryan writes\n\n> \"I suggest organizing each data analysis into a project: a folder on your computer that holds all the files relevant to that particular piece of work.\"\n\nInstead of using `setwd()` at the top your `.R` or `.Rmd` file, she suggests:\n\n- Organize each logical project into a folder on your computer.\n- Make sure the top-level folder advertises itself as such. This can be as simple as having an empty file named `.here`. Or, if you use RStudio and/or Git, those both leave characteristic files behind that will get the job done.\n- Use the `here()` function from the `here` package to build the path when you read or write a file. Create paths relative to the top-level directory.\n- Whenever you work on this project, launch the R process from the project's top-level directory. If you launch R from the shell, `cd` to the correct folder first.\n\nLet's test this out. We can use `getwd()` to see our current working directory path and the files available using `list.files()`\n\n\n::: {.cell}\n\n```{.r .cell-code}\ngetwd()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"/Users/leocollado/Dropbox/Code/jhustatcomputing2023/posts/07-reading-and-writing-data\"\n```\n:::\n\n```{.r .cell-code}\nlist.files()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"index.qmd\" \"index.rmarkdown\"\n```\n:::\n:::\n\n\nOK so our current location is in the reading and writing lectures sub-folder of the `jhustatcomputing2022` course repository. Let's try using the `here` package.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(here)\n\nlist.files(here::here())\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n [1] \"_freeze\" \"_post_template.qmd\" \n [3] \"_quarto.yml\" \"_site\" \n [5] \"data\" \"gh-pages\" \n [7] \"icon_32.png\" \"images\" \n [9] \"index.qmd\" \"jhustatcomputing2023.Rproj\"\n[11] \"lectures.qmd\" \"posts\" \n[13] \"profile.jpg\" \"projects\" \n[15] \"projects.qmd\" \"README.md\" \n[17] \"resources.qmd\" \"schedule.qmd\" \n[19] \"scripts\" \"site_libs\" \n[21] \"styles.css\" \"syllabus.qmd\" \n[23] \"videos\" \n```\n:::\n\n```{.r .cell-code}\nlist.files(here(\"data\"))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n [1] \"2016-07-19.csv.bz2\" \"b_lyrics.RDS\" \n [3] \"bmi_pm25_no2_sim.csv\" \"chicago.rds\" \n [5] \"chocolate.RDS\" \"flights.csv\" \n [7] \"maacs_sim.csv\" \"sales.RDS\" \n [9] \"storms_2004.csv.gz\" \"team_standings.csv\" \n[11] \"ts_lyrics.RDS\" \"tuesdata_rainfall.RDS\" \n[13] \"tuesdata_temperature.RDS\"\n```\n:::\n:::\n\n\nNow we see that using the `here::here()` function is a *relative* path (relative to the `.Rproj` file in our `jhustatcomputing2022` repository. We also see there is are two `.csv` files in the `data` folder. We will learn how to read those files into R in the next section.\n\n![Artwork by Allison Horst on here package](https://github.com/allisonhorst/stats-illustrations/raw/main/rstats-artwork/here.png){width=\"80%\"}\n\n\\[**Source**: [Artwork by Allison Horst](https://github.com/allisonhorst/stats-illustrations)\\]\n\n### Finding and creating files locally\n\nOne last thing. If you want to download a file, one way to use the `file.exists()`, `dir.create()` and `list.files()` functions.\n\n- `file.exists(here(\"my\", \"relative\", \"path\"))`: logical test if the file exists\n- `dir.create(here(\"my\", \"relative\", \"path\"))`: create a folder\n- `list.files(here(\"my\", \"relative\", \"path\"))`: list contents of folder\n- `file.create(here(\"my\", \"relative\", \"path\"))`: create a file\n- `file.remove(here(\"my\", \"relative\", \"path\"))`: delete a file\n\nFor example, I can put all this together by\n\n1. Checking to see if a file exists in my path. If not, then\n2. Create a directory in that path.\n3. List the files in the path.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nif (!file.exists(here(\"my\", \"relative\", \"path\"))) {\n dir.create(here(\"my\", \"relative\", \"path\"))\n}\nlist.files(here(\"my\", \"relative\", \"path\"))\n```\n:::\n\n\nLet's put relative paths to use while reading and writing data.\n\n# Reading data in base R\n\nIn this section, we're going to demonstrate the essential functions you need to know to read and write (or save) data in R.\n\n## txt or csv\n\nThere are a few primary functions reading data from base R.\n\n- `read.table()`, `read.csv()`: for reading tabular data\n- `readLines()`: for reading lines of a text file\n\nThere are analogous functions for writing data to files\n\n- `write.table()`: for writing tabular data to text files (i.e. CSV) or connections\n- `writeLines()`: for writing character data line-by-line to a file or connection\n\nLet's try reading some data into R with the `read.csv()` function.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ndf <- read.csv(here(\"data\", \"team_standings.csv\"))\ndf\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n Standing Team\n1 1 Spain\n2 2 Netherlands\n3 3 Germany\n4 4 Uruguay\n5 5 Argentina\n6 6 Brazil\n7 7 Ghana\n8 8 Paraguay\n9 9 Japan\n10 10 Chile\n11 11 Portugal\n12 12 USA\n13 13 England\n14 14 Mexico\n15 15 South Korea\n16 16 Slovakia\n17 17 Ivory Coast\n18 18 Slovenia\n19 19 Switzerland\n20 20 South Africa\n21 21 Australia\n22 22 New Zealand\n23 23 Serbia\n24 24 Denmark\n25 25 Greece\n26 26 Italy\n27 27 Nigeria\n28 28 Algeria\n29 29 France\n30 30 Honduras\n31 31 Cameroon\n32 32 North Korea\n```\n:::\n:::\n\n\nWe can use the `$` symbol to pick out a specific column:\n\n\n::: {.cell}\n\n```{.r .cell-code}\ndf$Team\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n [1] \"Spain\" \"Netherlands\" \"Germany\" \"Uruguay\" \"Argentina\" \n [6] \"Brazil\" \"Ghana\" \"Paraguay\" \"Japan\" \"Chile\" \n[11] \"Portugal\" \"USA\" \"England\" \"Mexico\" \"South Korea\" \n[16] \"Slovakia\" \"Ivory Coast\" \"Slovenia\" \"Switzerland\" \"South Africa\"\n[21] \"Australia\" \"New Zealand\" \"Serbia\" \"Denmark\" \"Greece\" \n[26] \"Italy\" \"Nigeria\" \"Algeria\" \"France\" \"Honduras\" \n[31] \"Cameroon\" \"North Korea\" \n```\n:::\n:::\n\n\nWe can also ask for the full paths for specific files\n\n\n::: {.cell}\n\n```{.r .cell-code}\nhere(\"data\", \"team_standings.csv\")\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"/Users/leocollado/Dropbox/Code/jhustatcomputing2023/data/team_standings.csv\"\n```\n:::\n:::\n\n\n::: callout-note\n### Questions\n\n- What happens when you use `readLines()` function with the `team_standings.csv` data?\n- How would you only read in the first 5 lines?\n:::\n\n## R code\n\nSometimes, someone will give you a file that ends in a `.R`.\n\nThis is what's called an **R script file**. It may contain code someone has written (maybe even you!), for example, a function that you can use with your data. In this case, you want the function available for you to use.\n\nTo use the function, **you have to first, read in the function from R script file into R**.\n\nYou can check to see if the function already is loaded in R by looking at the Environment tab.\n\nThe function you want to use is\n\n- `source()`: for reading in R code files\n\nFor example, it might be something like this:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsource(here::here(\"functions.R\"))\n```\n:::\n\n\n## R objects\n\nAlternatively, you might be interested in reading and writing R objects.\n\nWriting data in e.g. `.txt`, `.csv` or Excel file formats is good if you want to open these files with other analysis software, such as Excel. However, these formats do not preserve data structures, such as column data types (numeric, character or factor). In order to do that, the data should be written out in a R data format.\n\nThere are several types R data file formats to be aware of:\n\n- `.RData`: Stores **multiple** R objects\n- `.Rda`: This is short for `.RData` and is equivalent.\n- `.Rds`: Stores a **single** R object\n\n::: callout-note\n### Question\n\n**Why is saving data in as a R object useful?**\n\nSaving data into R data formats can **typically** reduce considerably the size of large files by compression.\n:::\n\nNext, we will learn how to read and save\n\n1. A single R object\n2. Multiple R objects\n3. Your entire work space in a specified file\n\n### Reading in data from files\n\n- `load()`: for reading in single or multiple R objects (opposite of `save()`) with a `.Rda` or `.RData` file format (objects must be same name)\n- `readRDS()`: for reading in a single object with a `.Rds` file format (can rename objects)\n- `unserialize()`: for reading single R objects in binary form\n\n### Writing data to files\n\n- `save()`: for saving an arbitrary number of R objects in binary format (possibly compressed) to a file.\n- `saveRDS()`: for saving a single object\n- `serialize()`: for converting an R object into a binary format for outputting to a connection (or file).\n- `save.image()`: short for 'save my current workspace'; while this **sounds** nice, it's not terribly useful for reproducibility (hence not suggested); it's also what happens when you try to quit R and it asks if you want to save your work space.\n\n\n::: {.cell}\n::: {.cell-output-display}\n![Save data into R data file formats: RDS and RDATA](http://www.sthda.com/sthda/RDoc/images/save-data-into-r-data-formats.png)\n:::\n:::\n\n\n\\[[Source](http://www.sthda.com/english/wiki/saving-data-into-r-data-format-rds-and-rdata)\\]\n\n### Example\n\nLet's try an example. Let's save a vector of length 5 into the two file formats.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- 1:5\nsave(x, file = here(\"data\", \"x.Rda\"))\nsaveRDS(x, file = here(\"data\", \"x.Rds\"))\nlist.files(path = here(\"data\"))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n [1] \"2016-07-19.csv.bz2\" \"b_lyrics.RDS\" \n [3] \"bmi_pm25_no2_sim.csv\" \"chicago.rds\" \n [5] \"chocolate.RDS\" \"flights.csv\" \n [7] \"maacs_sim.csv\" \"sales.RDS\" \n [9] \"storms_2004.csv.gz\" \"team_standings.csv\" \n[11] \"ts_lyrics.RDS\" \"tuesdata_rainfall.RDS\" \n[13] \"tuesdata_temperature.RDS\" \"x.Rda\" \n[15] \"x.Rds\" \n```\n:::\n:::\n\n\nHere we assign the imported data to an object using `readRDS()`\n\n\n::: {.cell}\n\n```{.r .cell-code}\nnew_x1 <- readRDS(here(\"data\", \"x.Rds\"))\nnew_x1\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 1 2 3 4 5\n```\n:::\n:::\n\n\nHere we assign the imported data to an object using `load()`\n\n\n::: {.cell}\n\n```{.r .cell-code}\nnew_x2 <- load(here(\"data\", \"x.Rda\"))\nnew_x2\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"x\"\n```\n:::\n:::\n\n\n::: callout-tip\n### Note\n\n`load()` simply returns the name of the objects loaded. Not the values.\n:::\n\nLet's clean up our space.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nfile.remove(here(\"data\", \"x.Rda\"))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] TRUE\n```\n:::\n\n```{.r .cell-code}\nfile.remove(here(\"data\", \"x.Rds\"))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] TRUE\n```\n:::\n\n```{.r .cell-code}\nrm(x)\n```\n:::\n\n\n::: callout-note\n### Question\n\nWhat do you think this code will do?\n\n**Hint**: change `eval=TRUE` to see result\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- 1:5\ny <- x^2\nsave(x, y, file = here(\"data\", \"x.Rda\"))\nnew_x2 <- load(here(\"data\", \"x.Rda\"))\n```\n:::\n\n\nWhen you are done:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nfile.remove(here(\"data\", \"x.Rda\"))\n```\n:::\n\n:::\n\n## Other data types\n\nNow, there are of course, many R packages that have been developed to read in all kinds of other datasets, and you may need to resort to one of these packages if you are working in a specific area.\n\nFor example, check out\n\n- [`DBI`](https://github.com/r-dbi/DBI) for relational databases\n- [`haven`](https://haven.tidyverse.org) for SPSS, Stata, and SAS data\n- [`httr`](https://github.com/r-lib/httr) for web APIs\n- [`readxl`](https://readxl.tidyverse.org) for `.xls` and `.xlsx` sheets\n- [`googlesheets4`](https://googlesheets4.tidyverse.org) for Google Sheets\n- [`googledrive`](https://googledrive.tidyverse.org) for Google Drive files\n- [`rvest`](https://github.com/tidyverse/rvest) for web scraping\n- [`jsonlite`](https://github.com/jeroen/jsonlite#jsonlite) for JSON\n- [`xml2`](https://github.com/r-lib/xml2) for XML.\n\n## Reading data files with `read.table()`\n\n
\n\nFor details on reading data with `read.table()`, click here.\n\nThe `read.table()` function is one of the most commonly used functions for reading data. The help file for `read.table()` is worth reading in its entirety if only because the function gets used a lot (run `?read.table` in R).\n\n**I know, I know**, everyone always says to read the help file, but this one is actually worth reading.\n\nThe `read.table()` function has a few important arguments:\n\n- `file`, the name of a file, or a connection\n- `header`, logical indicating if the file has a header line\n- `sep`, a string indicating how the columns are separated\n- `colClasses`, a character vector indicating the class of each column in the dataset\n- `nrows`, the number of rows in the dataset. By default `read.table()` reads an entire file.\n- `comment.char`, a character string indicating the comment character. This defaults to `\"#\"`. If there are no commented lines in your file, it's worth setting this to be the empty string `\"\"`.\n- `skip`, the number of lines to skip from the beginning\n- `stringsAsFactors`, should character variables be coded as factors? This defaults to `FALSE`. However, back in the \"old days\", it defaulted to `TRUE`. The reason for this was because, if you had data that were stored as strings, it was because those strings represented levels of a categorical variable. Now, we have lots of data that is text data and they do not always represent categorical variables. So you may want to set this to be `FALSE` in those cases. If you *always* want this to be `FALSE`, you can set a global option via `options(stringsAsFactors = FALSE)`.\n\nI've never seen so much heat generated on discussion forums about an R function argument than the `stringsAsFactors` argument. **Seriously**.\n\nFor small to moderately sized datasets, you can usually call `read.table()` without specifying any other arguments\n\n\n::: {.cell}\n\n```{.r .cell-code}\ndata <- read.table(\"foo.txt\")\n```\n:::\n\n\n::: callout-tip\n### Note\n\n`foo.txt` is not a real dataset here. It is only used as an example for how to use `read.table()`\n:::\n\nIn this case, R will automatically:\n\n- skip lines that begin with a \\#\n- figure out how many rows there are (and how much memory needs to be allocated)\n- figure what type of variable is in each column of the table.\n\nTelling R all these things directly makes R run faster and more efficiently.\n\n::: callout-tip\n### Note\n\nThe `read.csv()` function is identical to `read.table()` except that some of the defaults are set differently (like the `sep` argument).\n:::\n\n
\n\n## Reading in larger datasets with `read.table()`\n\n
\n\nFor details on reading larger datasets with `read.table()`, click here.\n\nWith much larger datasets, there are a few things that you can do that will make your life easier and will prevent R from choking.\n\n- Read the help page for `read.table()`, which contains many hints\n- Make a rough calculation of the memory required to store your dataset (see the next section for an example of how to do this). If the dataset is larger than the amount of RAM on your computer, you can probably stop right here.\n- Set `comment.char = \"\"` if there are no commented lines in your file.\n- Use the `colClasses` argument. Specifying this option instead of using the default can make `read.table()` run MUCH faster, often twice as fast. In order to use this option, you have to know the class of each column in your data frame. If all of the columns are \"numeric\", for example, then you can just set `colClasses = \"numeric\"`. A quick an dirty way to figure out the classes of each column is the following:\n\n\n::: {.cell}\n\n```{.r .cell-code}\ninitial <- read.table(\"datatable.txt\", nrows = 100)\nclasses <- sapply(initial, class)\ntabAll <- read.table(\"datatable.txt\", colClasses = classes)\n```\n:::\n\n\n**Note**: `datatable.txt` is not a real dataset here. It is only used as an example for how to use `read.table()`.\n\n- Set `nrows`. This does not make R run faster but it helps with memory usage. A mild overestimate is okay. You can use the Unix tool `wc` to calculate the number of lines in a file.\n\nIn general, when using R with larger datasets, it's also useful to know a few things about your system.\n\n- How much memory is available on your system?\n- What other applications are in use? Can you close any of them?\n- Are there other users logged into the same system?\n- What operating system ar you using? Some operating systems can limit the amount of memory a single process can access\n\n
\n\n# Calculating Memory Requirements for R Objects\n\nBecause **R stores all of its objects in physical memory**, it is important to be cognizant of how much memory is being used up by all of the data objects residing in your workspace.\n\nOne situation where it is particularly important to understand memory requirements is when you are reading in a new dataset into R. Fortunately, it is easy to make a back of the envelope calculation of how much memory will be required by a new dataset.\n\nFor example, suppose I have a data frame with 1,500,000 rows and 120 columns, all of which are numeric data. Roughly, how much memory is required to store this data frame?\n\nWell, on most modern computers [double precision floating point numbers](http://en.wikipedia.org/wiki/Double-precision_floating-point_format) are stored using 64 bits of memory, or 8 bytes. Given that information, you can do the following calculation\n\n1,500,000 × 120 × 8 bytes/numeric = 1,440,000,000 bytes\n\n= 1,440,000,000 / 2^20^ bytes/MB\n\n= 1,373.29 MB\n\n= 1.34 GB\n\nSo the dataset would require about 1.34 GB of RAM. Most computers these days have at least that much RAM. However, you need to be aware of\n\n- what other programs might be running on your computer, using up RAM\n- what other R objects might already be taking up RAM in your workspace\n\nReading in a large dataset for which you do not have enough RAM is one easy way to freeze up your computer (or at least your R session). This is usually an unpleasant experience that usually requires you to kill the R process, in the best case scenario, or reboot your computer, in the worst case. So make sure to do a rough calculation of memory requirements before reading in a large dataset. You'll thank me later.\n\n# Using the `readr` package\n\nThe `readr` package was developed by Posit (formerly known as RStudio) to deal with reading in large flat files quickly.\n\nThe package provides replacements for functions like `read.table()` and `read.csv()`. The analogous functions in `readr` are `read_table()` and `read_csv()`. These **functions are often much faster than their base R analogues** and provide a few other nice features such as progress meters.\n\nFor example, the package includes a variety of functions in the `read_*()` family that allow you to read in data from different formats of flat files. The following table gives a guide to several functions in the `read_*()` family.\n\n\n::: {.cell}\n::: {.cell-output-display}\n|`readr` function |Use |\n|:----------------|:--------------------------------------------|\n|`read_csv()` |Reads comma-separated file |\n|`read_csv2()` |Reads semicolon-separated file |\n|`read_tsv()` |Reads tab-separated file |\n|`read_delim()` |General function for reading delimited files |\n|`read_fwf()` |Reads fixed width files |\n|`read_log()` |Reads log files |\n:::\n:::\n\n\n::: callout-tip\n### Note\n\nIn this code, I used the `kable()` function from the `knitr` package to create the summary table in a table format, rather than as basic R output.\n\nThis function is very useful **for formatting basic tables in R markdown documents**. For more complex tables, check out the `pander` and `xtable` packages.\n:::\n\nFor the most part, you can read use `read_table()` and `read_csv()` pretty much anywhere you might use `read.table()` and `read.csv()`.\n\nIn addition, if there are non-fatal problems that occur while reading in the data, you will **get a warning and the returned data frame will have some information about which rows/observations triggered the warning**.\n\nThis can be very helpful for \"debugging\" problems with your data before you get neck deep in data analysis.\n\n## Advantages\n\nThe advantage of the `read_csv()` function is perhaps better understood from an historical perspective.\n\n- R's built in `read.csv()` function similarly reads CSV files, but the `read_csv()` function in `readr` builds on that by **removing some of the quirks and \"gotchas\"** of `read.csv()` as well as **dramatically optimizing the speed** with which it can read data into R.\n- The `read_csv()` function also adds some nice user-oriented features like a progress meter and a compact method for specifying column types.\n\n## Example\n\nA typical call to `read_csv()` will look as follows.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(readr)\nteams <- read_csv(here(\"data\", \"team_standings.csv\"))\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nRows: 32 Columns: 2\n── Column specification ────────────────────────────────────────────────────────\nDelimiter: \",\"\nchr (1): Team\ndbl (1): Standing\n\nℹ Use `spec()` to retrieve the full column specification for this data.\nℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.\n```\n:::\n\n```{.r .cell-code}\nteams\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 32 × 2\n Standing Team \n \n 1 1 Spain \n 2 2 Netherlands\n 3 3 Germany \n 4 4 Uruguay \n 5 5 Argentina \n 6 6 Brazil \n 7 7 Ghana \n 8 8 Paraguay \n 9 9 Japan \n10 10 Chile \n# ℹ 22 more rows\n```\n:::\n:::\n\n\nBy default, `read_csv()` will open a CSV file and read it in line-by-line. Similar to `read.table()`, you can tell the function to `skip` lines or which lines are comments:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nread_csv(\"The first line of metadata\n The second line of metadata\n x,y,z\n 1,2,3\",\n skip = 2\n)\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nRows: 1 Columns: 3\n── Column specification ────────────────────────────────────────────────────────\nDelimiter: \",\"\ndbl (3): x, y, z\n\nℹ Use `spec()` to retrieve the full column specification for this data.\nℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.\n```\n:::\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 1 × 3\n x y z\n \n1 1 2 3\n```\n:::\n:::\n\n\nAlternatively, you can use the `comment` argument:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nread_csv(\"# A comment I want to skip\n x,y,z\n 1,2,3\",\n comment = \"#\"\n)\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nRows: 1 Columns: 3\n── Column specification ────────────────────────────────────────────────────────\nDelimiter: \",\"\ndbl (3): x, y, z\n\nℹ Use `spec()` to retrieve the full column specification for this data.\nℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.\n```\n:::\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 1 × 3\n x y z\n \n1 1 2 3\n```\n:::\n:::\n\n\nIt will also (**by default**), **read in the first few rows of the table** in order to figure out the type of each column (i.e. integer, character, etc.). From the `read_csv()` help page:\n\n> If 'NULL', all column types will be imputed from the first 1000 rows on the input. This is convenient (and fast), but not robust. If the imputation fails, you'll need to supply the correct types yourself.\n\nYou can specify the type of each column with the `col_types` argument.\n\n::: callout-tip\n### Note\n\nIn general, it is a good idea to **specify the column types explicitly**.\n\nThis rules out any possible guessing errors on the part of `read_csv()`.\n\nAlso, specifying the column types explicitly provides a useful safety check in case anything about the dataset should change without you knowing about it.\n:::\n\nHere is an example of how to specify the column types explicitly:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nteams <- read_csv(here(\"data\", \"team_standings.csv\"),\n col_types = \"cc\"\n)\n```\n:::\n\n\nNote that the `col_types` argument accepts a compact representation. Here `\"cc\"` indicates that the first column is `character` and the second column is `character` (there are only two columns). Using the `col_types` argument is useful because often it is not easy to automatically figure out the type of a column by looking at a few rows (especially if a column has many missing values).\n\n::: callout-tip\n### Note\n\nThe `read_csv()` function **will also read compressed files** automatically.\n\nThere is no need to decompress the file first or use the `gzfile` connection function.\n:::\n\nThe following call reads a gzip-compressed CSV file containing download logs from the RStudio CRAN mirror.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlogs <- read_csv(here(\"data\", \"2016-07-19.csv.bz2\"),\n n_max = 10\n)\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nRows: 10 Columns: 10\n── Column specification ────────────────────────────────────────────────────────\nDelimiter: \",\"\nchr (6): r_version, r_arch, r_os, package, version, country\ndbl (2): size, ip_id\ndate (1): date\ntime (1): time\n\nℹ Use `spec()` to retrieve the full column specification for this data.\nℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.\n```\n:::\n:::\n\n\nNote that the warnings indicate that `read_csv()` may have had some difficulty identifying the type of each column. This can be solved by using the `col_types` argument.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlogs <- read_csv(here(\"data\", \"2016-07-19.csv.bz2\"),\n col_types = \"ccicccccci\",\n n_max = 10\n)\nlogs\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 10 × 10\n date time size r_version r_arch r_os package version country ip_id\n \n 1 2016-07-19 22:00… 1.89e6 3.3.0 x86_64 ming… data.t… 1.9.6 US 1\n 2 2016-07-19 22:00… 4.54e4 3.3.1 x86_64 ming… assert… 0.1 US 2\n 3 2016-07-19 22:00… 1.43e7 3.3.1 x86_64 ming… stringi 1.1.1 DE 3\n 4 2016-07-19 22:00… 1.89e6 3.3.1 x86_64 ming… data.t… 1.9.6 US 4\n 5 2016-07-19 22:00… 3.90e5 3.3.1 x86_64 ming… foreach 1.4.3 US 4\n 6 2016-07-19 22:00… 4.88e4 3.3.1 x86_64 linu… tree 1.0-37 CO 5\n 7 2016-07-19 22:00… 5.25e2 3.3.1 x86_64 darw… surviv… 2.39-5 US 6\n 8 2016-07-19 22:00… 3.23e6 3.3.1 x86_64 ming… Rcpp 0.12.5 US 2\n 9 2016-07-19 22:00… 5.56e5 3.3.1 x86_64 ming… tibble 1.1 US 2\n10 2016-07-19 22:00… 1.52e5 3.3.1 x86_64 ming… magrit… 1.5 US 2\n```\n:::\n:::\n\n\nYou can **specify the column type in a more detailed fashion** by using the various `col_*()` functions.\n\nFor example, in the log data above, the first column is actually a date, so it might make more sense to read it in as a `Date` object.\n\nIf we wanted to just read in that first column, we could do\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlogdates <- read_csv(here(\"data\", \"2016-07-19.csv.bz2\"),\n col_types = cols_only(date = col_date()),\n n_max = 10\n)\nlogdates\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 10 × 1\n date \n \n 1 2016-07-19\n 2 2016-07-19\n 3 2016-07-19\n 4 2016-07-19\n 5 2016-07-19\n 6 2016-07-19\n 7 2016-07-19\n 8 2016-07-19\n 9 2016-07-19\n10 2016-07-19\n```\n:::\n:::\n\n\nNow the `date` column is stored as a `Date` object which can be used for relevant date-related computations (for example, see the `lubridate` package).\n\n::: callout-tip\n### Note\n\nThe `read_csv()` function has a `progress` option that defaults to TRUE.\n\nThis options provides a nice progress meter while the CSV file is being read.\n\nHowever, if you are using `read_csv()` in a function, or perhaps embedding it in a loop, it is probably best to set `progress = FALSE`.\n:::\n\n# Post-lecture materials\n\n### Final Questions\n\nHere are some post-lecture questions to help you think about the material discussed.\n\n::: callout-note\n### Questions\n\n1. What is the point of reference for using relative paths with the `here::here()` function?\n\n2. Why was the argument `stringsAsFactors=TRUE` historically used?\n\n3. What is the difference between `.Rds` and `.Rda` file formats?\n\n4. What function in `readr` would you use to read a file where fields were separated with \"\\|\"?\n:::\n\n### Additional Resources\n\n::: callout-tip\n- \n- \n- \n:::\n\n# R session information\n\n\n::: {.cell}\n\n```{.r .cell-code}\noptions(width = 120)\nsessioninfo::session_info()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────\n setting value\n version R version 4.3.1 (2023-06-16)\n os macOS Ventura 13.5\n system aarch64, darwin20\n ui X11\n language (EN)\n collate en_US.UTF-8\n ctype en_US.UTF-8\n tz America/New_York\n date 2023-08-17\n pandoc 3.1.5 @ /opt/homebrew/bin/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────\n package * version date (UTC) lib source\n bit 4.0.5 2022-11-15 [1] CRAN (R 4.3.0)\n bit64 4.0.5 2020-08-30 [1] CRAN (R 4.3.0)\n cli 3.6.1 2023-03-23 [1] CRAN (R 4.3.0)\n colorout 1.2-2 2023-05-06 [1] Github (jalvesaq/colorout@79931fd)\n crayon 1.5.2 2022-09-29 [1] CRAN (R 4.3.0)\n digest 0.6.33 2023-07-07 [1] CRAN (R 4.3.0)\n evaluate 0.21 2023-05-05 [1] CRAN (R 4.3.0)\n fansi 1.0.4 2023-01-22 [1] CRAN (R 4.3.0)\n fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.3.0)\n glue 1.6.2 2022-02-24 [1] CRAN (R 4.3.0)\n here * 1.0.1 2020-12-13 [1] CRAN (R 4.3.0)\n hms 1.1.3 2023-03-21 [1] CRAN (R 4.3.0)\n htmltools 0.5.6 2023-08-10 [1] CRAN (R 4.3.0)\n htmlwidgets 1.6.2 2023-03-17 [1] CRAN (R 4.3.0)\n jsonlite 1.8.7 2023-06-29 [1] CRAN (R 4.3.0)\n knitr 1.43 2023-05-25 [1] CRAN (R 4.3.0)\n lifecycle 1.0.3 2022-10-07 [1] CRAN (R 4.3.0)\n magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.3.0)\n pillar 1.9.0 2023-03-22 [1] CRAN (R 4.3.0)\n pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 4.3.0)\n R6 2.5.1 2021-08-19 [1] CRAN (R 4.3.0)\n readr * 2.1.4 2023-02-10 [1] CRAN (R 4.3.0)\n rlang 1.1.1 2023-04-28 [1] CRAN (R 4.3.0)\n rmarkdown 2.24 2023-08-14 [1] CRAN (R 4.3.1)\n rprojroot 2.0.3 2022-04-02 [1] CRAN (R 4.3.0)\n rstudioapi 0.15.0 2023-07-07 [1] CRAN (R 4.3.0)\n sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.3.0)\n tibble 3.2.1 2023-03-20 [1] CRAN (R 4.3.0)\n tidyselect 1.2.0 2022-10-10 [1] CRAN (R 4.3.0)\n tzdb 0.4.0 2023-05-12 [1] CRAN (R 4.3.0)\n utf8 1.2.3 2023-01-31 [1] CRAN (R 4.3.0)\n vctrs 0.6.3 2023-06-14 [1] CRAN (R 4.3.0)\n vroom 1.6.3 2023-04-28 [1] CRAN (R 4.3.0)\n withr 2.5.0 2022-03-03 [1] CRAN (R 4.3.0)\n xfun 0.40 2023-08-09 [1] CRAN (R 4.3.0)\n yaml 2.3.7 2023-01-23 [1] CRAN (R 4.3.0)\n\n [1] /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library\n\n──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n```\n:::\n:::\n", "supporting": [], "filters": [ "rmarkdown/pagebreak.lua" diff --git a/_freeze/posts/08-managing-data-frames-with-tidyverse/index/execute-results/html.json b/_freeze/posts/08-managing-data-frames-with-tidyverse/index/execute-results/html.json index fda21c2..9d27133 100644 --- a/_freeze/posts/08-managing-data-frames-with-tidyverse/index/execute-results/html.json +++ b/_freeze/posts/08-managing-data-frames-with-tidyverse/index/execute-results/html.json @@ -1,7 +1,7 @@ { - "hash": "692ae9c13383582e0de2ed88c813e47b", + "hash": "14e8698f5056b6c674e42b8c203edc6c", "result": { - "markdown": "---\ntitle: \"08 - Managing data frames with the Tidyverse\"\nauthor:\n - name: Leonardo Collado Torres\n url: http://lcolladotor.github.io/\n affiliations:\n - id: libd\n name: Lieber Institute for Brain Development\n url: https://libd.org/\n - id: jhsph\n name: Johns Hopkins Bloomberg School of Public Health Department of Biostatistics\n url: https://publichealth.jhu.edu/departments/biostatistics\ndescription: \" An introduction to data frames in R and the managing them with the dplyr R package\"\ncategories: [module 2, week 2, R, programming, dplyr, here, tibble, tidyverse]\n---\n\n\n*This lecture, as the rest of the course, is adapted from the version [Stephanie C. Hicks](https://www.stephaniehicks.com/) designed and maintained in 2021 and 2022. Check the recent changes to this file through the [GitHub history](https://github.com/lcolladotor/jhustatcomputing2023/commits/main/posts/08-managing-data-frames-with-tidyverse/index.qmd).*\n\n\n\n# Pre-lecture materials\n\n### Read ahead\n\n::: callout-note\n## Read ahead\n\n**Before class, you can prepare by reading the following materials:**\n\n1. \n2. \n3. [dplyr cheat sheet from RStudio](http://www.rstudio.com/wp-content/uploads/2015/02/data-wrangling-cheatsheet.pdf)\n:::\n\n### Acknowledgements\n\nMaterial for this lecture was borrowed and adopted from\n\n- \n- \n\n# Learning objectives\n\n::: callout-note\n# Learning objectives\n\n**At the end of this lesson you will:**\n\n- Understand the advantages of a `tibble` and `data.frame` data objects in R\n- Learn about the dplyr R package to manage data frames\n- Recognize the key verbs to manage data frames in dplyr\n- Use the \"pipe\" operator to combine verbs together\n:::\n\n# Data Frames\n\nThe **data frame** (or `data.frame`) is a **key data structure** in statistics and in R.\n\nThe basic structure of a data frame is that there is **one observation per row and each column represents a variable, a measure, feature, or characteristic of that observation**.\n\nR has an internal implementation of data frames that is likely the one you will use most often. However, there are packages on CRAN that implement data frames via things like relational databases that allow you to operate on very, very large data frames (but we will not discuss them here).\n\nGiven the importance of managing data frames, it is **important that we have good tools for dealing with them.**\n\nFor example, **operations** like filtering rows, re-ordering rows, and selecting columns, can often be tedious operations in R whose syntax is not very intuitive. The `dplyr` package is designed to mitigate a lot of these problems and to provide a highly optimized set of routines specifically for dealing with data frames.\n\n## Tibbles\n\nAnother type of data structure that we need to discuss is called the **tibble**! It's best to think of tibbles as an updated and stylish version of the `data.frame`.\n\nTibbles are what tidyverse packages work with most seamlessly. Now, that **does not mean tidyverse packages *require* tibbles**.\n\nIn fact, they still work with `data.frames`, but the more you work with tidyverse and tidyverse-adjacent packages, the more you will see the advantages of using tibbles.\n\nBefore we go any further, tibbles *are* data frames, but they have some new bells and whistles to make your life easier.\n\n### How tibbles differ from `data.frame`\n\nThere are a number of differences between tibbles and `data.frames`.\n\n::: callout-tip\n### Note\n\nTo see a full vignette about tibbles and how they differ from data.frame, you will want to execute `vignette(\"tibble\")` and read through that vignette.\n:::\n\nWe will summarize some of the most important points here:\n\n- **Input type remains unchanged** - `data.frame` is notorious for treating strings as factors; this will not happen with tibbles\n- **Variable names remain unchanged** - In base R, creating `data.frames` will remove spaces from names, converting them to periods or add \"x\" before numeric column names. Creating tibbles will not change variable (column) names.\n- **There are no `row.names()` for a tibble** - Tidy data requires that variables be stored in a consistent way, removing the need for row names.\n- **Tibbles print first ten rows and columns that fit on one screen** - Printing a tibble to screen will never print the entire huge data frame out. By default, it just shows what fits to your screen.\n\n## Creating a tibble\n\nThe tibble package is part of the `tidyverse` and can thus be loaded in (once installed) using:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(tidyverse)\n```\n:::\n\n\n### `as_tibble()`\n\nSince many packages use the historical `data.frame` from base R, you will often find yourself in the situation that you have a `data.frame` and want to convert that `data.frame` to a `tibbl`e.\n\nTo do so, the `as_tibble()` function is exactly what you are looking for.\n\nFor the example, here we use a dataset (`chicago.rds`) containing air pollution and temperature data for the city of Chicago in the U.S.\n\nThe dataset is available in the `/data` repository. You can load the data into R using the `readRDS()` function.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(here)\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nhere() starts at /Users/leocollado/Dropbox/Code/jhustatcomputing2023\n```\n:::\n\n```{.r .cell-code}\nchicago <- readRDS(here(\"data\", \"chicago.rds\"))\n```\n:::\n\n\nYou can see some basic characteristics of the dataset with the `dim()` and `str()` functions.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ndim(chicago)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 6940 8\n```\n:::\n\n```{.r .cell-code}\nstr(chicago)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'data.frame':\t6940 obs. of 8 variables:\n $ city : chr \"chic\" \"chic\" \"chic\" \"chic\" ...\n $ tmpd : num 31.5 33 33 29 32 40 34.5 29 26.5 32.5 ...\n $ dptp : num 31.5 29.9 27.4 28.6 28.9 ...\n $ date : Date, format: \"1987-01-01\" \"1987-01-02\" ...\n $ pm25tmean2: num NA NA NA NA NA NA NA NA NA NA ...\n $ pm10tmean2: num 34 NA 34.2 47 NA ...\n $ o3tmean2 : num 4.25 3.3 3.33 4.38 4.75 ...\n $ no2tmean2 : num 20 23.2 23.8 30.4 30.3 ...\n```\n:::\n:::\n\n\nWe see this data structure is a `data.frame` with 6940 observations and 8 variables.\n\nTo convert this `data.frame` to a tibble you would use the following:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nstr(as_tibble(chicago))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\ntibble [6,940 × 8] (S3: tbl_df/tbl/data.frame)\n $ city : chr [1:6940] \"chic\" \"chic\" \"chic\" \"chic\" ...\n $ tmpd : num [1:6940] 31.5 33 33 29 32 40 34.5 29 26.5 32.5 ...\n $ dptp : num [1:6940] 31.5 29.9 27.4 28.6 28.9 ...\n $ date : Date[1:6940], format: \"1987-01-01\" \"1987-01-02\" ...\n $ pm25tmean2: num [1:6940] NA NA NA NA NA NA NA NA NA NA ...\n $ pm10tmean2: num [1:6940] 34 NA 34.2 47 NA ...\n $ o3tmean2 : num [1:6940] 4.25 3.3 3.33 4.38 4.75 ...\n $ no2tmean2 : num [1:6940] 20 23.2 23.8 30.4 30.3 ...\n```\n:::\n:::\n\n\n::: callout-tip\n### Note\n\nTibbles, by default, **only print the first ten rows to screen**.\n\nIf you were to print the `data.frame` `chicago` to screen, all 6940 rows would be displayed. When working with large `data.frames`, this **default behavior can be incredibly frustrating**.\n\nUsing tibbles removes this frustration because of the default settings for tibble printing.\n:::\n\nAdditionally, you will note that the **type of the variable is printed for each variable in the tibble**. This helpful feature is another added bonus of tibbles relative to `data.frame`.\n\n#### Want to see more of the tibble?\n\nIf you *do* want to see more rows from the tibble, there are a few options!\n\n1. The `View()` function in RStudio is incredibly helpful. The input to this function is the `data.frame` or tibble you would like to see.\n\nSpecifically, `View(chicago)` would provide you, the viewer, with a scrollable view (in a new tab) of the complete dataset.\n\n2. Use the fact that `print()` enables you to specify how many rows and columns you would like to display.\n\nHere, we again display the `chicago` data.frame as a tibble but specify that we would only like to see 5 rows. The `width = Inf` argument specifies that we would like to see all the possible columns. Here, there are only 8, but for larger datasets, this can be helpful to specify.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nas_tibble(chicago) %>% \n print(n = 5, width = Inf)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 6,940 × 8\n city tmpd dptp date pm25tmean2 pm10tmean2 o3tmean2 no2tmean2\n \n1 chic 31.5 31.5 1987-01-01 NA 34 4.25 20.0\n2 chic 33 29.9 1987-01-02 NA NA 3.30 23.2\n3 chic 33 27.4 1987-01-03 NA 34.2 3.33 23.8\n4 chic 29 28.6 1987-01-04 NA 47 4.38 30.4\n5 chic 32 28.9 1987-01-05 NA NA 4.75 30.3\n# ℹ 6,935 more rows\n```\n:::\n:::\n\n\n### `tibble()`\n\nAlternatively, you can **create a tibble on the fly** by using `tibble()` and specifying the information you would like stored in each column.\n\n::: callout-tip\n### Note\n\nIf you provide a single value, this value will be repeated across all rows of the tibble. This is referred to as \"recycling inputs of length 1.\"\n\nIn the example here, we see that the column `c` will contain the value '1' across all rows.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ntibble(\n a = 1:5,\n b = 6:10,\n c = 1,\n z = (a + b)^2 + c\n)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 5 × 4\n a b c z\n \n1 1 6 1 50\n2 2 7 1 82\n3 3 8 1 122\n4 4 9 1 170\n5 5 10 1 226\n```\n:::\n:::\n\n:::\n\nThe `tibble()` function allows you to quickly generate tibbles and even allows you to **reference columns within the tibble you are creating**, as seen in column z of the example above.\n\n::: callout-tip\n### Note\n\n**Tibbles can have column names that are not allowed** in `data.frame`.\n\nIn the example below, we see that to utilize a nontraditional variable name, you surround the column name with backticks.\n\nNote that to refer to such columns in other tidyverse packages, you willl continue to use backticks surrounding the variable name.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ntibble(\n `two words` = 1:5,\n `12` = \"numeric\",\n `:)` = \"smile\",\n)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 5 × 3\n `two words` `12` `:)` \n \n1 1 numeric smile\n2 2 numeric smile\n3 3 numeric smile\n4 4 numeric smile\n5 5 numeric smile\n```\n:::\n:::\n\n:::\n\n## Subsetting tibbles\n\nSubsetting tibbles also differs slightly from how subsetting occurs with `data.frame`.\n\nWhen it comes to tibbles,\n\n- `[[` can subset by name or position\n- `$` only subsets by name\n\nFor example:\n\n\n::: {.cell}\n\n```{.r .cell-code}\ndf <- tibble(\n a = 1:5,\n b = 6:10,\n c = 1,\n z = (a + b)^2 + c\n)\n\n# Extract by name using $ or [[]]\ndf$z\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 50 82 122 170 226\n```\n:::\n\n```{.r .cell-code}\ndf[[\"z\"]]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 50 82 122 170 226\n```\n:::\n\n```{.r .cell-code}\n# Extract by position requires [[]]\ndf[[4]]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 50 82 122 170 226\n```\n:::\n:::\n\n\nHaving now discussed tibbles, which are the type of object most tidyverse and tidyverse-adjacent packages work best with, we now know the goal.\n\nIn many cases, **tibbles are ultimately what we want to work with in R**.\n\nHowever, **data are stored in many different formats outside of R**. We will spend the rest of this lesson discussing wrangling functions that work either a `data.frame` or `tibble`.\n\n# The `dplyr` Package\n\nThe `dplyr` package was developed by Posit (formely RStudio) and is **an optimized and distilled** version of the older `plyr` **package for data manipulation or wrangling**.\n\n![Artwork by Allison Horst on the dplyr package](https://github.com/allisonhorst/stats-illustrations/raw/main/rstats-artwork/dplyr_wrangling.png){width=\"80%\"}\n\n\\[**Source**: [Artwork by Allison Horst](https://github.com/allisonhorst/stats-illustrations)\\]\n\nThe `dplyr` package does not provide any \"new\" functionality to R per se, in the sense that everything `dplyr` does could already be done with base R, but it **greatly** simplifies existing functionality in R.\n\nOne important contribution of the `dplyr` package is that it **provides a \"grammar\" (in particular, verbs) for data manipulation and for operating on data frames**.\n\nWith this grammar, you can sensibly communicate what it is that you are doing to a data frame that other people can understand (assuming they also know the grammar). This is useful because it **provides an abstraction for data manipulation that previously did not exist**.\n\nAnother useful contribution is that the `dplyr` functions are **very** fast, as many key operations are coded in C++.\n\n### `dplyr` grammar\n\nSome of the key \"verbs\" provided by the `dplyr` package are\n\n- `select()`: return a subset of the columns of a data frame, using a flexible notation\n\n- `filter()`: extract a subset of rows from a data frame based on logical conditions\n\n- `arrange()`: reorder rows of a data frame\n\n- `rename()`: rename variables in a data frame\n\n- `mutate()`: add new variables/columns or transform existing variables\n\n- `summarise()` / `summarize()`: generate summary statistics of different variables in the data frame, possibly within strata\n\n- `%>%`: the \"pipe\" operator is used to connect multiple verb actions together into a pipeline\n\n::: callout-tip\n### Note\n\nThe `dplyr` package as a number of its own data types that it takes advantage of.\n\nFor example, there is a handy `print()` method that prevents you from printing a lot of data to the console. Most of the time, these additional data types are transparent to the user and do not need to be worried about.\n:::\n\n### `dplyr` functions\n\nAll of the functions that we will discuss here will have a few common characteristics. In particular,\n\n1. The **first argument** is a data frame type object.\n\n2. The **subsequent arguments** describe what to do with the data frame specified in the first argument, and you can refer to columns in the data frame directly (without using the `$` operator, just use the column names).\n\n3. The **return result** of a function is a new data frame.\n\n4. Data frames must be **properly formatted** and annotated for this to all be useful. In particular, the data must be [tidy](http://www.jstatsoft.org/v59/i10/paper). In short, there should be one observation per row, and each column should represent a feature or characteristic of that observation.\n\n![Artwork by Allison Horst on tidy data](https://github.com/allisonhorst/stats-illustrations/raw/main/rstats-artwork/tidydata_1.jpg){width=\"80%\"}\n\n\\[**Source**: [Artwork by Allison Horst](https://github.com/allisonhorst/stats-illustrations)\\]\n\n### `dplyr` installation\n\nThe `dplyr` package can be installed from CRAN or from GitHub using the `devtools` package and the `install_github()` function. The GitHub repository will usually contain the latest updates to the package and the development version.\n\nTo install from CRAN, just run\n\n\n::: {.cell}\n\n```{.r .cell-code}\ninstall.packages(\"dplyr\")\n```\n:::\n\n\nThe `dplyr` package is also installed when you install the `tidyverse` meta-package.\n\nAfter installing the package it is important that you load it into your R session with the `library()` function.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(dplyr)\n```\n:::\n\n\nYou may get some warnings when the package is loaded because there are functions in the `dplyr` package that have the same name as functions in other packages. For now you can ignore the warnings.\n\n### `select()`\n\nWe will continue to use the `chicago` dataset containing air pollution and temperature data.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nchicago <- as_tibble(chicago)\nstr(chicago)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\ntibble [6,940 × 8] (S3: tbl_df/tbl/data.frame)\n $ city : chr [1:6940] \"chic\" \"chic\" \"chic\" \"chic\" ...\n $ tmpd : num [1:6940] 31.5 33 33 29 32 40 34.5 29 26.5 32.5 ...\n $ dptp : num [1:6940] 31.5 29.9 27.4 28.6 28.9 ...\n $ date : Date[1:6940], format: \"1987-01-01\" \"1987-01-02\" ...\n $ pm25tmean2: num [1:6940] NA NA NA NA NA NA NA NA NA NA ...\n $ pm10tmean2: num [1:6940] 34 NA 34.2 47 NA ...\n $ o3tmean2 : num [1:6940] 4.25 3.3 3.33 4.38 4.75 ...\n $ no2tmean2 : num [1:6940] 20 23.2 23.8 30.4 30.3 ...\n```\n:::\n:::\n\n\nThe `select()` function can be used to **select columns of a data frame** that you want to focus on.\n\n::: callout-tip\n### Example\n\nSuppose we wanted to take the first 3 columns only. There are a few ways to do this.\n\nWe could for example use numerical indices:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nnames(chicago)[1:3]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"city\" \"tmpd\" \"dptp\"\n```\n:::\n:::\n\n\nBut we can also use the names directly:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsubset <- select(chicago, city:dptp)\nhead(subset)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 6 × 3\n city tmpd dptp\n \n1 chic 31.5 31.5\n2 chic 33 29.9\n3 chic 33 27.4\n4 chic 29 28.6\n5 chic 32 28.9\n6 chic 40 35.1\n```\n:::\n:::\n\n:::\n\n::: callout-tip\n### Note\n\nThe `:` normally cannot be used with names or strings, but inside the `select()` function you can use it to specify a range of variable names.\n:::\n\nYou can also **omit** variables using the `select()` function by using the negative sign. With `select()` you can do\n\n\n::: {.cell}\n\n```{.r .cell-code}\nselect(chicago, -(city:dptp))\n```\n:::\n\n\nwhich indicates that we should include every variable *except* the variables `city` through `dptp`. The equivalent code in base R would be\n\n\n::: {.cell}\n\n```{.r .cell-code}\ni <- match(\"city\", names(chicago))\nj <- match(\"dptp\", names(chicago))\nhead(chicago[, -(i:j)])\n```\n:::\n\n\nNot super intuitive, right?\n\nThe `select()` function also allows a special syntax that allows you to specify variable names based on patterns. So, for example, if you wanted to keep every variable that ends with a \"2\", we could do\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsubset <- select(chicago, ends_with(\"2\"))\nstr(subset)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\ntibble [6,940 × 4] (S3: tbl_df/tbl/data.frame)\n $ pm25tmean2: num [1:6940] NA NA NA NA NA NA NA NA NA NA ...\n $ pm10tmean2: num [1:6940] 34 NA 34.2 47 NA ...\n $ o3tmean2 : num [1:6940] 4.25 3.3 3.33 4.38 4.75 ...\n $ no2tmean2 : num [1:6940] 20 23.2 23.8 30.4 30.3 ...\n```\n:::\n:::\n\n\nOr if we wanted to keep every variable that starts with a \"d\", we could do\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsubset <- select(chicago, starts_with(\"d\"))\nstr(subset)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\ntibble [6,940 × 2] (S3: tbl_df/tbl/data.frame)\n $ dptp: num [1:6940] 31.5 29.9 27.4 28.6 28.9 ...\n $ date: Date[1:6940], format: \"1987-01-01\" \"1987-01-02\" ...\n```\n:::\n:::\n\n\nYou can also use more general regular expressions if necessary. See the help page (`?select`) for more details.\n\n### `filter()`\n\nThe `filter()` function is used to **extract subsets of rows** from a data frame. This function is similar to the existing `subset()` function in R but is quite a bit faster in my experience.\n\n![Artwork by Allison Horst on filter() function](https://github.com/allisonhorst/stats-illustrations/raw/main/rstats-artwork/dplyr_filter.jpg){width=\"80%\"}\n\n\\[**Source**: [Artwork by Allison Horst](https://github.com/allisonhorst/stats-illustrations)\\]\n\n::: callout-tip\n### Example\n\nSuppose we wanted to extract the rows of the `chicago` data frame where the levels of PM2.5 are greater than 30 (which is a reasonably high level), we could do\n\n\n::: {.cell}\n\n```{.r .cell-code}\nchic.f <- filter(chicago, pm25tmean2 > 30)\nstr(chic.f)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\ntibble [194 × 8] (S3: tbl_df/tbl/data.frame)\n $ city : chr [1:194] \"chic\" \"chic\" \"chic\" \"chic\" ...\n $ tmpd : num [1:194] 23 28 55 59 57 57 75 61 73 78 ...\n $ dptp : num [1:194] 21.9 25.8 51.3 53.7 52 56 65.8 59 60.3 67.1 ...\n $ date : Date[1:194], format: \"1998-01-17\" \"1998-01-23\" ...\n $ pm25tmean2: num [1:194] 38.1 34 39.4 35.4 33.3 ...\n $ pm10tmean2: num [1:194] 32.5 38.7 34 28.5 35 ...\n $ o3tmean2 : num [1:194] 3.18 1.75 10.79 14.3 20.66 ...\n $ no2tmean2 : num [1:194] 25.3 29.4 25.3 31.4 26.8 ...\n```\n:::\n:::\n\n:::\n\nYou can see that there are now only 194 rows in the data frame and the distribution of the `pm25tmean2` values is.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsummary(chic.f$pm25tmean2)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n Min. 1st Qu. Median Mean 3rd Qu. Max. \n 30.05 32.12 35.04 36.63 39.53 61.50 \n```\n:::\n:::\n\n\nWe can place an arbitrarily complex logical sequence inside of `filter()`, so we could for example extract the rows where PM2.5 is greater than 30 *and* temperature is greater than 80 degrees Fahrenheit.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nchic.f <- filter(chicago, pm25tmean2 > 30 & tmpd > 80)\nselect(chic.f, date, tmpd, pm25tmean2)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 17 × 3\n date tmpd pm25tmean2\n \n 1 1998-08-23 81 39.6\n 2 1998-09-06 81 31.5\n 3 2001-07-20 82 32.3\n 4 2001-08-01 84 43.7\n 5 2001-08-08 85 38.8\n 6 2001-08-09 84 38.2\n 7 2002-06-20 82 33 \n 8 2002-06-23 82 42.5\n 9 2002-07-08 81 33.1\n10 2002-07-18 82 38.8\n11 2003-06-25 82 33.9\n12 2003-07-04 84 32.9\n13 2005-06-24 86 31.9\n14 2005-06-27 82 51.5\n15 2005-06-28 85 31.2\n16 2005-07-17 84 32.7\n17 2005-08-03 84 37.9\n```\n:::\n:::\n\n\nNow there are only 17 observations where both of those conditions are met.\n\nOther logical operators you should be aware of include:\n\n| Operator | Meaning | Example |\n|----------:|-------------------------:|-------------------------------:|\n| `==` | Equals | `city == chic` |\n| `!=` | Does not equal | `city != chic` |\n| `>` | Greater than | `tmpd > 32.0` |\n| `>=` | Greater than or equal to | `tmpd >- 32.0` |\n| `<` | Less than | `tmpd < 32.0` |\n| `<=` | Less than or equal to | `tmpd <= 32.0` |\n| `%in%` | Included in | `city %in% c(\"chic\", \"bmore\")` |\n| `is.na()` | Is a missing value | `is.na(pm10tmean2)` |\n\n::: callout-tip\n### Note\n\nIf you are ever unsure of how to write a logical statement, but know how to write its opposite, you can use the `!` operator to negate the whole statement.\n\nA common use of this is to identify observations with non-missing data (e.g., `!(is.na(pm10tmean2))`).\n:::\n\n### `arrange()`\n\nThe `arrange()` function is used to **reorder rows** of a data frame according to one of the variables/columns. Reordering rows of a data frame (while preserving corresponding order of other columns) is normally a pain to do in R. The `arrange()` function simplifies the process quite a bit.\n\nHere we can order the rows of the data frame by date, so that the first row is the earliest (oldest) observation and the last row is the latest (most recent) observation.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nchicago <- arrange(chicago, date)\n```\n:::\n\n\nWe can now check the first few rows\n\n\n::: {.cell}\n\n```{.r .cell-code}\nhead(select(chicago, date, pm25tmean2), 3)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 3 × 2\n date pm25tmean2\n \n1 1987-01-01 NA\n2 1987-01-02 NA\n3 1987-01-03 NA\n```\n:::\n:::\n\n\nand the last few rows.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ntail(select(chicago, date, pm25tmean2), 3)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 3 × 2\n date pm25tmean2\n \n1 2005-12-29 7.45\n2 2005-12-30 15.1 \n3 2005-12-31 15 \n```\n:::\n:::\n\n\nColumns can be arranged in descending order too by useing the special `desc()` operator.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nchicago <- arrange(chicago, desc(date))\n```\n:::\n\n\nLooking at the first three and last three rows shows the dates in descending order.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nhead(select(chicago, date, pm25tmean2), 3)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 3 × 2\n date pm25tmean2\n \n1 2005-12-31 15 \n2 2005-12-30 15.1 \n3 2005-12-29 7.45\n```\n:::\n\n```{.r .cell-code}\ntail(select(chicago, date, pm25tmean2), 3)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 3 × 2\n date pm25tmean2\n \n1 1987-01-03 NA\n2 1987-01-02 NA\n3 1987-01-01 NA\n```\n:::\n:::\n\n\n### `rename()`\n\n**Renaming a variable** in a data frame in R is surprisingly hard to do! The `rename()` function is designed to make this process easier.\n\nHere you can see the names of the first five variables in the `chicago` data frame.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nhead(chicago[, 1:5], 3)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 3 × 5\n city tmpd dptp date pm25tmean2\n \n1 chic 35 30.1 2005-12-31 15 \n2 chic 36 31 2005-12-30 15.1 \n3 chic 35 29.4 2005-12-29 7.45\n```\n:::\n:::\n\n\nThe `dptp` column is supposed to represent the dew point temperature and the `pm25tmean2` column provides the PM2.5 data.\n\nHowever, these names are pretty obscure or awkward and probably be renamed to something more sensible.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nchicago <- rename(chicago, dewpoint = dptp, pm25 = pm25tmean2)\nhead(chicago[, 1:5], 3)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 3 × 5\n city tmpd dewpoint date pm25\n \n1 chic 35 30.1 2005-12-31 15 \n2 chic 36 31 2005-12-30 15.1 \n3 chic 35 29.4 2005-12-29 7.45\n```\n:::\n:::\n\n\nThe syntax inside the `rename()` function is to have the new name on the left-hand side of the `=` sign and the old name on the right-hand side.\n\n::: callout-note\n### Question\n\nHow would you do the equivalent in base R without `dplyr`?\n:::\n\n### `mutate()`\n\nThe `mutate()` function exists to **compute transformations of variables** in a data frame. Often, you want to create new variables that are derived from existing variables and `mutate()` provides a clean interface for doing that.\n\n![Artwork by Allison Horst on mutate() function](https://github.com/allisonhorst/stats-illustrations/raw/main/rstats-artwork/dplyr_mutate.png){width=\"80%\"}\n\n\\[**Source**: [Artwork by Allison Horst](https://github.com/allisonhorst/stats-illustrations)\\]\n\nFor example, with air pollution data, we often want to *detrend* the data by subtracting the mean from the data.\n\n- That way we can look at whether a given day's air pollution level is higher than or less than average (as opposed to looking at its absolute level).\n\nHere, we create a `pm25detrend` variable that subtracts the mean from the `pm25` variable.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nchicago <- mutate(chicago, pm25detrend = pm25 - mean(pm25, na.rm = TRUE))\nhead(chicago)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 6 × 9\n city tmpd dewpoint date pm25 pm10tmean2 o3tmean2 no2tmean2\n \n1 chic 35 30.1 2005-12-31 15 23.5 2.53 13.2\n2 chic 36 31 2005-12-30 15.1 19.2 3.03 22.8\n3 chic 35 29.4 2005-12-29 7.45 23.5 6.79 20.0\n4 chic 37 34.5 2005-12-28 17.8 27.5 3.26 19.3\n5 chic 40 33.6 2005-12-27 23.6 27 4.47 23.5\n6 chic 35 29.6 2005-12-26 8.4 8.5 14.0 16.8\n# ℹ 1 more variable: pm25detrend \n```\n:::\n:::\n\n\nThere is also the related `transmute()` function, which does the same thing as `mutate()` but then *drops all non-transformed variables*.\n\nHere, we de-trend the PM10 and ozone (O3) variables.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nhead(transmute(chicago, \n pm10detrend = pm10tmean2 - mean(pm10tmean2, na.rm = TRUE),\n o3detrend = o3tmean2 - mean(o3tmean2, na.rm = TRUE)))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 6 × 2\n pm10detrend o3detrend\n \n1 -10.4 -16.9 \n2 -14.7 -16.4 \n3 -10.4 -12.6 \n4 -6.40 -16.2 \n5 -6.90 -15.0 \n6 -25.4 -5.39\n```\n:::\n:::\n\n\nNote that there are only two columns in the transmuted data frame.\n\n### `group_by()`\n\nThe `group_by()` function is used to **generate summary statistics** from the data frame within strata defined by a variable.\n\nFor example, in this air pollution dataset, you might want to know what the average annual level of PM2.5 is?\n\nSo the stratum is the year, and that is something we can derive from the `date` variable.\n\n**In conjunction** with the `group_by()` function, we often use the `summarize()` function (or `summarise()` for some parts of the world).\n\n::: callout-tip\n### Note\n\nThe **general operation** here is a combination of\n\n1. Splitting a data frame into separate pieces defined by a variable or group of variables (`group_by()`)\n2. Then, applying a summary function across those subsets (`summarize()`)\n:::\n\n::: callout-tip\n### Example\n\nFirst, we can create a `year` variable using `as.POSIXlt()`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nchicago <- mutate(chicago, year = as.POSIXlt(date)$year + 1900)\n```\n:::\n\n\nNow we can create a separate data frame that splits the original data frame by year.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nyears <- group_by(chicago, year)\n```\n:::\n\n\nFinally, we compute summary statistics for each year in the data frame with the `summarize()` function.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsummarize(years, pm25 = mean(pm25, na.rm = TRUE), \n o3 = max(o3tmean2, na.rm = TRUE), \n no2 = median(no2tmean2, na.rm = TRUE))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 19 × 4\n year pm25 o3 no2\n \n 1 1987 NaN 63.0 23.5\n 2 1988 NaN 61.7 24.5\n 3 1989 NaN 59.7 26.1\n 4 1990 NaN 52.2 22.6\n 5 1991 NaN 63.1 21.4\n 6 1992 NaN 50.8 24.8\n 7 1993 NaN 44.3 25.8\n 8 1994 NaN 52.2 28.5\n 9 1995 NaN 66.6 27.3\n10 1996 NaN 58.4 26.4\n11 1997 NaN 56.5 25.5\n12 1998 18.3 50.7 24.6\n13 1999 18.5 57.5 24.7\n14 2000 16.9 55.8 23.5\n15 2001 16.9 51.8 25.1\n16 2002 15.3 54.9 22.7\n17 2003 15.2 56.2 24.6\n18 2004 14.6 44.5 23.4\n19 2005 16.2 58.8 22.6\n```\n:::\n:::\n\n:::\n\n`summarize()` returns a data frame with `year` as the first column, and then the annual summary statistics of `pm25`, `o3`, and `no2`.\n\n::: callout-tip\n### More complicated example\n\nIn a slightly more complicated example, we might want to know what are the average levels of ozone (`o3`) and nitrogen dioxide (`no2`) within quintiles of `pm25`. A slicker way to do this would be through a regression model, but we can actually do this quickly with `group_by()` and `summarize()`.\n\nFirst, we can create a categorical variable of `pm25` divided into quantiles\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqq <- quantile(chicago$pm25, seq(0, 1, 0.2), na.rm = TRUE)\nchicago <- mutate(chicago, pm25.quint = cut(pm25, qq))\n```\n:::\n\n\nNow we can group the data frame by the `pm25.quint` variable.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nquint <- group_by(chicago, pm25.quint)\n```\n:::\n\n\nFinally, we can compute the mean of `o3` and `no2` within quintiles of `pm25`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsummarize(quint, o3 = mean(o3tmean2, na.rm = TRUE), \n no2 = mean(no2tmean2, na.rm = TRUE))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 6 × 3\n pm25.quint o3 no2\n \n1 (1.7,8.7] 21.7 18.0\n2 (8.7,12.4] 20.4 22.1\n3 (12.4,16.7] 20.7 24.4\n4 (16.7,22.6] 19.9 27.3\n5 (22.6,61.5] 20.3 29.6\n6 18.8 25.8\n```\n:::\n:::\n\n:::\n\nFrom the table, it seems there is not a strong relationship between `pm25` and `o3`, but there appears to be a positive correlation between `pm25` and `no2`.\n\nMore sophisticated statistical modeling can help to provide precise answers to these questions, but a simple application of `dplyr` functions can often get you most of the way there.\n\n### `%>%`\n\nThe pipeline operator `%>%` is very handy for **stringing together multiple `dplyr` functions in a sequence of operations**.\n\nNotice above that every time we wanted to apply more than one function, the sequence gets buried in a sequence of nested function calls that is difficult to read, i.e.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nthird(second(first(x)))\n```\n:::\n\n\nThis **nesting is not a natural way** to think about a sequence of operations.\n\nThe `%>%` operator allows you to string operations in a left-to-right fashion, i.e.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nfirst(x) %>% second %>% third\n```\n:::\n\n\n::: callout-tip\n### Example\n\nTake the example that we just did in the last section.\n\nThat can be done with the following sequence in a single R expression.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nchicago %>% \n mutate(year = as.POSIXlt(date)$year + 1900) %>% \n group_by(year) %>% \n summarize(pm25 = mean(pm25, na.rm = TRUE), \n o3 = max(o3tmean2, na.rm = TRUE), \n no2 = median(no2tmean2, na.rm = TRUE))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 19 × 4\n year pm25 o3 no2\n \n 1 1987 NaN 63.0 23.5\n 2 1988 NaN 61.7 24.5\n 3 1989 NaN 59.7 26.1\n 4 1990 NaN 52.2 22.6\n 5 1991 NaN 63.1 21.4\n 6 1992 NaN 50.8 24.8\n 7 1993 NaN 44.3 25.8\n 8 1994 NaN 52.2 28.5\n 9 1995 NaN 66.6 27.3\n10 1996 NaN 58.4 26.4\n11 1997 NaN 56.5 25.5\n12 1998 18.3 50.7 24.6\n13 1999 18.5 57.5 24.7\n14 2000 16.9 55.8 23.5\n15 2001 16.9 51.8 25.1\n16 2002 15.3 54.9 22.7\n17 2003 15.2 56.2 24.6\n18 2004 14.6 44.5 23.4\n19 2005 16.2 58.8 22.6\n```\n:::\n:::\n\n:::\n\nThis way we do not have to create a set of temporary variables along the way or create a massive nested sequence of function calls.\n\n::: callout-tip\n### Note\n\nIn the above code, I pass the `chicago` data frame to the first call to `mutate()`, but then afterwards I do not have to pass the first argument to `group_by()` or `summarize()`.\n\nOnce you travel down the pipeline with `%>%`, the first argument is taken to be the output of the previous element in the pipeline.\n:::\n\nAnother example might be computing the average pollutant level by month. This could be useful to see if there are any seasonal trends in the data.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nmutate(chicago, month = as.POSIXlt(date)$mon + 1) %>% \n group_by(month) %>% \n summarize(pm25 = mean(pm25, na.rm = TRUE), \n o3 = max(o3tmean2, na.rm = TRUE), \n no2 = median(no2tmean2, na.rm = TRUE))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 12 × 4\n month pm25 o3 no2\n \n 1 1 17.8 28.2 25.4\n 2 2 20.4 37.4 26.8\n 3 3 17.4 39.0 26.8\n 4 4 13.9 47.9 25.0\n 5 5 14.1 52.8 24.2\n 6 6 15.9 66.6 25.0\n 7 7 16.6 59.5 22.4\n 8 8 16.9 54.0 23.0\n 9 9 15.9 57.5 24.5\n10 10 14.2 47.1 24.2\n11 11 15.2 29.5 23.6\n12 12 17.5 27.7 24.5\n```\n:::\n:::\n\n\nHere, we can see that `o3` tends to be low in the winter months and high in the summer while `no2` is higher in the winter and lower in the summer.\n\n### `slice_*()`\n\nThe `slice_sample()` function of the `dplyr` package will allow you to see a **sample of random rows** in random order.\n\nThe number of rows to show is specified by the `n` argument.\n\n- This can be useful if you **do not want to print the entire tibble**, but you want to get a greater sense of the values.\n- This is a **good option for data analysis reports**, where printing the entire tibble would not be appropriate if the tibble is quite large.\n\n::: callout-tip\n### Example\n\n\n::: {.cell}\n\n```{.r .cell-code}\nslice_sample(chicago, n = 10)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 10 × 11\n city tmpd dewpoint date pm25 pm10tmean2 o3tmean2 no2tmean2\n \n 1 chic 45 25.7 2002-04-26 9.9 30.2 23.9 26.3\n 2 chic 52.5 41.4 1993-04-23 NA 63.5 24.6 40.1\n 3 chic 13 9.3 2005-01-27 10.8 22 20.7 27.3\n 4 chic 41 43.4 1993-11-12 NA 51.5 10.0 25.3\n 5 chic 52.5 39 1996-05-02 NA 38 22.5 32.1\n 6 chic 65.5 51.8 1990-09-27 NA 45.5 19.6 40.9\n 7 chic 46 31 2000-11-05 12.1 26 14.3 24.7\n 8 chic 86.5 73.4 1990-07-04 NA 60.6 52.2 12.8\n 9 chic 10 7.75 1992-12-24 NA 39 6.82 21.9\n10 chic 33 20 1992-10-19 NA 30 9.30 33.6\n# ℹ 3 more variables: pm25detrend , year , pm25.quint \n```\n:::\n:::\n\n:::\n\nYou can also use `slice_head()` or `slice_tail()` to take a look at the top rows or bottom rows of your tibble. Again the number of rows can be specified with the `n` argument.\n\nThis will show the first 5 rows.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nslice_head(chicago, n = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 5 × 11\n city tmpd dewpoint date pm25 pm10tmean2 o3tmean2 no2tmean2\n \n1 chic 35 30.1 2005-12-31 15 23.5 2.53 13.2\n2 chic 36 31 2005-12-30 15.1 19.2 3.03 22.8\n3 chic 35 29.4 2005-12-29 7.45 23.5 6.79 20.0\n4 chic 37 34.5 2005-12-28 17.8 27.5 3.26 19.3\n5 chic 40 33.6 2005-12-27 23.6 27 4.47 23.5\n# ℹ 3 more variables: pm25detrend , year , pm25.quint \n```\n:::\n:::\n\n\nThis will show the last 5 rows.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nslice_tail(chicago, n = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 5 × 11\n city tmpd dewpoint date pm25 pm10tmean2 o3tmean2 no2tmean2\n \n1 chic 32 28.9 1987-01-05 NA NA 4.75 30.3\n2 chic 29 28.6 1987-01-04 NA 47 4.38 30.4\n3 chic 33 27.4 1987-01-03 NA 34.2 3.33 23.8\n4 chic 33 29.9 1987-01-02 NA NA 3.30 23.2\n5 chic 31.5 31.5 1987-01-01 NA 34 4.25 20.0\n# ℹ 3 more variables: pm25detrend , year , pm25.quint \n```\n:::\n:::\n\n\n# Summary\n\nThe `dplyr` pacfkage provides a concise set of operations for managing data frames. With these functions we can do a number of complex operations in just a few lines of code. In particular, we can often conduct the beginnings of an exploratory analysis with the powerful combination of `group_by()` and `summarize()`.\n\nOnce you learn the `dplyr` grammar there are a few additional benefits\n\n- `dplyr` can work with other data frame \"back ends\" such as SQL databases. There is an SQL interface for relational databases via the DBI package\n\n- `dplyr` can be integrated with the `data.table` package for large fast tables\n\nThe `dplyr` package is handy way to both simplify and speed up your data frame management code. It is rare that you get such a combination at the same time!\n\n# Post-lecture materials\n\n### Final Questions\n\nHere are some post-lecture questions to help you think about the material discussed.\n\n::: callout-note\n### Questions\n\n1. How can you tell if an object is a tibble?\n2. What option controls how many additional column names are printed at the footer of a tibble?\n3. Using the `trees` dataset in base R (this dataset stores the girth, height, and volume for Black Cherry Trees) and using the pipe operator: (i) convert the `data.frame` to a tibble, (ii) filter for rows with a tree height of greater than 70, and (iii) order rows by `Volume` (smallest to largest).\n\n\n::: {.cell}\n\n```{.r .cell-code}\nhead(trees)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n Girth Height Volume\n1 8.3 70 10.3\n2 8.6 65 10.3\n3 8.8 63 10.2\n4 10.5 72 16.4\n5 10.7 81 18.8\n6 10.8 83 19.7\n```\n:::\n:::\n\n:::\n\n### Additional Resources\n\n::: callout-tip\n- \n- \n- [dplyr cheat sheet from RStudio](http://www.rstudio.com/wp-content/uploads/2015/02/data-wrangling-cheatsheet.pdf)\n:::\n\n# R session information\n\n\n::: {.cell}\n\n```{.r .cell-code}\noptions(width = 120)\nsessioninfo::session_info()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────\n setting value\n version R version 4.3.1 (2023-06-16)\n os macOS Ventura 13.5\n system aarch64, darwin20\n ui X11\n language (EN)\n collate en_US.UTF-8\n ctype en_US.UTF-8\n tz America/New_York\n date 2023-08-17\n pandoc 3.1.5 @ /opt/homebrew/bin/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────\n package * version date (UTC) lib source\n cli 3.6.1 2023-03-23 [1] CRAN (R 4.3.0)\n colorout 1.2-2 2023-05-06 [1] Github (jalvesaq/colorout@79931fd)\n colorspace 2.1-0 2023-01-23 [1] CRAN (R 4.3.0)\n digest 0.6.33 2023-07-07 [1] CRAN (R 4.3.0)\n dplyr * 1.1.2 2023-04-20 [1] CRAN (R 4.3.0)\n evaluate 0.21 2023-05-05 [1] CRAN (R 4.3.0)\n fansi 1.0.4 2023-01-22 [1] CRAN (R 4.3.0)\n fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.3.0)\n forcats * 1.0.0 2023-01-29 [1] CRAN (R 4.3.0)\n generics 0.1.3 2022-07-05 [1] CRAN (R 4.3.0)\n ggplot2 * 3.4.3 2023-08-14 [1] CRAN (R 4.3.1)\n glue 1.6.2 2022-02-24 [1] CRAN (R 4.3.0)\n gtable 0.3.3 2023-03-21 [1] CRAN (R 4.3.0)\n here * 1.0.1 2020-12-13 [1] CRAN (R 4.3.0)\n hms 1.1.3 2023-03-21 [1] CRAN (R 4.3.0)\n htmltools 0.5.6 2023-08-10 [1] CRAN (R 4.3.0)\n htmlwidgets 1.6.2 2023-03-17 [1] CRAN (R 4.3.0)\n jsonlite 1.8.7 2023-06-29 [1] CRAN (R 4.3.0)\n knitr 1.43 2023-05-25 [1] CRAN (R 4.3.0)\n lifecycle 1.0.3 2022-10-07 [1] CRAN (R 4.3.0)\n lubridate * 1.9.2 2023-02-10 [1] CRAN (R 4.3.0)\n magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.3.0)\n munsell 0.5.0 2018-06-12 [1] CRAN (R 4.3.0)\n pillar 1.9.0 2023-03-22 [1] CRAN (R 4.3.0)\n pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 4.3.0)\n purrr * 1.0.2 2023-08-10 [1] CRAN (R 4.3.0)\n R6 2.5.1 2021-08-19 [1] CRAN (R 4.3.0)\n readr * 2.1.4 2023-02-10 [1] CRAN (R 4.3.0)\n rlang 1.1.1 2023-04-28 [1] CRAN (R 4.3.0)\n rmarkdown 2.24 2023-08-14 [1] CRAN (R 4.3.1)\n rprojroot 2.0.3 2022-04-02 [1] CRAN (R 4.3.0)\n rstudioapi 0.15.0 2023-07-07 [1] CRAN (R 4.3.0)\n scales 1.2.1 2022-08-20 [1] CRAN (R 4.3.0)\n sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.3.0)\n stringi 1.7.12 2023-01-11 [1] CRAN (R 4.3.0)\n stringr * 1.5.0 2022-12-02 [1] CRAN (R 4.3.0)\n tibble * 3.2.1 2023-03-20 [1] CRAN (R 4.3.0)\n tidyr * 1.3.0 2023-01-24 [1] CRAN (R 4.3.0)\n tidyselect 1.2.0 2022-10-10 [1] CRAN (R 4.3.0)\n tidyverse * 2.0.0 2023-02-22 [1] CRAN (R 4.3.0)\n timechange 0.2.0 2023-01-11 [1] CRAN (R 4.3.0)\n tzdb 0.4.0 2023-05-12 [1] CRAN (R 4.3.0)\n utf8 1.2.3 2023-01-31 [1] CRAN (R 4.3.0)\n vctrs 0.6.3 2023-06-14 [1] CRAN (R 4.3.0)\n withr 2.5.0 2022-03-03 [1] CRAN (R 4.3.0)\n xfun 0.40 2023-08-09 [1] CRAN (R 4.3.0)\n yaml 2.3.7 2023-01-23 [1] CRAN (R 4.3.0)\n\n [1] /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library\n\n──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n```\n:::\n:::\n", + "markdown": "---\ntitle: \"08 - Managing data frames with the Tidyverse\"\nauthor:\n - name: Leonardo Collado Torres\n url: http://lcolladotor.github.io/\n affiliations:\n - id: libd\n name: Lieber Institute for Brain Development\n url: https://libd.org/\n - id: jhsph\n name: Johns Hopkins Bloomberg School of Public Health Department of Biostatistics\n url: https://publichealth.jhu.edu/departments/biostatistics\ndescription: \" An introduction to data frames in R and the managing them with the dplyr R package\"\ncategories: [module 2, week 2, R, programming, dplyr, here, tibble, tidyverse]\n---\n\n\n*This lecture, as the rest of the course, is adapted from the version [Stephanie C. Hicks](https://www.stephaniehicks.com/) designed and maintained in 2021 and 2022. Check the recent changes to this file through the [GitHub history](https://github.com/lcolladotor/jhustatcomputing2023/commits/main/posts/08-managing-data-frames-with-tidyverse/index.qmd).*\n\n\n\n# Pre-lecture materials\n\n### Read ahead\n\n::: callout-note\n## Read ahead\n\n**Before class, you can prepare by reading the following materials:**\n\n1. \n2. \n3. [dplyr cheat sheet from RStudio](http://www.rstudio.com/wp-content/uploads/2015/02/data-wrangling-cheatsheet.pdf)\n:::\n\n### Acknowledgements\n\nMaterial for this lecture was borrowed and adopted from\n\n- \n- \n\n# Learning objectives\n\n::: callout-note\n# Learning objectives\n\n**At the end of this lesson you will:**\n\n- Understand the advantages of a `tibble` and `data.frame` data objects in R\n- Learn about the dplyr R package to manage data frames\n- Recognize the key verbs to manage data frames in dplyr\n- Use the \"pipe\" operator to combine verbs together\n:::\n\n# Data Frames\n\nThe **data frame** (or `data.frame`) is a **key data structure** in statistics and in R.\n\nThe basic structure of a data frame is that there is **one observation per row and each column represents a variable, a measure, feature, or characteristic of that observation**.\n\nR has an internal implementation of data frames that is likely the one you will use most often. However, there are packages on CRAN that implement data frames via things like relational databases that allow you to operate on very, very large data frames (but we will not discuss them here).\n\nGiven the importance of managing data frames, it is **important that we have good tools for dealing with them.**\n\nFor example, **operations** like filtering rows, re-ordering rows, and selecting columns, can often be tedious operations in R whose syntax is not very intuitive. The `dplyr` package is designed to mitigate a lot of these problems and to provide a highly optimized set of routines specifically for dealing with data frames.\n\n## Tibbles\n\nAnother type of data structure that we need to discuss is called the **tibble**! It's best to think of tibbles as an updated and stylish version of the `data.frame`.\n\nTibbles are what tidyverse packages work with most seamlessly. Now, that **does not mean tidyverse packages *require* tibbles**.\n\nIn fact, they still work with `data.frames`, but the more you work with tidyverse and tidyverse-adjacent packages, the more you will see the advantages of using tibbles.\n\nBefore we go any further, tibbles *are* data frames, but they have some new bells and whistles to make your life easier.\n\n### How tibbles differ from `data.frame`\n\nThere are a number of differences between tibbles and `data.frames`.\n\n::: callout-tip\n### Note\n\nTo see a full vignette about tibbles and how they differ from data.frame, you will want to execute `vignette(\"tibble\")` and read through that vignette.\n:::\n\nWe will summarize some of the most important points here:\n\n- **Input type remains unchanged** - `data.frame` is notorious for treating strings as factors; this will not happen with tibbles\n- **Variable names remain unchanged** - In base R, creating `data.frames` will remove spaces from names, converting them to periods or add \"x\" before numeric column names. Creating tibbles will not change variable (column) names.\n- **There are no `row.names()` for a tibble** - Tidy data requires that variables be stored in a consistent way, removing the need for row names.\n- **Tibbles print first ten rows and columns that fit on one screen** - Printing a tibble to screen will never print the entire huge data frame out. By default, it just shows what fits to your screen.\n\n## Creating a tibble\n\nThe tibble package is part of the `tidyverse` and can thus be loaded in (once installed) using:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(tidyverse)\n```\n:::\n\n\n### `as_tibble()`\n\nSince many packages use the historical `data.frame` from base R, you will often find yourself in the situation that you have a `data.frame` and want to convert that `data.frame` to a `tibbl`e.\n\nTo do so, the `as_tibble()` function is exactly what you are looking for.\n\nFor the example, here we use a dataset (`chicago.rds`) containing air pollution and temperature data for the city of Chicago in the U.S.\n\nThe dataset is available in the `/data` repository. You can load the data into R using the `readRDS()` function.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(here)\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nhere() starts at /Users/leocollado/Dropbox/Code/jhustatcomputing2023\n```\n:::\n\n```{.r .cell-code}\nchicago <- readRDS(here(\"data\", \"chicago.rds\"))\n```\n:::\n\n\nYou can see some basic characteristics of the dataset with the `dim()` and `str()` functions.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ndim(chicago)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 6940 8\n```\n:::\n\n```{.r .cell-code}\nstr(chicago)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n'data.frame':\t6940 obs. of 8 variables:\n $ city : chr \"chic\" \"chic\" \"chic\" \"chic\" ...\n $ tmpd : num 31.5 33 33 29 32 40 34.5 29 26.5 32.5 ...\n $ dptp : num 31.5 29.9 27.4 28.6 28.9 ...\n $ date : Date, format: \"1987-01-01\" \"1987-01-02\" ...\n $ pm25tmean2: num NA NA NA NA NA NA NA NA NA NA ...\n $ pm10tmean2: num 34 NA 34.2 47 NA ...\n $ o3tmean2 : num 4.25 3.3 3.33 4.38 4.75 ...\n $ no2tmean2 : num 20 23.2 23.8 30.4 30.3 ...\n```\n:::\n:::\n\n\nWe see this data structure is a `data.frame` with 6940 observations and 8 variables.\n\nTo convert this `data.frame` to a tibble you would use the following:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nstr(as_tibble(chicago))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\ntibble [6,940 × 8] (S3: tbl_df/tbl/data.frame)\n $ city : chr [1:6940] \"chic\" \"chic\" \"chic\" \"chic\" ...\n $ tmpd : num [1:6940] 31.5 33 33 29 32 40 34.5 29 26.5 32.5 ...\n $ dptp : num [1:6940] 31.5 29.9 27.4 28.6 28.9 ...\n $ date : Date[1:6940], format: \"1987-01-01\" \"1987-01-02\" ...\n $ pm25tmean2: num [1:6940] NA NA NA NA NA NA NA NA NA NA ...\n $ pm10tmean2: num [1:6940] 34 NA 34.2 47 NA ...\n $ o3tmean2 : num [1:6940] 4.25 3.3 3.33 4.38 4.75 ...\n $ no2tmean2 : num [1:6940] 20 23.2 23.8 30.4 30.3 ...\n```\n:::\n:::\n\n\n::: callout-tip\n### Note\n\nTibbles, by default, **only print the first ten rows to screen**.\n\nIf you were to print the `data.frame` `chicago` to screen, all 6940 rows would be displayed. When working with large `data.frames`, this **default behavior can be incredibly frustrating**.\n\nUsing tibbles removes this frustration because of the default settings for tibble printing.\n:::\n\nAdditionally, you will note that the **type of the variable is printed for each variable in the tibble**. This helpful feature is another added bonus of tibbles relative to `data.frame`.\n\n#### Want to see more of the tibble?\n\nIf you *do* want to see more rows from the tibble, there are a few options!\n\n1. The `View()` function in RStudio is incredibly helpful. The input to this function is the `data.frame` or tibble you would like to see.\n\nSpecifically, `View(chicago)` would provide you, the viewer, with a scrollable view (in a new tab) of the complete dataset.\n\n2. Use the fact that `print()` enables you to specify how many rows and columns you would like to display.\n\nHere, we again display the `chicago` data.frame as a tibble but specify that we would only like to see 5 rows. The `width = Inf` argument specifies that we would like to see all the possible columns. Here, there are only 8, but for larger datasets, this can be helpful to specify.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nas_tibble(chicago) %>%\n print(n = 5, width = Inf)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 6,940 × 8\n city tmpd dptp date pm25tmean2 pm10tmean2 o3tmean2 no2tmean2\n \n1 chic 31.5 31.5 1987-01-01 NA 34 4.25 20.0\n2 chic 33 29.9 1987-01-02 NA NA 3.30 23.2\n3 chic 33 27.4 1987-01-03 NA 34.2 3.33 23.8\n4 chic 29 28.6 1987-01-04 NA 47 4.38 30.4\n5 chic 32 28.9 1987-01-05 NA NA 4.75 30.3\n# ℹ 6,935 more rows\n```\n:::\n:::\n\n\n### `tibble()`\n\nAlternatively, you can **create a tibble on the fly** by using `tibble()` and specifying the information you would like stored in each column.\n\n::: callout-tip\n### Note\n\nIf you provide a single value, this value will be repeated across all rows of the tibble. This is referred to as \"recycling inputs of length 1.\"\n\nIn the example here, we see that the column `c` will contain the value '1' across all rows.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ntibble(\n a = 1:5,\n b = 6:10,\n c = 1,\n z = (a + b)^2 + c\n)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 5 × 4\n a b c z\n \n1 1 6 1 50\n2 2 7 1 82\n3 3 8 1 122\n4 4 9 1 170\n5 5 10 1 226\n```\n:::\n:::\n\n:::\n\nThe `tibble()` function allows you to quickly generate tibbles and even allows you to **reference columns within the tibble you are creating**, as seen in column z of the example above.\n\n::: callout-tip\n### Note\n\n**Tibbles can have column names that are not allowed** in `data.frame`.\n\nIn the example below, we see that to utilize a nontraditional variable name, you surround the column name with backticks.\n\nNote that to refer to such columns in other tidyverse packages, you willl continue to use backticks surrounding the variable name.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ntibble(\n `two words` = 1:5,\n `12` = \"numeric\",\n `:)` = \"smile\",\n)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 5 × 3\n `two words` `12` `:)` \n \n1 1 numeric smile\n2 2 numeric smile\n3 3 numeric smile\n4 4 numeric smile\n5 5 numeric smile\n```\n:::\n:::\n\n:::\n\n## Subsetting tibbles\n\nSubsetting tibbles also differs slightly from how subsetting occurs with `data.frame`.\n\nWhen it comes to tibbles,\n\n- `[[` can subset by name or position\n- `$` only subsets by name\n\nFor example:\n\n\n::: {.cell}\n\n```{.r .cell-code}\ndf <- tibble(\n a = 1:5,\n b = 6:10,\n c = 1,\n z = (a + b)^2 + c\n)\n\n# Extract by name using $ or [[]]\ndf$z\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 50 82 122 170 226\n```\n:::\n\n```{.r .cell-code}\ndf[[\"z\"]]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 50 82 122 170 226\n```\n:::\n\n```{.r .cell-code}\n# Extract by position requires [[]]\ndf[[4]]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 50 82 122 170 226\n```\n:::\n:::\n\n\nHaving now discussed tibbles, which are the type of object most tidyverse and tidyverse-adjacent packages work best with, we now know the goal.\n\nIn many cases, **tibbles are ultimately what we want to work with in R**.\n\nHowever, **data are stored in many different formats outside of R**. We will spend the rest of this lesson discussing wrangling functions that work either a `data.frame` or `tibble`.\n\n# The `dplyr` Package\n\nThe `dplyr` package was developed by Posit (formely RStudio) and is **an optimized and distilled** version of the older `plyr` **package for data manipulation or wrangling**.\n\n![Artwork by Allison Horst on the dplyr package](https://github.com/allisonhorst/stats-illustrations/raw/main/rstats-artwork/dplyr_wrangling.png){width=\"80%\"}\n\n\\[**Source**: [Artwork by Allison Horst](https://github.com/allisonhorst/stats-illustrations)\\]\n\nThe `dplyr` package does not provide any \"new\" functionality to R per se, in the sense that everything `dplyr` does could already be done with base R, but it **greatly** simplifies existing functionality in R.\n\nOne important contribution of the `dplyr` package is that it **provides a \"grammar\" (in particular, verbs) for data manipulation and for operating on data frames**.\n\nWith this grammar, you can sensibly communicate what it is that you are doing to a data frame that other people can understand (assuming they also know the grammar). This is useful because it **provides an abstraction for data manipulation that previously did not exist**.\n\nAnother useful contribution is that the `dplyr` functions are **very** fast, as many key operations are coded in C++.\n\n### `dplyr` grammar\n\nSome of the key \"verbs\" provided by the `dplyr` package are\n\n- `select()`: return a subset of the columns of a data frame, using a flexible notation\n\n- `filter()`: extract a subset of rows from a data frame based on logical conditions\n\n- `arrange()`: reorder rows of a data frame\n\n- `rename()`: rename variables in a data frame\n\n- `mutate()`: add new variables/columns or transform existing variables\n\n- `summarise()` / `summarize()`: generate summary statistics of different variables in the data frame, possibly within strata\n\n- `%>%`: the \"pipe\" operator is used to connect multiple verb actions together into a pipeline\n\n::: callout-tip\n### Note\n\nThe `dplyr` package as a number of its own data types that it takes advantage of.\n\nFor example, there is a handy `print()` method that prevents you from printing a lot of data to the console. Most of the time, these additional data types are transparent to the user and do not need to be worried about.\n:::\n\n### `dplyr` functions\n\nAll of the functions that we will discuss here will have a few common characteristics. In particular,\n\n1. The **first argument** is a data frame type object.\n\n2. The **subsequent arguments** describe what to do with the data frame specified in the first argument, and you can refer to columns in the data frame directly (without using the `$` operator, just use the column names).\n\n3. The **return result** of a function is a new data frame.\n\n4. Data frames must be **properly formatted** and annotated for this to all be useful. In particular, the data must be [tidy](http://www.jstatsoft.org/v59/i10/paper). In short, there should be one observation per row, and each column should represent a feature or characteristic of that observation.\n\n![Artwork by Allison Horst on tidy data](https://github.com/allisonhorst/stats-illustrations/raw/main/rstats-artwork/tidydata_1.jpg){width=\"80%\"}\n\n\\[**Source**: [Artwork by Allison Horst](https://github.com/allisonhorst/stats-illustrations)\\]\n\n### `dplyr` installation\n\nThe `dplyr` package can be installed from CRAN or from GitHub using the `devtools` package and the `install_github()` function. The GitHub repository will usually contain the latest updates to the package and the development version.\n\nTo install from CRAN, just run\n\n\n::: {.cell}\n\n```{.r .cell-code}\ninstall.packages(\"dplyr\")\n```\n:::\n\n\nThe `dplyr` package is also installed when you install the `tidyverse` meta-package.\n\nAfter installing the package it is important that you load it into your R session with the `library()` function.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(dplyr)\n```\n:::\n\n\nYou may get some warnings when the package is loaded because there are functions in the `dplyr` package that have the same name as functions in other packages. For now you can ignore the warnings.\n\n### `select()`\n\nWe will continue to use the `chicago` dataset containing air pollution and temperature data.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nchicago <- as_tibble(chicago)\nstr(chicago)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\ntibble [6,940 × 8] (S3: tbl_df/tbl/data.frame)\n $ city : chr [1:6940] \"chic\" \"chic\" \"chic\" \"chic\" ...\n $ tmpd : num [1:6940] 31.5 33 33 29 32 40 34.5 29 26.5 32.5 ...\n $ dptp : num [1:6940] 31.5 29.9 27.4 28.6 28.9 ...\n $ date : Date[1:6940], format: \"1987-01-01\" \"1987-01-02\" ...\n $ pm25tmean2: num [1:6940] NA NA NA NA NA NA NA NA NA NA ...\n $ pm10tmean2: num [1:6940] 34 NA 34.2 47 NA ...\n $ o3tmean2 : num [1:6940] 4.25 3.3 3.33 4.38 4.75 ...\n $ no2tmean2 : num [1:6940] 20 23.2 23.8 30.4 30.3 ...\n```\n:::\n:::\n\n\nThe `select()` function can be used to **select columns of a data frame** that you want to focus on.\n\n::: callout-tip\n### Example\n\nSuppose we wanted to take the first 3 columns only. There are a few ways to do this.\n\nWe could for example use numerical indices:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nnames(chicago)[1:3]\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"city\" \"tmpd\" \"dptp\"\n```\n:::\n:::\n\n\nBut we can also use the names directly:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsubset <- select(chicago, city:dptp)\nhead(subset)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 6 × 3\n city tmpd dptp\n \n1 chic 31.5 31.5\n2 chic 33 29.9\n3 chic 33 27.4\n4 chic 29 28.6\n5 chic 32 28.9\n6 chic 40 35.1\n```\n:::\n:::\n\n:::\n\n::: callout-tip\n### Note\n\nThe `:` normally cannot be used with names or strings, but inside the `select()` function you can use it to specify a range of variable names.\n:::\n\nYou can also **omit** variables using the `select()` function by using the negative sign. With `select()` you can do\n\n\n::: {.cell}\n\n```{.r .cell-code}\nselect(chicago, -(city:dptp))\n```\n:::\n\n\nwhich indicates that we should include every variable *except* the variables `city` through `dptp`. The equivalent code in base R would be\n\n\n::: {.cell}\n\n```{.r .cell-code}\ni <- match(\"city\", names(chicago))\nj <- match(\"dptp\", names(chicago))\nhead(chicago[, -(i:j)])\n```\n:::\n\n\nNot super intuitive, right?\n\nThe `select()` function also allows a special syntax that allows you to specify variable names based on patterns. So, for example, if you wanted to keep every variable that ends with a \"2\", we could do\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsubset <- select(chicago, ends_with(\"2\"))\nstr(subset)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\ntibble [6,940 × 4] (S3: tbl_df/tbl/data.frame)\n $ pm25tmean2: num [1:6940] NA NA NA NA NA NA NA NA NA NA ...\n $ pm10tmean2: num [1:6940] 34 NA 34.2 47 NA ...\n $ o3tmean2 : num [1:6940] 4.25 3.3 3.33 4.38 4.75 ...\n $ no2tmean2 : num [1:6940] 20 23.2 23.8 30.4 30.3 ...\n```\n:::\n:::\n\n\nOr if we wanted to keep every variable that starts with a \"d\", we could do\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsubset <- select(chicago, starts_with(\"d\"))\nstr(subset)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\ntibble [6,940 × 2] (S3: tbl_df/tbl/data.frame)\n $ dptp: num [1:6940] 31.5 29.9 27.4 28.6 28.9 ...\n $ date: Date[1:6940], format: \"1987-01-01\" \"1987-01-02\" ...\n```\n:::\n:::\n\n\nYou can also use more general regular expressions if necessary. See the help page (`?select`) for more details.\n\n### `filter()`\n\nThe `filter()` function is used to **extract subsets of rows** from a data frame. This function is similar to the existing `subset()` function in R but is quite a bit faster in my experience.\n\n![Artwork by Allison Horst on filter() function](https://github.com/allisonhorst/stats-illustrations/raw/main/rstats-artwork/dplyr_filter.jpg){width=\"80%\"}\n\n\\[**Source**: [Artwork by Allison Horst](https://github.com/allisonhorst/stats-illustrations)\\]\n\n::: callout-tip\n### Example\n\nSuppose we wanted to extract the rows of the `chicago` data frame where the levels of PM2.5 are greater than 30 (which is a reasonably high level), we could do\n\n\n::: {.cell}\n\n```{.r .cell-code}\nchic.f <- filter(chicago, pm25tmean2 > 30)\nstr(chic.f)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\ntibble [194 × 8] (S3: tbl_df/tbl/data.frame)\n $ city : chr [1:194] \"chic\" \"chic\" \"chic\" \"chic\" ...\n $ tmpd : num [1:194] 23 28 55 59 57 57 75 61 73 78 ...\n $ dptp : num [1:194] 21.9 25.8 51.3 53.7 52 56 65.8 59 60.3 67.1 ...\n $ date : Date[1:194], format: \"1998-01-17\" \"1998-01-23\" ...\n $ pm25tmean2: num [1:194] 38.1 34 39.4 35.4 33.3 ...\n $ pm10tmean2: num [1:194] 32.5 38.7 34 28.5 35 ...\n $ o3tmean2 : num [1:194] 3.18 1.75 10.79 14.3 20.66 ...\n $ no2tmean2 : num [1:194] 25.3 29.4 25.3 31.4 26.8 ...\n```\n:::\n:::\n\n:::\n\nYou can see that there are now only 194 rows in the data frame and the distribution of the `pm25tmean2` values is.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsummary(chic.f$pm25tmean2)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n Min. 1st Qu. Median Mean 3rd Qu. Max. \n 30.05 32.12 35.04 36.63 39.53 61.50 \n```\n:::\n:::\n\n\nWe can place an arbitrarily complex logical sequence inside of `filter()`, so we could for example extract the rows where PM2.5 is greater than 30 *and* temperature is greater than 80 degrees Fahrenheit.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nchic.f <- filter(chicago, pm25tmean2 > 30 & tmpd > 80)\nselect(chic.f, date, tmpd, pm25tmean2)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 17 × 3\n date tmpd pm25tmean2\n \n 1 1998-08-23 81 39.6\n 2 1998-09-06 81 31.5\n 3 2001-07-20 82 32.3\n 4 2001-08-01 84 43.7\n 5 2001-08-08 85 38.8\n 6 2001-08-09 84 38.2\n 7 2002-06-20 82 33 \n 8 2002-06-23 82 42.5\n 9 2002-07-08 81 33.1\n10 2002-07-18 82 38.8\n11 2003-06-25 82 33.9\n12 2003-07-04 84 32.9\n13 2005-06-24 86 31.9\n14 2005-06-27 82 51.5\n15 2005-06-28 85 31.2\n16 2005-07-17 84 32.7\n17 2005-08-03 84 37.9\n```\n:::\n:::\n\n\nNow there are only 17 observations where both of those conditions are met.\n\nOther logical operators you should be aware of include:\n\n| Operator | Meaning | Example |\n|----------:|-------------------------:|-------------------------------:|\n| `==` | Equals | `city == chic` |\n| `!=` | Does not equal | `city != chic` |\n| `>` | Greater than | `tmpd > 32.0` |\n| `>=` | Greater than or equal to | `tmpd >- 32.0` |\n| `<` | Less than | `tmpd < 32.0` |\n| `<=` | Less than or equal to | `tmpd <= 32.0` |\n| `%in%` | Included in | `city %in% c(\"chic\", \"bmore\")` |\n| `is.na()` | Is a missing value | `is.na(pm10tmean2)` |\n\n::: callout-tip\n### Note\n\nIf you are ever unsure of how to write a logical statement, but know how to write its opposite, you can use the `!` operator to negate the whole statement.\n\nA common use of this is to identify observations with non-missing data (e.g., `!(is.na(pm10tmean2))`).\n:::\n\n### `arrange()`\n\nThe `arrange()` function is used to **reorder rows** of a data frame according to one of the variables/columns. Reordering rows of a data frame (while preserving corresponding order of other columns) is normally a pain to do in R. The `arrange()` function simplifies the process quite a bit.\n\nHere we can order the rows of the data frame by date, so that the first row is the earliest (oldest) observation and the last row is the latest (most recent) observation.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nchicago <- arrange(chicago, date)\n```\n:::\n\n\nWe can now check the first few rows\n\n\n::: {.cell}\n\n```{.r .cell-code}\nhead(select(chicago, date, pm25tmean2), 3)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 3 × 2\n date pm25tmean2\n \n1 1987-01-01 NA\n2 1987-01-02 NA\n3 1987-01-03 NA\n```\n:::\n:::\n\n\nand the last few rows.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ntail(select(chicago, date, pm25tmean2), 3)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 3 × 2\n date pm25tmean2\n \n1 2005-12-29 7.45\n2 2005-12-30 15.1 \n3 2005-12-31 15 \n```\n:::\n:::\n\n\nColumns can be arranged in descending order too by useing the special `desc()` operator.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nchicago <- arrange(chicago, desc(date))\n```\n:::\n\n\nLooking at the first three and last three rows shows the dates in descending order.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nhead(select(chicago, date, pm25tmean2), 3)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 3 × 2\n date pm25tmean2\n \n1 2005-12-31 15 \n2 2005-12-30 15.1 \n3 2005-12-29 7.45\n```\n:::\n\n```{.r .cell-code}\ntail(select(chicago, date, pm25tmean2), 3)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 3 × 2\n date pm25tmean2\n \n1 1987-01-03 NA\n2 1987-01-02 NA\n3 1987-01-01 NA\n```\n:::\n:::\n\n\n### `rename()`\n\n**Renaming a variable** in a data frame in R is surprisingly hard to do! The `rename()` function is designed to make this process easier.\n\nHere you can see the names of the first five variables in the `chicago` data frame.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nhead(chicago[, 1:5], 3)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 3 × 5\n city tmpd dptp date pm25tmean2\n \n1 chic 35 30.1 2005-12-31 15 \n2 chic 36 31 2005-12-30 15.1 \n3 chic 35 29.4 2005-12-29 7.45\n```\n:::\n:::\n\n\nThe `dptp` column is supposed to represent the dew point temperature and the `pm25tmean2` column provides the PM2.5 data.\n\nHowever, these names are pretty obscure or awkward and probably be renamed to something more sensible.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nchicago <- rename(chicago, dewpoint = dptp, pm25 = pm25tmean2)\nhead(chicago[, 1:5], 3)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 3 × 5\n city tmpd dewpoint date pm25\n \n1 chic 35 30.1 2005-12-31 15 \n2 chic 36 31 2005-12-30 15.1 \n3 chic 35 29.4 2005-12-29 7.45\n```\n:::\n:::\n\n\nThe syntax inside the `rename()` function is to have the new name on the left-hand side of the `=` sign and the old name on the right-hand side.\n\n::: callout-note\n### Question\n\nHow would you do the equivalent in base R without `dplyr`?\n:::\n\n### `mutate()`\n\nThe `mutate()` function exists to **compute transformations of variables** in a data frame. Often, you want to create new variables that are derived from existing variables and `mutate()` provides a clean interface for doing that.\n\n![Artwork by Allison Horst on mutate() function](https://github.com/allisonhorst/stats-illustrations/raw/main/rstats-artwork/dplyr_mutate.png){width=\"80%\"}\n\n\\[**Source**: [Artwork by Allison Horst](https://github.com/allisonhorst/stats-illustrations)\\]\n\nFor example, with air pollution data, we often want to *detrend* the data by subtracting the mean from the data.\n\n- That way we can look at whether a given day's air pollution level is higher than or less than average (as opposed to looking at its absolute level).\n\nHere, we create a `pm25detrend` variable that subtracts the mean from the `pm25` variable.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nchicago <- mutate(chicago, pm25detrend = pm25 - mean(pm25, na.rm = TRUE))\nhead(chicago)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 6 × 9\n city tmpd dewpoint date pm25 pm10tmean2 o3tmean2 no2tmean2\n \n1 chic 35 30.1 2005-12-31 15 23.5 2.53 13.2\n2 chic 36 31 2005-12-30 15.1 19.2 3.03 22.8\n3 chic 35 29.4 2005-12-29 7.45 23.5 6.79 20.0\n4 chic 37 34.5 2005-12-28 17.8 27.5 3.26 19.3\n5 chic 40 33.6 2005-12-27 23.6 27 4.47 23.5\n6 chic 35 29.6 2005-12-26 8.4 8.5 14.0 16.8\n# ℹ 1 more variable: pm25detrend \n```\n:::\n:::\n\n\nThere is also the related `transmute()` function, which does the same thing as `mutate()` but then *drops all non-transformed variables*.\n\nHere, we de-trend the PM10 and ozone (O3) variables.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nhead(transmute(chicago,\n pm10detrend = pm10tmean2 - mean(pm10tmean2, na.rm = TRUE),\n o3detrend = o3tmean2 - mean(o3tmean2, na.rm = TRUE)\n))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 6 × 2\n pm10detrend o3detrend\n \n1 -10.4 -16.9 \n2 -14.7 -16.4 \n3 -10.4 -12.6 \n4 -6.40 -16.2 \n5 -6.90 -15.0 \n6 -25.4 -5.39\n```\n:::\n:::\n\n\nNote that there are only two columns in the transmuted data frame.\n\n### `group_by()`\n\nThe `group_by()` function is used to **generate summary statistics** from the data frame within strata defined by a variable.\n\nFor example, in this air pollution dataset, you might want to know what the average annual level of PM2.5 is?\n\nSo the stratum is the year, and that is something we can derive from the `date` variable.\n\n**In conjunction** with the `group_by()` function, we often use the `summarize()` function (or `summarise()` for some parts of the world).\n\n::: callout-tip\n### Note\n\nThe **general operation** here is a combination of\n\n1. Splitting a data frame into separate pieces defined by a variable or group of variables (`group_by()`)\n2. Then, applying a summary function across those subsets (`summarize()`)\n:::\n\n::: callout-tip\n### Example\n\nFirst, we can create a `year` variable using `as.POSIXlt()`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nchicago <- mutate(chicago, year = as.POSIXlt(date)$year + 1900)\n```\n:::\n\n\nNow we can create a separate data frame that splits the original data frame by year.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nyears <- group_by(chicago, year)\n```\n:::\n\n\nFinally, we compute summary statistics for each year in the data frame with the `summarize()` function.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsummarize(years,\n pm25 = mean(pm25, na.rm = TRUE),\n o3 = max(o3tmean2, na.rm = TRUE),\n no2 = median(no2tmean2, na.rm = TRUE)\n)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 19 × 4\n year pm25 o3 no2\n \n 1 1987 NaN 63.0 23.5\n 2 1988 NaN 61.7 24.5\n 3 1989 NaN 59.7 26.1\n 4 1990 NaN 52.2 22.6\n 5 1991 NaN 63.1 21.4\n 6 1992 NaN 50.8 24.8\n 7 1993 NaN 44.3 25.8\n 8 1994 NaN 52.2 28.5\n 9 1995 NaN 66.6 27.3\n10 1996 NaN 58.4 26.4\n11 1997 NaN 56.5 25.5\n12 1998 18.3 50.7 24.6\n13 1999 18.5 57.5 24.7\n14 2000 16.9 55.8 23.5\n15 2001 16.9 51.8 25.1\n16 2002 15.3 54.9 22.7\n17 2003 15.2 56.2 24.6\n18 2004 14.6 44.5 23.4\n19 2005 16.2 58.8 22.6\n```\n:::\n:::\n\n:::\n\n`summarize()` returns a data frame with `year` as the first column, and then the annual summary statistics of `pm25`, `o3`, and `no2`.\n\n::: callout-tip\n### More complicated example\n\nIn a slightly more complicated example, we might want to know what are the average levels of ozone (`o3`) and nitrogen dioxide (`no2`) within quintiles of `pm25`. A slicker way to do this would be through a regression model, but we can actually do this quickly with `group_by()` and `summarize()`.\n\nFirst, we can create a categorical variable of `pm25` divided into quantiles\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqq <- quantile(chicago$pm25, seq(0, 1, 0.2), na.rm = TRUE)\nchicago <- mutate(chicago, pm25.quint = cut(pm25, qq))\n```\n:::\n\n\nNow we can group the data frame by the `pm25.quint` variable.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nquint <- group_by(chicago, pm25.quint)\n```\n:::\n\n\nFinally, we can compute the mean of `o3` and `no2` within quintiles of `pm25`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsummarize(quint,\n o3 = mean(o3tmean2, na.rm = TRUE),\n no2 = mean(no2tmean2, na.rm = TRUE)\n)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 6 × 3\n pm25.quint o3 no2\n \n1 (1.7,8.7] 21.7 18.0\n2 (8.7,12.4] 20.4 22.1\n3 (12.4,16.7] 20.7 24.4\n4 (16.7,22.6] 19.9 27.3\n5 (22.6,61.5] 20.3 29.6\n6 18.8 25.8\n```\n:::\n:::\n\n:::\n\nFrom the table, it seems there is not a strong relationship between `pm25` and `o3`, but there appears to be a positive correlation between `pm25` and `no2`.\n\nMore sophisticated statistical modeling can help to provide precise answers to these questions, but a simple application of `dplyr` functions can often get you most of the way there.\n\n### `%>%`\n\nThe pipeline operator `%>%` is very handy for **stringing together multiple `dplyr` functions in a sequence of operations**.\n\nNotice above that every time we wanted to apply more than one function, the sequence gets buried in a sequence of nested function calls that is difficult to read, i.e.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nthird(second(first(x)))\n```\n:::\n\n\nThis **nesting is not a natural way** to think about a sequence of operations.\n\nThe `%>%` operator allows you to string operations in a left-to-right fashion, i.e.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nfirst(x) %>%\n second() %>%\n third()\n```\n:::\n\n\n::: callout-tip\n### Example\n\nTake the example that we just did in the last section.\n\nThat can be done with the following sequence in a single R expression.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nchicago %>%\n mutate(year = as.POSIXlt(date)$year + 1900) %>%\n group_by(year) %>%\n summarize(\n pm25 = mean(pm25, na.rm = TRUE),\n o3 = max(o3tmean2, na.rm = TRUE),\n no2 = median(no2tmean2, na.rm = TRUE)\n )\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 19 × 4\n year pm25 o3 no2\n \n 1 1987 NaN 63.0 23.5\n 2 1988 NaN 61.7 24.5\n 3 1989 NaN 59.7 26.1\n 4 1990 NaN 52.2 22.6\n 5 1991 NaN 63.1 21.4\n 6 1992 NaN 50.8 24.8\n 7 1993 NaN 44.3 25.8\n 8 1994 NaN 52.2 28.5\n 9 1995 NaN 66.6 27.3\n10 1996 NaN 58.4 26.4\n11 1997 NaN 56.5 25.5\n12 1998 18.3 50.7 24.6\n13 1999 18.5 57.5 24.7\n14 2000 16.9 55.8 23.5\n15 2001 16.9 51.8 25.1\n16 2002 15.3 54.9 22.7\n17 2003 15.2 56.2 24.6\n18 2004 14.6 44.5 23.4\n19 2005 16.2 58.8 22.6\n```\n:::\n:::\n\n:::\n\nThis way we do not have to create a set of temporary variables along the way or create a massive nested sequence of function calls.\n\n::: callout-tip\n### Note\n\nIn the above code, I pass the `chicago` data frame to the first call to `mutate()`, but then afterwards I do not have to pass the first argument to `group_by()` or `summarize()`.\n\nOnce you travel down the pipeline with `%>%`, the first argument is taken to be the output of the previous element in the pipeline.\n:::\n\nAnother example might be computing the average pollutant level by month. This could be useful to see if there are any seasonal trends in the data.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nmutate(chicago, month = as.POSIXlt(date)$mon + 1) %>%\n group_by(month) %>%\n summarize(\n pm25 = mean(pm25, na.rm = TRUE),\n o3 = max(o3tmean2, na.rm = TRUE),\n no2 = median(no2tmean2, na.rm = TRUE)\n )\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 12 × 4\n month pm25 o3 no2\n \n 1 1 17.8 28.2 25.4\n 2 2 20.4 37.4 26.8\n 3 3 17.4 39.0 26.8\n 4 4 13.9 47.9 25.0\n 5 5 14.1 52.8 24.2\n 6 6 15.9 66.6 25.0\n 7 7 16.6 59.5 22.4\n 8 8 16.9 54.0 23.0\n 9 9 15.9 57.5 24.5\n10 10 14.2 47.1 24.2\n11 11 15.2 29.5 23.6\n12 12 17.5 27.7 24.5\n```\n:::\n:::\n\n\nHere, we can see that `o3` tends to be low in the winter months and high in the summer while `no2` is higher in the winter and lower in the summer.\n\n### `slice_*()`\n\nThe `slice_sample()` function of the `dplyr` package will allow you to see a **sample of random rows** in random order.\n\nThe number of rows to show is specified by the `n` argument.\n\n- This can be useful if you **do not want to print the entire tibble**, but you want to get a greater sense of the values.\n- This is a **good option for data analysis reports**, where printing the entire tibble would not be appropriate if the tibble is quite large.\n\n::: callout-tip\n### Example\n\n\n::: {.cell}\n\n```{.r .cell-code}\nslice_sample(chicago, n = 10)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 10 × 11\n city tmpd dewpoint date pm25 pm10tmean2 o3tmean2 no2tmean2\n \n 1 chic 49 40.2 2000-09-25 6.6 7 17.2 15.5\n 2 chic 35 24.1 1989-11-02 NA 25 8.83 17.3\n 3 chic 63.5 54.4 1996-04-18 NA 54 30.5 26.7\n 4 chic 70 65.9 1997-06-19 NA 60.5 32.4 39.9\n 5 chic 54 50.6 2005-11-05 27.2 32 11.5 18.2\n 6 chic 86.5 73.4 1990-07-04 NA 60.6 52.2 12.8\n 7 chic 74 74.6 1987-08-14 NA 49.5 24.2 18.6\n 8 chic 34.5 29.1 1995-11-27 NA 25 6.57 29.3\n 9 chic 73 61.2 1995-09-13 NA 46 25.3 26.5\n10 chic 79 64.6 2005-07-31 20.8 29.5 40.8 20.2\n# ℹ 3 more variables: pm25detrend , year , pm25.quint \n```\n:::\n:::\n\n:::\n\nYou can also use `slice_head()` or `slice_tail()` to take a look at the top rows or bottom rows of your tibble. Again the number of rows can be specified with the `n` argument.\n\nThis will show the first 5 rows.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nslice_head(chicago, n = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 5 × 11\n city tmpd dewpoint date pm25 pm10tmean2 o3tmean2 no2tmean2\n \n1 chic 35 30.1 2005-12-31 15 23.5 2.53 13.2\n2 chic 36 31 2005-12-30 15.1 19.2 3.03 22.8\n3 chic 35 29.4 2005-12-29 7.45 23.5 6.79 20.0\n4 chic 37 34.5 2005-12-28 17.8 27.5 3.26 19.3\n5 chic 40 33.6 2005-12-27 23.6 27 4.47 23.5\n# ℹ 3 more variables: pm25detrend , year , pm25.quint \n```\n:::\n:::\n\n\nThis will show the last 5 rows.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nslice_tail(chicago, n = 5)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 5 × 11\n city tmpd dewpoint date pm25 pm10tmean2 o3tmean2 no2tmean2\n \n1 chic 32 28.9 1987-01-05 NA NA 4.75 30.3\n2 chic 29 28.6 1987-01-04 NA 47 4.38 30.4\n3 chic 33 27.4 1987-01-03 NA 34.2 3.33 23.8\n4 chic 33 29.9 1987-01-02 NA NA 3.30 23.2\n5 chic 31.5 31.5 1987-01-01 NA 34 4.25 20.0\n# ℹ 3 more variables: pm25detrend , year , pm25.quint \n```\n:::\n:::\n\n\n# Summary\n\nThe `dplyr` pacfkage provides a concise set of operations for managing data frames. With these functions we can do a number of complex operations in just a few lines of code. In particular, we can often conduct the beginnings of an exploratory analysis with the powerful combination of `group_by()` and `summarize()`.\n\nOnce you learn the `dplyr` grammar there are a few additional benefits\n\n- `dplyr` can work with other data frame \"back ends\" such as SQL databases. There is an SQL interface for relational databases via the DBI package\n\n- `dplyr` can be integrated with the `data.table` package for large fast tables\n\nThe `dplyr` package is handy way to both simplify and speed up your data frame management code. It is rare that you get such a combination at the same time!\n\n# Post-lecture materials\n\n### Final Questions\n\nHere are some post-lecture questions to help you think about the material discussed.\n\n::: callout-note\n### Questions\n\n1. How can you tell if an object is a tibble?\n2. What option controls how many additional column names are printed at the footer of a tibble?\n3. Using the `trees` dataset in base R (this dataset stores the girth, height, and volume for Black Cherry Trees) and using the pipe operator: (i) convert the `data.frame` to a tibble, (ii) filter for rows with a tree height of greater than 70, and (iii) order rows by `Volume` (smallest to largest).\n\n\n::: {.cell}\n\n```{.r .cell-code}\nhead(trees)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n Girth Height Volume\n1 8.3 70 10.3\n2 8.6 65 10.3\n3 8.8 63 10.2\n4 10.5 72 16.4\n5 10.7 81 18.8\n6 10.8 83 19.7\n```\n:::\n:::\n\n:::\n\n### Additional Resources\n\n::: callout-tip\n- \n- \n- [dplyr cheat sheet from RStudio](http://www.rstudio.com/wp-content/uploads/2015/02/data-wrangling-cheatsheet.pdf)\n:::\n\n# R session information\n\n\n::: {.cell}\n\n```{.r .cell-code}\noptions(width = 120)\nsessioninfo::session_info()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────\n setting value\n version R version 4.3.1 (2023-06-16)\n os macOS Ventura 13.5\n system aarch64, darwin20\n ui X11\n language (EN)\n collate en_US.UTF-8\n ctype en_US.UTF-8\n tz America/New_York\n date 2023-08-17\n pandoc 3.1.5 @ /opt/homebrew/bin/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────\n package * version date (UTC) lib source\n cli 3.6.1 2023-03-23 [1] CRAN (R 4.3.0)\n colorout 1.2-2 2023-05-06 [1] Github (jalvesaq/colorout@79931fd)\n colorspace 2.1-0 2023-01-23 [1] CRAN (R 4.3.0)\n digest 0.6.33 2023-07-07 [1] CRAN (R 4.3.0)\n dplyr * 1.1.2 2023-04-20 [1] CRAN (R 4.3.0)\n evaluate 0.21 2023-05-05 [1] CRAN (R 4.3.0)\n fansi 1.0.4 2023-01-22 [1] CRAN (R 4.3.0)\n fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.3.0)\n forcats * 1.0.0 2023-01-29 [1] CRAN (R 4.3.0)\n generics 0.1.3 2022-07-05 [1] CRAN (R 4.3.0)\n ggplot2 * 3.4.3 2023-08-14 [1] CRAN (R 4.3.1)\n glue 1.6.2 2022-02-24 [1] CRAN (R 4.3.0)\n gtable 0.3.3 2023-03-21 [1] CRAN (R 4.3.0)\n here * 1.0.1 2020-12-13 [1] CRAN (R 4.3.0)\n hms 1.1.3 2023-03-21 [1] CRAN (R 4.3.0)\n htmltools 0.5.6 2023-08-10 [1] CRAN (R 4.3.0)\n htmlwidgets 1.6.2 2023-03-17 [1] CRAN (R 4.3.0)\n jsonlite 1.8.7 2023-06-29 [1] CRAN (R 4.3.0)\n knitr 1.43 2023-05-25 [1] CRAN (R 4.3.0)\n lifecycle 1.0.3 2022-10-07 [1] CRAN (R 4.3.0)\n lubridate * 1.9.2 2023-02-10 [1] CRAN (R 4.3.0)\n magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.3.0)\n munsell 0.5.0 2018-06-12 [1] CRAN (R 4.3.0)\n pillar 1.9.0 2023-03-22 [1] CRAN (R 4.3.0)\n pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 4.3.0)\n purrr * 1.0.2 2023-08-10 [1] CRAN (R 4.3.0)\n R6 2.5.1 2021-08-19 [1] CRAN (R 4.3.0)\n readr * 2.1.4 2023-02-10 [1] CRAN (R 4.3.0)\n rlang 1.1.1 2023-04-28 [1] CRAN (R 4.3.0)\n rmarkdown 2.24 2023-08-14 [1] CRAN (R 4.3.1)\n rprojroot 2.0.3 2022-04-02 [1] CRAN (R 4.3.0)\n rstudioapi 0.15.0 2023-07-07 [1] CRAN (R 4.3.0)\n scales 1.2.1 2022-08-20 [1] CRAN (R 4.3.0)\n sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.3.0)\n stringi 1.7.12 2023-01-11 [1] CRAN (R 4.3.0)\n stringr * 1.5.0 2022-12-02 [1] CRAN (R 4.3.0)\n tibble * 3.2.1 2023-03-20 [1] CRAN (R 4.3.0)\n tidyr * 1.3.0 2023-01-24 [1] CRAN (R 4.3.0)\n tidyselect 1.2.0 2022-10-10 [1] CRAN (R 4.3.0)\n tidyverse * 2.0.0 2023-02-22 [1] CRAN (R 4.3.0)\n timechange 0.2.0 2023-01-11 [1] CRAN (R 4.3.0)\n tzdb 0.4.0 2023-05-12 [1] CRAN (R 4.3.0)\n utf8 1.2.3 2023-01-31 [1] CRAN (R 4.3.0)\n vctrs 0.6.3 2023-06-14 [1] CRAN (R 4.3.0)\n withr 2.5.0 2022-03-03 [1] CRAN (R 4.3.0)\n xfun 0.40 2023-08-09 [1] CRAN (R 4.3.0)\n yaml 2.3.7 2023-01-23 [1] CRAN (R 4.3.0)\n\n [1] /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library\n\n──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n```\n:::\n:::\n", "supporting": [], "filters": [ "rmarkdown/pagebreak.lua" diff --git a/_freeze/posts/09-tidy-data-and-the-tidyverse/index/execute-results/html.json b/_freeze/posts/09-tidy-data-and-the-tidyverse/index/execute-results/html.json index dd7cfe1..745ed89 100644 --- a/_freeze/posts/09-tidy-data-and-the-tidyverse/index/execute-results/html.json +++ b/_freeze/posts/09-tidy-data-and-the-tidyverse/index/execute-results/html.json @@ -1,7 +1,7 @@ { - "hash": "2d7b312f39fbff603576c0df9c26dee5", + "hash": "4988f121f5166e5d1440e31a42847a58", "result": { - "markdown": "---\ntitle: \"09 - Tidy data and the Tidyverse\"\nauthor:\n - name: Leonardo Collado Torres\n url: http://lcolladotor.github.io/\n affiliations:\n - id: libd\n name: Lieber Institute for Brain Development\n url: https://libd.org/\n - id: jhsph\n name: Johns Hopkins Bloomberg School of Public Health Department of Biostatistics\n url: https://publichealth.jhu.edu/departments/biostatistics\ndescription: \"Introduction to tidy data and how to convert between wide and long data with the tidyr R package\"\ncategories: [module 2, week 2, R, programming, tidyr, here, tidyverse]\n---\n\n\n*This lecture, as the rest of the course, is adapted from the version [Stephanie C. Hicks](https://www.stephaniehicks.com/) designed and maintained in 2021 and 2022. Check the recent changes to this file through the [GitHub history](https://github.com/lcolladotor/jhustatcomputing2023/commits/main/posts/09-tidy-data-and-the-tidyverse/index.qmd).*\n\n\n\n> \"Happy families are all alike; every unhappy family is unhappy in its own way.\" ---- Leo Tolstoy\n\n> \"Tidy datasets are all alike, but every messy dataset is messy in its own way.\" ---- Hadley Wickham\n\n# Pre-lecture materials\n\n### Read ahead\n\n::: callout-note\n## Read ahead\n\n**Before class, you can prepare by reading the following materials:**\n\n1. [Tidy Data](https://www.jstatsoft.org/article/view/v059i10) paper published in the Journal of Statistical Software\n2. \n3. [tidyr cheat sheet from RStudio](http://www.rstudio.com/wp-content/uploads/2015/02/data-wrangling-cheatsheet.pdf)\n:::\n\n### Acknowledgements\n\nMaterial for this lecture was borrowed and adopted from\n\n- \n- \n\n# Learning objectives\n\n::: callout-note\n# Learning objectives\n\n**At the end of this lesson you will:**\n\n- Define tidy data\n- Be able to transform non-tidy data into tidy data\n- Be able to transform wide data into long data\n- Be able to separate character columns into multiple columns\n- Be able to unite multiple character columns into one column\n:::\n\n# Tidy data\n\nAs we learned in the last lesson, one unifying concept of the tidyverse is the notion of **tidy data**.\n\nAs defined by Hadley Wickham in his 2014 paper published in the *Journal of Statistical Software*, a [tidy dataset](https://www.jstatsoft.org/article/view/v059i10) has the following properties:\n\n1. Each variable forms a column.\n\n2. Each observation forms a row.\n\n3. Each type of observational unit forms a table.\n\n![Artwork by Allison Horst on tidy data](https://github.com/allisonhorst/stats-illustrations/raw/main/rstats-artwork/tidydata_1.jpg){width=\"80%\"}\n\n\\[**Source**: [Artwork by Allison Horst](https://github.com/allisonhorst/stats-illustrations)\\]\n\nThe **purpose of defining tidy data** is to highlight the fact that **most data do not start out life as tidy**.\n\nIn fact, much of the work of data analysis may involve simply making the data tidy (at least this has been our experience).\n\n- Once a dataset is tidy, it **can be used as input into a variety of other functions** that may transform, model, or visualize the data.\n\n::: callout-tip\n### Example\n\nAs a quick example, consider the following data illustrating **religion and income survey data** with the number of respondents with income range in column name.\n\nThis is in a classic table format:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(tidyr)\nrelig_income\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 18 × 11\n religion `<$10k` `$10-20k` `$20-30k` `$30-40k` `$40-50k` `$50-75k` `$75-100k`\n \n 1 Agnostic 27 34 60 81 76 137 122\n 2 Atheist 12 27 37 52 35 70 73\n 3 Buddhist 27 21 30 34 33 58 62\n 4 Catholic 418 617 732 670 638 1116 949\n 5 Don’t k… 15 14 15 11 10 35 21\n 6 Evangel… 575 869 1064 982 881 1486 949\n 7 Hindu 1 9 7 9 11 34 47\n 8 Histori… 228 244 236 238 197 223 131\n 9 Jehovah… 20 27 24 24 21 30 15\n10 Jewish 19 19 25 25 30 95 69\n11 Mainlin… 289 495 619 655 651 1107 939\n12 Mormon 29 40 48 51 56 112 85\n13 Muslim 6 7 9 10 9 23 16\n14 Orthodox 13 17 23 32 32 47 38\n15 Other C… 9 7 11 13 13 14 18\n16 Other F… 20 33 40 46 49 63 46\n17 Other W… 5 2 3 4 2 7 3\n18 Unaffil… 217 299 374 365 341 528 407\n# ℹ 3 more variables: `$100-150k` , `>150k` ,\n# `Don't know/refused` \n```\n:::\n:::\n\n:::\n\nWhile this format is canonical and is useful for quickly observing the relationship between multiple variables, it is not tidy.\n\n**This format violates the tidy form** because there are variables in the columns.\n\n- In this case the variables are religion, income bracket, and the number of respondents, which is the third variable, is presented inside the table.\n\nConverting this data to tidy format would give us\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(tidyverse)\n\nrelig_income %>%\n pivot_longer(-religion, names_to = \"income\", values_to = \"respondents\") %>%\n mutate(religion = factor(religion), income = factor(income))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 180 × 3\n religion income respondents\n \n 1 Agnostic <$10k 27\n 2 Agnostic $10-20k 34\n 3 Agnostic $20-30k 60\n 4 Agnostic $30-40k 81\n 5 Agnostic $40-50k 76\n 6 Agnostic $50-75k 137\n 7 Agnostic $75-100k 122\n 8 Agnostic $100-150k 109\n 9 Agnostic >150k 84\n10 Agnostic Don't know/refused 96\n# ℹ 170 more rows\n```\n:::\n:::\n\n\nSome of these functions you have seen before, others might be new to you. Let's talk about each one in the context of the `tidyverse` R packages.\n\n# The \"Tidyverse\"\n\nThere are a number of R packages that take advantage of the tidy data form and can be used to do interesting things with data. Many (but not all) of these packages are written by Hadley Wickham and **the collection of packages is often referred to as the \"tidyverse\"** because of their **dependence on and presumption of tidy data**.\n\n::: callout-tip\n### Note\n\nA subset of the \"Tidyverse\" packages include:\n\n- [ggplot2](https://cran.r-project.org/package=ggplot2): a plotting system based on the grammar of graphics\n\n- [magrittr](https://cran.r-project.org/package=magrittr%22): defines the `%>%` operator for chaining functions together in a series of operations on data\n\n- [dplyr](https://cran.r-project.org/package=dplyr): a suite of (fast) functions for working with data frames\n\n- [tidyr](https://cran.r-project.org/package=tidyr): easily tidy data with `pivot_wider()` and `pivot_longer()` functions (also `separate()` and `unite()`)\n\nA complete list can be found here ().\n:::\n\nWe will be using these packages quite a bit.\n\nThe \"tidyverse\" package can be used to install all of the packages in the tidyverse at once.\n\nFor example, instead of starting an R script with this:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(dplyr)\nlibrary(tidyr)\nlibrary(readr)\nlibrary(ggplot2)\n```\n:::\n\n\nYou can start with this:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(tidyverse)\n```\n:::\n\n\nIn the example above, let's talk about what we did using the `pivot_longer()` function.\n\nWe will also talk about `pivot_wider()`.\n\n### `pivot_longer()`\n\nThe `tidyr` package includes functions to transfer a data frame between *long* and *wide*.\n\n- **Wide format** data tends to have different attributes or variables describing an observation placed in separate columns.\n- **Long format** data tends to have different attributes encoded as levels of a single variable, followed by another column that contains tha values of the observation at those different levels.\n\n::: callout-tip\n### Example\n\nIn the section above, we showed an example that used `pivot_longer()` to convert data into a tidy format.\n\nThe **key problem** with the tidyness of the data is that the income variables are not in their own columns, but rather are embedded in the structure of the columns.\n\nTo **fix this**, you can use the `pivot_longer()` function to **gather values spread across several columns into a single column**, here with the column names gathered into an `income` column.\n\n**Note**: when gathering, exclude any columns that you do not want \"gathered\" (`religion` in this case) by including the column names with a the minus sign in the `pivot_longer()` function.\n\nFor example:\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# Gather everything EXCEPT religion to tidy data\nrelig_income %>%\n pivot_longer(-religion, names_to = \"income\", values_to = \"respondents\")\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 180 × 3\n religion income respondents\n \n 1 Agnostic <$10k 27\n 2 Agnostic $10-20k 34\n 3 Agnostic $20-30k 60\n 4 Agnostic $30-40k 81\n 5 Agnostic $40-50k 76\n 6 Agnostic $50-75k 137\n 7 Agnostic $75-100k 122\n 8 Agnostic $100-150k 109\n 9 Agnostic >150k 84\n10 Agnostic Don't know/refused 96\n# ℹ 170 more rows\n```\n:::\n:::\n\n:::\n\nEven if your data is in a tidy format, `pivot_longer()` is occasionally useful for pulling data together to take advantage of faceting, or plotting separate plots based on a grouping variable. We will talk more about that in a future lecture.\n\n### `pivot_wider()`\n\nThe `pivot_wider()` function is less commonly needed to tidy data. It can, however, be useful for creating summary tables.\n\n::: callout-tip\n### Example\n\nYou use the `summarize()` function in `dplyr` to summarize the total number of respondents per income category.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nrelig_income %>%\n pivot_longer(-religion, names_to = \"income\", values_to = \"respondents\") %>%\n mutate(religion = factor(religion), income = factor(income)) %>% \n group_by(income) %>% \n summarize(total_respondents = sum(respondents)) %>%\n pivot_wider(names_from = \"income\", \n values_from = \"total_respondents\") %>%\n knitr::kable()\n```\n\n::: {.cell-output-display}\n| <$10k| >150k| $10-20k| $100-150k| $20-30k| $30-40k| $40-50k| $50-75k| $75-100k| Don't know/refused|\n|-----:|-----:|-------:|---------:|-------:|-------:|-------:|-------:|--------:|------------------:|\n| 1930| 2608| 2781| 3197| 3357| 3302| 3085| 5185| 3990| 6121|\n:::\n:::\n\n:::\n\nNotice in this example how `pivot_wider()` has been used at the **very end of the code sequence** to convert the summarized data into a shape that **offers a better tabular presentation for a report**.\n\n::: callout-tip\n### Note\n\nIn the `pivot_wider()` call, you first specify the name of the column to use for the new column names (`income` in this example) and then specify the column to use for the cell values (`total_respondents` here).\n:::\n\n::: callout-tip\n### Example of `pivot_longer()`\n\nLet's try another dataset. This data contain an excerpt of the [Gapminder data](https://cran.r-project.org/web/packages/gapminder/README.html#gapminder) on life expectancy, GDP per capita, and population by country.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(gapminder)\ngapminder\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 1,704 × 6\n country continent year lifeExp pop gdpPercap\n \n 1 Afghanistan Asia 1952 28.8 8425333 779.\n 2 Afghanistan Asia 1957 30.3 9240934 821.\n 3 Afghanistan Asia 1962 32.0 10267083 853.\n 4 Afghanistan Asia 1967 34.0 11537966 836.\n 5 Afghanistan Asia 1972 36.1 13079460 740.\n 6 Afghanistan Asia 1977 38.4 14880372 786.\n 7 Afghanistan Asia 1982 39.9 12881816 978.\n 8 Afghanistan Asia 1987 40.8 13867957 852.\n 9 Afghanistan Asia 1992 41.7 16317921 649.\n10 Afghanistan Asia 1997 41.8 22227415 635.\n# ℹ 1,694 more rows\n```\n:::\n:::\n\n\nIf we wanted to make `lifeExp`, `pop` and `gdpPercap` (all measurements that we observe) go from a wide table into a long table, what would we do?\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# try it yourself\n```\n:::\n\n:::\n\n::: callout-tip\n### Example\n\nOne more! Try using `pivot_longer()` to convert the the following data that contains made-up revenues for three companies by quarter for years 2006 to 2009.\n\nAfterward, use `group_by()` and `summarize()` to calculate the average revenue for each company across all years and all quarters.\n\n**Bonus**: Calculate a mean revenue for each company AND each year (averaged across all 4 quarters).\n\n\n::: {.cell}\n\n```{.r .cell-code}\ndf <- tibble(\n \"company\" = rep(1:3, each=4), \n \"year\" = rep(2006:2009, 3),\n \"Q1\" = sample(x = 0:100, size = 12),\n \"Q2\" = sample(x = 0:100, size = 12),\n \"Q3\" = sample(x = 0:100, size = 12),\n \"Q4\" = sample(x = 0:100, size = 12),\n)\ndf\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 12 × 6\n company year Q1 Q2 Q3 Q4\n \n 1 1 2006 8 55 99 17\n 2 1 2007 9 57 98 48\n 3 1 2008 20 40 77 24\n 4 1 2009 42 68 61 26\n 5 2 2006 100 84 13 3\n 6 2 2007 86 93 17 93\n 7 2 2008 97 83 62 62\n 8 2 2009 46 12 25 79\n 9 3 2006 5 48 81 41\n10 3 2007 53 73 73 34\n11 3 2008 81 39 49 84\n12 3 2009 90 69 30 56\n```\n:::\n:::\n\n::: {.cell}\n\n```{.r .cell-code}\n# try it yourself \n```\n:::\n\n:::\n\n### `separate()` and `unite()`\n\nThe same `tidyr` package also contains two useful functions:\n\n- `unite()`: combine contents of two or more columns into a single column\n- `separate()`: separate contents of a column into two or more columns\n\nFirst, we combine the first three columns into one new column using `unite()`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ngapminder %>% \n unite(col=\"country_continent_year\", \n country:year, \n sep=\"_\")\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 1,704 × 4\n country_continent_year lifeExp pop gdpPercap\n \n 1 Afghanistan_Asia_1952 28.8 8425333 779.\n 2 Afghanistan_Asia_1957 30.3 9240934 821.\n 3 Afghanistan_Asia_1962 32.0 10267083 853.\n 4 Afghanistan_Asia_1967 34.0 11537966 836.\n 5 Afghanistan_Asia_1972 36.1 13079460 740.\n 6 Afghanistan_Asia_1977 38.4 14880372 786.\n 7 Afghanistan_Asia_1982 39.9 12881816 978.\n 8 Afghanistan_Asia_1987 40.8 13867957 852.\n 9 Afghanistan_Asia_1992 41.7 16317921 649.\n10 Afghanistan_Asia_1997 41.8 22227415 635.\n# ℹ 1,694 more rows\n```\n:::\n:::\n\n\nNext, we show how to separate the columns into three separate columns using `separate()` using the `col`, `into` and `sep` arguments.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ngapminder %>% \n unite(col=\"country_continent_year\", \n country:year, \n sep=\"_\") %>% \n separate(col=\"country_continent_year\", \n into=c(\"country\", \"continent\", \"year\"), \n sep=\"_\")\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 1,704 × 6\n country continent year lifeExp pop gdpPercap\n \n 1 Afghanistan Asia 1952 28.8 8425333 779.\n 2 Afghanistan Asia 1957 30.3 9240934 821.\n 3 Afghanistan Asia 1962 32.0 10267083 853.\n 4 Afghanistan Asia 1967 34.0 11537966 836.\n 5 Afghanistan Asia 1972 36.1 13079460 740.\n 6 Afghanistan Asia 1977 38.4 14880372 786.\n 7 Afghanistan Asia 1982 39.9 12881816 978.\n 8 Afghanistan Asia 1987 40.8 13867957 852.\n 9 Afghanistan Asia 1992 41.7 16317921 649.\n10 Afghanistan Asia 1997 41.8 22227415 635.\n# ℹ 1,694 more rows\n```\n:::\n:::\n\n\n# Post-lecture materials\n\n### Final Questions\n\nHere are some post-lecture questions to help you think about the material discussed.\n\n::: callout-note\n### Questions\n\n1. Using prose, describe how the variables and observations are organised in a tidy dataset versus an non-tidy dataset.\n\n2. What do the extra and fill arguments do in `separate()`? Experiment with the various options for the following two toy datasets.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ntibble(x = c(\"a,b,c\", \"d,e,f,g\", \"h,i,j\")) %>% \n separate(x, c(\"one\", \"two\", \"three\"))\n\ntibble(x = c(\"a,b,c\", \"d,e\", \"f,g,i\")) %>% \n separate(x, c(\"one\", \"two\", \"three\"))\n```\n:::\n\n\n3. Both `unite()` and `separate()` have a remove argument. What does it do? Why would you set it to FALSE?\n\n4. Compare and contrast `separate()` and `extract()`. Why are there three variations of separation (by position, by separator, and with groups), but only one `unite()`?\n:::\n\n### Additional Resources\n\n::: callout-tip\n- [Tidy Data](https://www.jstatsoft.org/article/view/v059i10) paper published in the Journal of Statistical Software\n- https://r4ds.had.co.nz/tidy-data.html\n- [tidyr cheat sheet from RStudio](http://www.rstudio.com/wp-content/uploads/2015/02/data-wrangling-cheatsheet.pdf)\n:::\n\n# R session information\n\n\n::: {.cell}\n\n```{.r .cell-code}\noptions(width = 120)\nsessioninfo::session_info()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────\n setting value\n version R version 4.3.1 (2023-06-16)\n os macOS Ventura 13.5\n system aarch64, darwin20\n ui X11\n language (EN)\n collate en_US.UTF-8\n ctype en_US.UTF-8\n tz America/New_York\n date 2023-08-17\n pandoc 3.1.5 @ /opt/homebrew/bin/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────\n package * version date (UTC) lib source\n cli 3.6.1 2023-03-23 [1] CRAN (R 4.3.0)\n colorout 1.2-2 2023-05-06 [1] Github (jalvesaq/colorout@79931fd)\n colorspace 2.1-0 2023-01-23 [1] CRAN (R 4.3.0)\n digest 0.6.33 2023-07-07 [1] CRAN (R 4.3.0)\n dplyr * 1.1.2 2023-04-20 [1] CRAN (R 4.3.0)\n evaluate 0.21 2023-05-05 [1] CRAN (R 4.3.0)\n fansi 1.0.4 2023-01-22 [1] CRAN (R 4.3.0)\n fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.3.0)\n forcats * 1.0.0 2023-01-29 [1] CRAN (R 4.3.0)\n gapminder * 1.0.0 2023-03-10 [1] CRAN (R 4.3.0)\n generics 0.1.3 2022-07-05 [1] CRAN (R 4.3.0)\n ggplot2 * 3.4.3 2023-08-14 [1] CRAN (R 4.3.1)\n glue 1.6.2 2022-02-24 [1] CRAN (R 4.3.0)\n gtable 0.3.3 2023-03-21 [1] CRAN (R 4.3.0)\n hms 1.1.3 2023-03-21 [1] CRAN (R 4.3.0)\n htmltools 0.5.6 2023-08-10 [1] CRAN (R 4.3.0)\n htmlwidgets 1.6.2 2023-03-17 [1] CRAN (R 4.3.0)\n jsonlite 1.8.7 2023-06-29 [1] CRAN (R 4.3.0)\n knitr 1.43 2023-05-25 [1] CRAN (R 4.3.0)\n lifecycle 1.0.3 2022-10-07 [1] CRAN (R 4.3.0)\n lubridate * 1.9.2 2023-02-10 [1] CRAN (R 4.3.0)\n magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.3.0)\n munsell 0.5.0 2018-06-12 [1] CRAN (R 4.3.0)\n pillar 1.9.0 2023-03-22 [1] CRAN (R 4.3.0)\n pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 4.3.0)\n purrr * 1.0.2 2023-08-10 [1] CRAN (R 4.3.0)\n R6 2.5.1 2021-08-19 [1] CRAN (R 4.3.0)\n readr * 2.1.4 2023-02-10 [1] CRAN (R 4.3.0)\n rlang 1.1.1 2023-04-28 [1] CRAN (R 4.3.0)\n rmarkdown 2.24 2023-08-14 [1] CRAN (R 4.3.1)\n rstudioapi 0.15.0 2023-07-07 [1] CRAN (R 4.3.0)\n scales 1.2.1 2022-08-20 [1] CRAN (R 4.3.0)\n sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.3.0)\n stringi 1.7.12 2023-01-11 [1] CRAN (R 4.3.0)\n stringr * 1.5.0 2022-12-02 [1] CRAN (R 4.3.0)\n tibble * 3.2.1 2023-03-20 [1] CRAN (R 4.3.0)\n tidyr * 1.3.0 2023-01-24 [1] CRAN (R 4.3.0)\n tidyselect 1.2.0 2022-10-10 [1] CRAN (R 4.3.0)\n tidyverse * 2.0.0 2023-02-22 [1] CRAN (R 4.3.0)\n timechange 0.2.0 2023-01-11 [1] CRAN (R 4.3.0)\n tzdb 0.4.0 2023-05-12 [1] CRAN (R 4.3.0)\n utf8 1.2.3 2023-01-31 [1] CRAN (R 4.3.0)\n vctrs 0.6.3 2023-06-14 [1] CRAN (R 4.3.0)\n withr 2.5.0 2022-03-03 [1] CRAN (R 4.3.0)\n xfun 0.40 2023-08-09 [1] CRAN (R 4.3.0)\n yaml 2.3.7 2023-01-23 [1] CRAN (R 4.3.0)\n\n [1] /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library\n\n──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n```\n:::\n:::\n", + "markdown": "---\ntitle: \"09 - Tidy data and the Tidyverse\"\nauthor:\n - name: Leonardo Collado Torres\n url: http://lcolladotor.github.io/\n affiliations:\n - id: libd\n name: Lieber Institute for Brain Development\n url: https://libd.org/\n - id: jhsph\n name: Johns Hopkins Bloomberg School of Public Health Department of Biostatistics\n url: https://publichealth.jhu.edu/departments/biostatistics\ndescription: \"Introduction to tidy data and how to convert between wide and long data with the tidyr R package\"\ncategories: [module 2, week 2, R, programming, tidyr, here, tidyverse]\n---\n\n\n*This lecture, as the rest of the course, is adapted from the version [Stephanie C. Hicks](https://www.stephaniehicks.com/) designed and maintained in 2021 and 2022. Check the recent changes to this file through the [GitHub history](https://github.com/lcolladotor/jhustatcomputing2023/commits/main/posts/09-tidy-data-and-the-tidyverse/index.qmd).*\n\n\n\n> \"Happy families are all alike; every unhappy family is unhappy in its own way.\" ---- Leo Tolstoy\n\n> \"Tidy datasets are all alike, but every messy dataset is messy in its own way.\" ---- Hadley Wickham\n\n# Pre-lecture materials\n\n### Read ahead\n\n::: callout-note\n## Read ahead\n\n**Before class, you can prepare by reading the following materials:**\n\n1. [Tidy Data](https://www.jstatsoft.org/article/view/v059i10) paper published in the Journal of Statistical Software\n2. \n3. [tidyr cheat sheet from RStudio](http://www.rstudio.com/wp-content/uploads/2015/02/data-wrangling-cheatsheet.pdf)\n:::\n\n### Acknowledgements\n\nMaterial for this lecture was borrowed and adopted from\n\n- \n- \n\n# Learning objectives\n\n::: callout-note\n# Learning objectives\n\n**At the end of this lesson you will:**\n\n- Define tidy data\n- Be able to transform non-tidy data into tidy data\n- Be able to transform wide data into long data\n- Be able to separate character columns into multiple columns\n- Be able to unite multiple character columns into one column\n:::\n\n# Tidy data\n\nAs we learned in the last lesson, one unifying concept of the tidyverse is the notion of **tidy data**.\n\nAs defined by Hadley Wickham in his 2014 paper published in the *Journal of Statistical Software*, a [tidy dataset](https://www.jstatsoft.org/article/view/v059i10) has the following properties:\n\n1. Each variable forms a column.\n\n2. Each observation forms a row.\n\n3. Each type of observational unit forms a table.\n\n![Artwork by Allison Horst on tidy data](https://github.com/allisonhorst/stats-illustrations/raw/main/rstats-artwork/tidydata_1.jpg){width=\"80%\"}\n\n\\[**Source**: [Artwork by Allison Horst](https://github.com/allisonhorst/stats-illustrations)\\]\n\nThe **purpose of defining tidy data** is to highlight the fact that **most data do not start out life as tidy**.\n\nIn fact, much of the work of data analysis may involve simply making the data tidy (at least this has been our experience).\n\n- Once a dataset is tidy, it **can be used as input into a variety of other functions** that may transform, model, or visualize the data.\n\n::: callout-tip\n### Example\n\nAs a quick example, consider the following data illustrating **religion and income survey data** with the number of respondents with income range in column name.\n\nThis is in a classic table format:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(tidyr)\nrelig_income\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 18 × 11\n religion `<$10k` `$10-20k` `$20-30k` `$30-40k` `$40-50k` `$50-75k` `$75-100k`\n \n 1 Agnostic 27 34 60 81 76 137 122\n 2 Atheist 12 27 37 52 35 70 73\n 3 Buddhist 27 21 30 34 33 58 62\n 4 Catholic 418 617 732 670 638 1116 949\n 5 Don’t k… 15 14 15 11 10 35 21\n 6 Evangel… 575 869 1064 982 881 1486 949\n 7 Hindu 1 9 7 9 11 34 47\n 8 Histori… 228 244 236 238 197 223 131\n 9 Jehovah… 20 27 24 24 21 30 15\n10 Jewish 19 19 25 25 30 95 69\n11 Mainlin… 289 495 619 655 651 1107 939\n12 Mormon 29 40 48 51 56 112 85\n13 Muslim 6 7 9 10 9 23 16\n14 Orthodox 13 17 23 32 32 47 38\n15 Other C… 9 7 11 13 13 14 18\n16 Other F… 20 33 40 46 49 63 46\n17 Other W… 5 2 3 4 2 7 3\n18 Unaffil… 217 299 374 365 341 528 407\n# ℹ 3 more variables: `$100-150k` , `>150k` ,\n# `Don't know/refused` \n```\n:::\n:::\n\n:::\n\nWhile this format is canonical and is useful for quickly observing the relationship between multiple variables, it is not tidy.\n\n**This format violates the tidy form** because there are variables in the columns.\n\n- In this case the variables are religion, income bracket, and the number of respondents, which is the third variable, is presented inside the table.\n\nConverting this data to tidy format would give us\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(tidyverse)\n\nrelig_income %>%\n pivot_longer(-religion, names_to = \"income\", values_to = \"respondents\") %>%\n mutate(religion = factor(religion), income = factor(income))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 180 × 3\n religion income respondents\n \n 1 Agnostic <$10k 27\n 2 Agnostic $10-20k 34\n 3 Agnostic $20-30k 60\n 4 Agnostic $30-40k 81\n 5 Agnostic $40-50k 76\n 6 Agnostic $50-75k 137\n 7 Agnostic $75-100k 122\n 8 Agnostic $100-150k 109\n 9 Agnostic >150k 84\n10 Agnostic Don't know/refused 96\n# ℹ 170 more rows\n```\n:::\n:::\n\n\nSome of these functions you have seen before, others might be new to you. Let's talk about each one in the context of the `tidyverse` R packages.\n\n# The \"Tidyverse\"\n\nThere are a number of R packages that take advantage of the tidy data form and can be used to do interesting things with data. Many (but not all) of these packages are written by Hadley Wickham and **the collection of packages is often referred to as the \"tidyverse\"** because of their **dependence on and presumption of tidy data**.\n\n::: callout-tip\n### Note\n\nA subset of the \"Tidyverse\" packages include:\n\n- [ggplot2](https://cran.r-project.org/package=ggplot2): a plotting system based on the grammar of graphics\n\n- [magrittr](https://cran.r-project.org/package=magrittr%22): defines the `%>%` operator for chaining functions together in a series of operations on data\n\n- [dplyr](https://cran.r-project.org/package=dplyr): a suite of (fast) functions for working with data frames\n\n- [tidyr](https://cran.r-project.org/package=tidyr): easily tidy data with `pivot_wider()` and `pivot_longer()` functions (also `separate()` and `unite()`)\n\nA complete list can be found here ().\n:::\n\nWe will be using these packages quite a bit.\n\nThe \"tidyverse\" package can be used to install all of the packages in the tidyverse at once.\n\nFor example, instead of starting an R script with this:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(dplyr)\nlibrary(tidyr)\nlibrary(readr)\nlibrary(ggplot2)\n```\n:::\n\n\nYou can start with this:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(tidyverse)\n```\n:::\n\n\nIn the example above, let's talk about what we did using the `pivot_longer()` function.\n\nWe will also talk about `pivot_wider()`.\n\n### `pivot_longer()`\n\nThe `tidyr` package includes functions to transfer a data frame between *long* and *wide*.\n\n- **Wide format** data tends to have different attributes or variables describing an observation placed in separate columns.\n- **Long format** data tends to have different attributes encoded as levels of a single variable, followed by another column that contains tha values of the observation at those different levels.\n\n::: callout-tip\n### Example\n\nIn the section above, we showed an example that used `pivot_longer()` to convert data into a tidy format.\n\nThe **key problem** with the tidyness of the data is that the income variables are not in their own columns, but rather are embedded in the structure of the columns.\n\nTo **fix this**, you can use the `pivot_longer()` function to **gather values spread across several columns into a single column**, here with the column names gathered into an `income` column.\n\n**Note**: when gathering, exclude any columns that you do not want \"gathered\" (`religion` in this case) by including the column names with a the minus sign in the `pivot_longer()` function.\n\nFor example:\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# Gather everything EXCEPT religion to tidy data\nrelig_income %>%\n pivot_longer(-religion, names_to = \"income\", values_to = \"respondents\")\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 180 × 3\n religion income respondents\n \n 1 Agnostic <$10k 27\n 2 Agnostic $10-20k 34\n 3 Agnostic $20-30k 60\n 4 Agnostic $30-40k 81\n 5 Agnostic $40-50k 76\n 6 Agnostic $50-75k 137\n 7 Agnostic $75-100k 122\n 8 Agnostic $100-150k 109\n 9 Agnostic >150k 84\n10 Agnostic Don't know/refused 96\n# ℹ 170 more rows\n```\n:::\n:::\n\n:::\n\nEven if your data is in a tidy format, `pivot_longer()` is occasionally useful for pulling data together to take advantage of faceting, or plotting separate plots based on a grouping variable. We will talk more about that in a future lecture.\n\n### `pivot_wider()`\n\nThe `pivot_wider()` function is less commonly needed to tidy data. It can, however, be useful for creating summary tables.\n\n::: callout-tip\n### Example\n\nYou use the `summarize()` function in `dplyr` to summarize the total number of respondents per income category.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nrelig_income %>%\n pivot_longer(-religion, names_to = \"income\", values_to = \"respondents\") %>%\n mutate(religion = factor(religion), income = factor(income)) %>%\n group_by(income) %>%\n summarize(total_respondents = sum(respondents)) %>%\n pivot_wider(\n names_from = \"income\",\n values_from = \"total_respondents\"\n ) %>%\n knitr::kable()\n```\n\n::: {.cell-output-display}\n| <$10k| >150k| $10-20k| $100-150k| $20-30k| $30-40k| $40-50k| $50-75k| $75-100k| Don't know/refused|\n|-----:|-----:|-------:|---------:|-------:|-------:|-------:|-------:|--------:|------------------:|\n| 1930| 2608| 2781| 3197| 3357| 3302| 3085| 5185| 3990| 6121|\n:::\n:::\n\n:::\n\nNotice in this example how `pivot_wider()` has been used at the **very end of the code sequence** to convert the summarized data into a shape that **offers a better tabular presentation for a report**.\n\n::: callout-tip\n### Note\n\nIn the `pivot_wider()` call, you first specify the name of the column to use for the new column names (`income` in this example) and then specify the column to use for the cell values (`total_respondents` here).\n:::\n\n::: callout-tip\n### Example of `pivot_longer()`\n\nLet's try another dataset. This data contain an excerpt of the [Gapminder data](https://cran.r-project.org/web/packages/gapminder/README.html#gapminder) on life expectancy, GDP per capita, and population by country.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(gapminder)\ngapminder\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 1,704 × 6\n country continent year lifeExp pop gdpPercap\n \n 1 Afghanistan Asia 1952 28.8 8425333 779.\n 2 Afghanistan Asia 1957 30.3 9240934 821.\n 3 Afghanistan Asia 1962 32.0 10267083 853.\n 4 Afghanistan Asia 1967 34.0 11537966 836.\n 5 Afghanistan Asia 1972 36.1 13079460 740.\n 6 Afghanistan Asia 1977 38.4 14880372 786.\n 7 Afghanistan Asia 1982 39.9 12881816 978.\n 8 Afghanistan Asia 1987 40.8 13867957 852.\n 9 Afghanistan Asia 1992 41.7 16317921 649.\n10 Afghanistan Asia 1997 41.8 22227415 635.\n# ℹ 1,694 more rows\n```\n:::\n:::\n\n\nIf we wanted to make `lifeExp`, `pop` and `gdpPercap` (all measurements that we observe) go from a wide table into a long table, what would we do?\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# try it yourself\n```\n:::\n\n:::\n\n::: callout-tip\n### Example\n\nOne more! Try using `pivot_longer()` to convert the the following data that contains made-up revenues for three companies by quarter for years 2006 to 2009.\n\nAfterward, use `group_by()` and `summarize()` to calculate the average revenue for each company across all years and all quarters.\n\n**Bonus**: Calculate a mean revenue for each company AND each year (averaged across all 4 quarters).\n\n\n::: {.cell}\n\n```{.r .cell-code}\ndf <- tibble(\n \"company\" = rep(1:3, each = 4),\n \"year\" = rep(2006:2009, 3),\n \"Q1\" = sample(x = 0:100, size = 12),\n \"Q2\" = sample(x = 0:100, size = 12),\n \"Q3\" = sample(x = 0:100, size = 12),\n \"Q4\" = sample(x = 0:100, size = 12),\n)\ndf\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 12 × 6\n company year Q1 Q2 Q3 Q4\n \n 1 1 2006 99 6 54 47\n 2 1 2007 28 79 90 9\n 3 1 2008 7 72 69 24\n 4 1 2009 16 56 6 100\n 5 2 2006 42 58 75 25\n 6 2 2007 64 1 100 6\n 7 2 2008 43 88 37 77\n 8 2 2009 95 74 17 44\n 9 3 2006 34 47 77 38\n10 3 2007 73 31 31 54\n11 3 2008 4 49 93 0\n12 3 2009 57 4 45 96\n```\n:::\n:::\n\n::: {.cell}\n\n```{.r .cell-code}\n# try it yourself\n```\n:::\n\n:::\n\n### `separate()` and `unite()`\n\nThe same `tidyr` package also contains two useful functions:\n\n- `unite()`: combine contents of two or more columns into a single column\n- `separate()`: separate contents of a column into two or more columns\n\nFirst, we combine the first three columns into one new column using `unite()`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ngapminder %>%\n unite(\n col = \"country_continent_year\",\n country:year,\n sep = \"_\"\n )\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 1,704 × 4\n country_continent_year lifeExp pop gdpPercap\n \n 1 Afghanistan_Asia_1952 28.8 8425333 779.\n 2 Afghanistan_Asia_1957 30.3 9240934 821.\n 3 Afghanistan_Asia_1962 32.0 10267083 853.\n 4 Afghanistan_Asia_1967 34.0 11537966 836.\n 5 Afghanistan_Asia_1972 36.1 13079460 740.\n 6 Afghanistan_Asia_1977 38.4 14880372 786.\n 7 Afghanistan_Asia_1982 39.9 12881816 978.\n 8 Afghanistan_Asia_1987 40.8 13867957 852.\n 9 Afghanistan_Asia_1992 41.7 16317921 649.\n10 Afghanistan_Asia_1997 41.8 22227415 635.\n# ℹ 1,694 more rows\n```\n:::\n:::\n\n\nNext, we show how to separate the columns into three separate columns using `separate()` using the `col`, `into` and `sep` arguments.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ngapminder %>%\n unite(\n col = \"country_continent_year\",\n country:year,\n sep = \"_\"\n ) %>%\n separate(\n col = \"country_continent_year\",\n into = c(\"country\", \"continent\", \"year\"),\n sep = \"_\"\n )\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 1,704 × 6\n country continent year lifeExp pop gdpPercap\n \n 1 Afghanistan Asia 1952 28.8 8425333 779.\n 2 Afghanistan Asia 1957 30.3 9240934 821.\n 3 Afghanistan Asia 1962 32.0 10267083 853.\n 4 Afghanistan Asia 1967 34.0 11537966 836.\n 5 Afghanistan Asia 1972 36.1 13079460 740.\n 6 Afghanistan Asia 1977 38.4 14880372 786.\n 7 Afghanistan Asia 1982 39.9 12881816 978.\n 8 Afghanistan Asia 1987 40.8 13867957 852.\n 9 Afghanistan Asia 1992 41.7 16317921 649.\n10 Afghanistan Asia 1997 41.8 22227415 635.\n# ℹ 1,694 more rows\n```\n:::\n:::\n\n\n# Post-lecture materials\n\n### Final Questions\n\nHere are some post-lecture questions to help you think about the material discussed.\n\n::: callout-note\n### Questions\n\n1. Using prose, describe how the variables and observations are organised in a tidy dataset versus an non-tidy dataset.\n\n2. What do the extra and fill arguments do in `separate()`? Experiment with the various options for the following two toy datasets.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ntibble(x = c(\"a,b,c\", \"d,e,f,g\", \"h,i,j\")) %>%\n separate(x, c(\"one\", \"two\", \"three\"))\n\ntibble(x = c(\"a,b,c\", \"d,e\", \"f,g,i\")) %>%\n separate(x, c(\"one\", \"two\", \"three\"))\n```\n:::\n\n\n3. Both `unite()` and `separate()` have a remove argument. What does it do? Why would you set it to FALSE?\n\n4. Compare and contrast `separate()` and `extract()`. Why are there three variations of separation (by position, by separator, and with groups), but only one `unite()`?\n:::\n\n### Additional Resources\n\n::: callout-tip\n- [Tidy Data](https://www.jstatsoft.org/article/view/v059i10) paper published in the Journal of Statistical Software\n- https://r4ds.had.co.nz/tidy-data.html\n- [tidyr cheat sheet from RStudio](http://www.rstudio.com/wp-content/uploads/2015/02/data-wrangling-cheatsheet.pdf)\n:::\n\n# R session information\n\n\n::: {.cell}\n\n```{.r .cell-code}\noptions(width = 120)\nsessioninfo::session_info()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────\n setting value\n version R version 4.3.1 (2023-06-16)\n os macOS Ventura 13.5\n system aarch64, darwin20\n ui X11\n language (EN)\n collate en_US.UTF-8\n ctype en_US.UTF-8\n tz America/New_York\n date 2023-08-17\n pandoc 3.1.5 @ /opt/homebrew/bin/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────\n package * version date (UTC) lib source\n cli 3.6.1 2023-03-23 [1] CRAN (R 4.3.0)\n colorout 1.2-2 2023-05-06 [1] Github (jalvesaq/colorout@79931fd)\n colorspace 2.1-0 2023-01-23 [1] CRAN (R 4.3.0)\n digest 0.6.33 2023-07-07 [1] CRAN (R 4.3.0)\n dplyr * 1.1.2 2023-04-20 [1] CRAN (R 4.3.0)\n evaluate 0.21 2023-05-05 [1] CRAN (R 4.3.0)\n fansi 1.0.4 2023-01-22 [1] CRAN (R 4.3.0)\n fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.3.0)\n forcats * 1.0.0 2023-01-29 [1] CRAN (R 4.3.0)\n gapminder * 1.0.0 2023-03-10 [1] CRAN (R 4.3.0)\n generics 0.1.3 2022-07-05 [1] CRAN (R 4.3.0)\n ggplot2 * 3.4.3 2023-08-14 [1] CRAN (R 4.3.1)\n glue 1.6.2 2022-02-24 [1] CRAN (R 4.3.0)\n gtable 0.3.3 2023-03-21 [1] CRAN (R 4.3.0)\n hms 1.1.3 2023-03-21 [1] CRAN (R 4.3.0)\n htmltools 0.5.6 2023-08-10 [1] CRAN (R 4.3.0)\n htmlwidgets 1.6.2 2023-03-17 [1] CRAN (R 4.3.0)\n jsonlite 1.8.7 2023-06-29 [1] CRAN (R 4.3.0)\n knitr 1.43 2023-05-25 [1] CRAN (R 4.3.0)\n lifecycle 1.0.3 2022-10-07 [1] CRAN (R 4.3.0)\n lubridate * 1.9.2 2023-02-10 [1] CRAN (R 4.3.0)\n magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.3.0)\n munsell 0.5.0 2018-06-12 [1] CRAN (R 4.3.0)\n pillar 1.9.0 2023-03-22 [1] CRAN (R 4.3.0)\n pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 4.3.0)\n purrr * 1.0.2 2023-08-10 [1] CRAN (R 4.3.0)\n R6 2.5.1 2021-08-19 [1] CRAN (R 4.3.0)\n readr * 2.1.4 2023-02-10 [1] CRAN (R 4.3.0)\n rlang 1.1.1 2023-04-28 [1] CRAN (R 4.3.0)\n rmarkdown 2.24 2023-08-14 [1] CRAN (R 4.3.1)\n rstudioapi 0.15.0 2023-07-07 [1] CRAN (R 4.3.0)\n scales 1.2.1 2022-08-20 [1] CRAN (R 4.3.0)\n sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.3.0)\n stringi 1.7.12 2023-01-11 [1] CRAN (R 4.3.0)\n stringr * 1.5.0 2022-12-02 [1] CRAN (R 4.3.0)\n tibble * 3.2.1 2023-03-20 [1] CRAN (R 4.3.0)\n tidyr * 1.3.0 2023-01-24 [1] CRAN (R 4.3.0)\n tidyselect 1.2.0 2022-10-10 [1] CRAN (R 4.3.0)\n tidyverse * 2.0.0 2023-02-22 [1] CRAN (R 4.3.0)\n timechange 0.2.0 2023-01-11 [1] CRAN (R 4.3.0)\n tzdb 0.4.0 2023-05-12 [1] CRAN (R 4.3.0)\n utf8 1.2.3 2023-01-31 [1] CRAN (R 4.3.0)\n vctrs 0.6.3 2023-06-14 [1] CRAN (R 4.3.0)\n withr 2.5.0 2022-03-03 [1] CRAN (R 4.3.0)\n xfun 0.40 2023-08-09 [1] CRAN (R 4.3.0)\n yaml 2.3.7 2023-01-23 [1] CRAN (R 4.3.0)\n\n [1] /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library\n\n──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n```\n:::\n:::\n", "supporting": [], "filters": [ "rmarkdown/pagebreak.lua" diff --git a/_freeze/posts/10-joining-data-in-r/index/execute-results/html.json b/_freeze/posts/10-joining-data-in-r/index/execute-results/html.json index f61dc52..e81da47 100644 --- a/_freeze/posts/10-joining-data-in-r/index/execute-results/html.json +++ b/_freeze/posts/10-joining-data-in-r/index/execute-results/html.json @@ -1,7 +1,7 @@ { - "hash": "9484ca31dfe45edc4a74b72df287baad", + "hash": "c065e9bff64a00dbd0bc879eea567da8", "result": { - "markdown": "---\ntitle: \"10 - Joining data in R\"\nauthor:\n - name: Leonardo Collado Torres\n url: http://lcolladotor.github.io/\n affiliations:\n - id: libd\n name: Lieber Institute for Brain Development\n url: https://libd.org/\n - id: jhsph\n name: Johns Hopkins Bloomberg School of Public Health Department of Biostatistics\n url: https://publichealth.jhu.edu/departments/biostatistics\ndescription: \"Introduction to relational data and join functions in the dplyr R package\"\ncategories: [module 2, week 2, R, programming, dplyr, here, tidyverse]\n---\n\n\n*This lecture, as the rest of the course, is adapted from the version [Stephanie C. Hicks](https://www.stephaniehicks.com/) designed and maintained in 2021 and 2022. Check the recent changes to this file through the [GitHub history](https://github.com/lcolladotor/jhustatcomputing2023/commits/main/posts/10-joining-data-in-r/index.qmd).*\n\n\n\n# Pre-lecture materials\n\n### Read ahead\n\n::: callout-note\n## Read ahead\n\n**Before class, you can prepare by reading the following materials:**\n\n1. \n2. \n:::\n\n### Acknowledgements\n\nMaterial for this lecture was borrowed and adopted from\n\n- \n- \n- \n\n# Learning objectives\n\n::: callout-note\n# Learning objectives\n\n**At the end of this lesson you will:**\n\n- Be able to define relational data and keys\n- Be able to define the three types of join functions for relational data\n- Be able to implement mutational join functions\n:::\n\n# Relational data\n\nData analyses rarely involve only a single table of data.\n\nTypically you have many tables of data, and you **must combine the datasets** to answer the questions that you are interested in.\n\nCollectively, **multiple tables of data are called relational data** because it is the *relations*, not just the individual datasets, that are important.\n\nRelations are **always defined between a pair of tables**. All other relations are built up from this simple idea: the relations of three or more tables are always a property of the relations between each pair.\n\nSometimes both elements of a pair can be the same table! This is needed if, for example, you have a table of people, and each person has a reference to their parents.\n\nTo work with relational data you **need verbs that work with pairs of tables**.\n\n::: callout-tip\n### Three important families of verbs\n\nThere are three families of verbs designed to work with relational data:\n\n- [**Mutating joins**](https://r4ds.had.co.nz/relational-data.html#mutating-joins): A mutating join allows you to **combine variables from two tables**. It first matches observations by their keys, then copies across variables from one table to the other on the right side of the table (similar to `mutate()`). We will discuss a few of these below.\n - See @sec-mutjoins for Table of mutating joins.\n- [**Filtering joins**](https://r4ds.had.co.nz/relational-data.html#filtering-joins): Filtering joins **match observations** in the same way as mutating joins, **but affect the observations, not the variables** (i.e. filter observations from one data frame based on whether or not they match an observation in the other).\n - Two types: `semi_join(x, y)` and `anti_join(x, y)`.\n- [**Set operations**](https://r4ds.had.co.nz/relational-data.html#set-operations): Treat **observations as if they were set elements**. Typically used less frequently, but occasionally useful when you want to break a single complex filter into simpler pieces. All these operations work with a complete row, comparing the values of every variable. These expect the x and y inputs to have the same variables, and treat the observations like sets:\n - Examples of set operations: `intersect(x, y)`, `union(x, y)`, and `setdiff(x, y)`.\n:::\n\n## Keys\n\nThe **variables used to connect each pair of tables** are called **keys**. A key is a variable (or set of variables) that uniquely identifies an observation. In simple cases, a single variable is sufficient to identify an observation.\n\n::: callout-tip\n### Note\n\nThere are two types of keys:\n\n- A **primary key** uniquely identifies an observation in its own table.\n- A **foreign key** uniquely identifies an observation in another table.\n:::\n\nLet's consider an example to help us understand the difference between a **primary key** and **foreign key**.\n\n## Example of keys\n\nImagine you are conduct a study and **collecting data on subjects and a health outcome**.\n\nOften, subjects will **make multiple visits** (a so-called longitudinal study) and so we will record the outcome for each visit. Similarly, we may record other information about them, such as the kind of housing they live in.\n\n### The first table\n\nThis code creates a simple table with some made up data about some hypothetical subjects' outcomes.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(tidyverse)\n\noutcomes <- tibble(\n id = rep(c(\"a\", \"b\", \"c\"), each = 3),\n visit = rep(0:2, 3),\n outcome = rnorm(3 * 3, 3)\n)\n\nprint(outcomes)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 9 × 3\n id visit outcome\n \n1 a 0 5.04\n2 a 1 2.18\n3 a 2 4.33\n4 b 0 3.33\n5 b 1 2.32\n6 b 2 2.06\n7 c 0 1.98\n8 c 1 1.28\n9 c 2 2.29\n```\n:::\n:::\n\n\nNote that subjects are labeled by a unique identifer in the `id` column.\n\n### A second table\n\nHere is some code to create a second table (we will be joining the first and second tables shortly). This table contains some data about the hypothetical subjects' housing situation by recording the type of house they live in.\n\n\n::: {.cell exercise='true'}\n\n```{.r .cell-code}\nsubjects <- tibble(\n id = c(\"a\", \"b\", \"c\"),\n house = c(\"detached\", \"rowhouse\", \"rowhouse\")\n)\n\nprint(subjects)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 3 × 2\n id house \n \n1 a detached\n2 b rowhouse\n3 c rowhouse\n```\n:::\n:::\n\n\n::: callout-note\n### Question\n\nWhat is the **primary key** and **foreign key**?\n\n- The `outcomes$id` is a **primary key** because it uniquely identifies each subject in the `outcomes` table.\n- The `subjects$id` is a **foreign key** because it appears in the `subjects` table where it matches each subject to a unique `id`.\n:::\n\n# Mutating joins {#sec-mutjoins}\n\nThe `dplyr` package provides a set of **functions for joining two data frames** into a single data frame based on a set of key columns.\n\nThere are several functions in the `*_join()` family.\n\n- These functions all merge together two data frames\n- They differ in how they handle observations that exist in one but not both data frames.\n\nHere, are the **four functions from this family** that you will likely use the most often:\n\n\n::: {.cell layout-align=\"center\"}\n::: {.cell-output-display}\n|Function |What it includes in merged data frame |\n|:--------------|:---------------------------------------------------------------------------------------------------------|\n|`left_join()` |Includes all observations in the left data frame, whether or not there is a match in the right data frame |\n|`right_join()` |Includes all observations in the right data frame, whether or not there is a match in the left data frame |\n|`inner_join()` |Includes only observations that are in both data frames |\n|`full_join()` |Includes all observations from both data frames |\n:::\n:::\n\n\n![](https://d33wubrfki0l68.cloudfront.net/aeab386461820b029b7e7606ccff1286f623bae1/ef0d4/diagrams/join-venn.png)\n\n\\[[Source from R for Data Science](https://r4ds.had.co.nz/relational-data#relational-data)\\]\n\n## Left Join\n\nRecall the `outcomes` and `subjects` datasets above.\n\n\n::: {.cell}\n\n```{.r .cell-code}\noutcomes\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 9 × 3\n id visit outcome\n \n1 a 0 5.04\n2 a 1 2.18\n3 a 2 4.33\n4 b 0 3.33\n5 b 1 2.32\n6 b 2 2.06\n7 c 0 1.98\n8 c 1 1.28\n9 c 2 2.29\n```\n:::\n\n```{.r .cell-code}\nsubjects\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 3 × 2\n id house \n \n1 a detached\n2 b rowhouse\n3 c rowhouse\n```\n:::\n:::\n\n\nSuppose we want to create a table that combines the information about houses (`subjects`) with the information about the outcomes (`outcomes`).\n\nWe can use the `left_join()` function to merge the `outcomes` and `subjects` tables and produce the output above.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nleft_join(x = outcomes, y = subjects, by = \"id\")\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 9 × 4\n id visit outcome house \n \n1 a 0 5.04 detached\n2 a 1 2.18 detached\n3 a 2 4.33 detached\n4 b 0 3.33 rowhouse\n5 b 1 2.32 rowhouse\n6 b 2 2.06 rowhouse\n7 c 0 1.98 rowhouse\n8 c 1 1.28 rowhouse\n9 c 2 2.29 rowhouse\n```\n:::\n:::\n\n\n::: callout-tip\n### Note\n\nThe `by` argument indicates the column (or columns) that the two tables have in common.\n:::\n\n### Left Join with Incomplete Data\n\nIn the previous examples, the `subjects` table didn't have a `visit` column. But suppose it did? Maybe people move around during the study. We could image a table like this one.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsubjects <- tibble(\n id = c(\"a\", \"b\", \"c\"),\n visit = c(0, 1, 0),\n house = c(\"detached\", \"rowhouse\", \"rowhouse\"),\n)\n\nprint(subjects)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 3 × 3\n id visit house \n \n1 a 0 detached\n2 b 1 rowhouse\n3 c 0 rowhouse\n```\n:::\n:::\n\n\nWhen we left joint the tables now we get:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nleft_join(outcomes, subjects, by = c(\"id\", \"visit\"))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 9 × 4\n id visit outcome house \n \n1 a 0 5.04 detached\n2 a 1 2.18 \n3 a 2 4.33 \n4 b 0 3.33 \n5 b 1 2.32 rowhouse\n6 b 2 2.06 \n7 c 0 1.98 rowhouse\n8 c 1 1.28 \n9 c 2 2.29 \n```\n:::\n:::\n\n\n::: callout-tip\n### Note\n\nTwo things to point out here:\n\n1. If we do not have information about a subject's housing in a given visit, the `left_join()` function automatically inserts an `NA` value to indicate that it is missing.\n\n2. We can \"join\" on multiple variable (e.g. here we joined on the `id` and the `visit` columns).\n:::\n\nWe may even have a situation where we are missing housing data for a subject completely. The following table has no information about subject `a`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsubjects <- tibble(\n id = c(\"b\", \"c\"),\n visit = c(1, 0),\n house = c(\"rowhouse\", \"rowhouse\"),\n)\n\nsubjects\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 2 × 3\n id visit house \n \n1 b 1 rowhouse\n2 c 0 rowhouse\n```\n:::\n:::\n\n\nBut we can still join the tables together and the `house` values for subject `a` will all be `NA`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nleft_join(x = outcomes, y = subjects, by = c(\"id\", \"visit\"))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 9 × 4\n id visit outcome house \n \n1 a 0 5.04 \n2 a 1 2.18 \n3 a 2 4.33 \n4 b 0 3.33 \n5 b 1 2.32 rowhouse\n6 b 2 2.06 \n7 c 0 1.98 rowhouse\n8 c 1 1.28 \n9 c 2 2.29 \n```\n:::\n:::\n\n\n::: callout-tip\n### Important\n\nThe bottom line for `left_join()` is that it **always retains the values in the \"left\" argument** (in this case the `outcomes` table).\n\n- If there are no corresponding values in the \"right\" argument, `NA` values will be filled in.\n:::\n\n## Inner Join\n\nThe `inner_join()` function only **retains the rows of both tables** that have corresponding values. Here we can see the difference.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ninner_join(x = outcomes, y = subjects, by = c(\"id\", \"visit\"))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 2 × 4\n id visit outcome house \n \n1 b 1 2.32 rowhouse\n2 c 0 1.98 rowhouse\n```\n:::\n:::\n\n\n## Right Join\n\nThe `right_join()` function is like the `left_join()` function except that it **gives priority to the \"right\" hand argument**.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nright_join(x = outcomes, y = subjects, by = c(\"id\", \"visit\"))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 2 × 4\n id visit outcome house \n \n1 b 1 2.32 rowhouse\n2 c 0 1.98 rowhouse\n```\n:::\n:::\n\n\n# Summary\n\n- `left_join()` is useful for merging a \"large\" data frame with a \"smaller\" one while retaining all the rows of the \"large\" data frame\n\n- `inner_join()` gives you the intersection of the rows between two data frames\n\n- `right_join()` is like `left_join()` with the arguments reversed (likely only useful at the end of a pipeline)\n\n# Post-lecture materials\n\n### Final Questions\n\nHere are some post-lecture questions to help you think about the material discussed.\n\n::: callout-note\n### Questions\n\n1. If you had three data frames to combine with a shared key, how would you join them using the verbs you now know?\n\n2. Using `df1` and `df2` below, what is the difference between `inner_join(df1, df2)`, `semi_join(df1, df2)` and `anti_join(df1, df2)`?\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# Create first example data frame\ndf1 <- data.frame(ID = 1:3,\n X1 = c(\"a1\", \"a2\", \"a3\"))\n# Create second example data frame\ndf2 <- data.frame(ID = 2:4, \n X2 = c(\"b1\", \"b2\", \"b3\"))\n```\n:::\n\n\n3. Try changing the order from the above e.g. `inner_join(df2, df1)`, `semi_join(df2, df1)` and `anti_join(df2, df1)`. What changed? What did not change?\n:::\n\n### Additional Resources\n\n::: callout-tip\n- \n- \n- \n:::\n\n# R session information\n\n\n::: {.cell}\n\n```{.r .cell-code}\noptions(width = 120)\nsessioninfo::session_info()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────\n setting value\n version R version 4.3.1 (2023-06-16)\n os macOS Ventura 13.5\n system aarch64, darwin20\n ui X11\n language (EN)\n collate en_US.UTF-8\n ctype en_US.UTF-8\n tz America/New_York\n date 2023-08-17\n pandoc 3.1.5 @ /opt/homebrew/bin/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────\n package * version date (UTC) lib source\n cli 3.6.1 2023-03-23 [1] CRAN (R 4.3.0)\n colorout 1.2-2 2023-05-06 [1] Github (jalvesaq/colorout@79931fd)\n colorspace 2.1-0 2023-01-23 [1] CRAN (R 4.3.0)\n digest 0.6.33 2023-07-07 [1] CRAN (R 4.3.0)\n dplyr * 1.1.2 2023-04-20 [1] CRAN (R 4.3.0)\n evaluate 0.21 2023-05-05 [1] CRAN (R 4.3.0)\n fansi 1.0.4 2023-01-22 [1] CRAN (R 4.3.0)\n fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.3.0)\n forcats * 1.0.0 2023-01-29 [1] CRAN (R 4.3.0)\n generics 0.1.3 2022-07-05 [1] CRAN (R 4.3.0)\n ggplot2 * 3.4.3 2023-08-14 [1] CRAN (R 4.3.1)\n glue 1.6.2 2022-02-24 [1] CRAN (R 4.3.0)\n gtable 0.3.3 2023-03-21 [1] CRAN (R 4.3.0)\n hms 1.1.3 2023-03-21 [1] CRAN (R 4.3.0)\n htmltools 0.5.6 2023-08-10 [1] CRAN (R 4.3.0)\n htmlwidgets 1.6.2 2023-03-17 [1] CRAN (R 4.3.0)\n jsonlite 1.8.7 2023-06-29 [1] CRAN (R 4.3.0)\n knitr * 1.43 2023-05-25 [1] CRAN (R 4.3.0)\n lifecycle 1.0.3 2022-10-07 [1] CRAN (R 4.3.0)\n lubridate * 1.9.2 2023-02-10 [1] CRAN (R 4.3.0)\n magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.3.0)\n munsell 0.5.0 2018-06-12 [1] CRAN (R 4.3.0)\n pillar 1.9.0 2023-03-22 [1] CRAN (R 4.3.0)\n pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 4.3.0)\n purrr * 1.0.2 2023-08-10 [1] CRAN (R 4.3.0)\n R6 2.5.1 2021-08-19 [1] CRAN (R 4.3.0)\n readr * 2.1.4 2023-02-10 [1] CRAN (R 4.3.0)\n rlang 1.1.1 2023-04-28 [1] CRAN (R 4.3.0)\n rmarkdown 2.24 2023-08-14 [1] CRAN (R 4.3.1)\n rstudioapi 0.15.0 2023-07-07 [1] CRAN (R 4.3.0)\n scales 1.2.1 2022-08-20 [1] CRAN (R 4.3.0)\n sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.3.0)\n stringi 1.7.12 2023-01-11 [1] CRAN (R 4.3.0)\n stringr * 1.5.0 2022-12-02 [1] CRAN (R 4.3.0)\n tibble * 3.2.1 2023-03-20 [1] CRAN (R 4.3.0)\n tidyr * 1.3.0 2023-01-24 [1] CRAN (R 4.3.0)\n tidyselect 1.2.0 2022-10-10 [1] CRAN (R 4.3.0)\n tidyverse * 2.0.0 2023-02-22 [1] CRAN (R 4.3.0)\n timechange 0.2.0 2023-01-11 [1] CRAN (R 4.3.0)\n tzdb 0.4.0 2023-05-12 [1] CRAN (R 4.3.0)\n utf8 1.2.3 2023-01-31 [1] CRAN (R 4.3.0)\n vctrs 0.6.3 2023-06-14 [1] CRAN (R 4.3.0)\n withr 2.5.0 2022-03-03 [1] CRAN (R 4.3.0)\n xfun 0.40 2023-08-09 [1] CRAN (R 4.3.0)\n yaml 2.3.7 2023-01-23 [1] CRAN (R 4.3.0)\n\n [1] /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library\n\n──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n```\n:::\n:::\n", + "markdown": "---\ntitle: \"10 - Joining data in R\"\nauthor:\n - name: Leonardo Collado Torres\n url: http://lcolladotor.github.io/\n affiliations:\n - id: libd\n name: Lieber Institute for Brain Development\n url: https://libd.org/\n - id: jhsph\n name: Johns Hopkins Bloomberg School of Public Health Department of Biostatistics\n url: https://publichealth.jhu.edu/departments/biostatistics\ndescription: \"Introduction to relational data and join functions in the dplyr R package\"\ncategories: [module 2, week 2, R, programming, dplyr, here, tidyverse]\n---\n\n\n*This lecture, as the rest of the course, is adapted from the version [Stephanie C. Hicks](https://www.stephaniehicks.com/) designed and maintained in 2021 and 2022. Check the recent changes to this file through the [GitHub history](https://github.com/lcolladotor/jhustatcomputing2023/commits/main/posts/10-joining-data-in-r/index.qmd).*\n\n\n\n# Pre-lecture materials\n\n### Read ahead\n\n::: callout-note\n## Read ahead\n\n**Before class, you can prepare by reading the following materials:**\n\n1. \n2. \n:::\n\n### Acknowledgements\n\nMaterial for this lecture was borrowed and adopted from\n\n- \n- \n- \n\n# Learning objectives\n\n::: callout-note\n# Learning objectives\n\n**At the end of this lesson you will:**\n\n- Be able to define relational data and keys\n- Be able to define the three types of join functions for relational data\n- Be able to implement mutational join functions\n:::\n\n# Relational data\n\nData analyses rarely involve only a single table of data.\n\nTypically you have many tables of data, and you **must combine the datasets** to answer the questions that you are interested in.\n\nCollectively, **multiple tables of data are called relational data** because it is the *relations*, not just the individual datasets, that are important.\n\nRelations are **always defined between a pair of tables**. All other relations are built up from this simple idea: the relations of three or more tables are always a property of the relations between each pair.\n\nSometimes both elements of a pair can be the same table! This is needed if, for example, you have a table of people, and each person has a reference to their parents.\n\nTo work with relational data you **need verbs that work with pairs of tables**.\n\n::: callout-tip\n### Three important families of verbs\n\nThere are three families of verbs designed to work with relational data:\n\n- [**Mutating joins**](https://r4ds.had.co.nz/relational-data.html#mutating-joins): A mutating join allows you to **combine variables from two tables**. It first matches observations by their keys, then copies across variables from one table to the other on the right side of the table (similar to `mutate()`). We will discuss a few of these below.\n - See @sec-mutjoins for Table of mutating joins.\n- [**Filtering joins**](https://r4ds.had.co.nz/relational-data.html#filtering-joins): Filtering joins **match observations** in the same way as mutating joins, **but affect the observations, not the variables** (i.e. filter observations from one data frame based on whether or not they match an observation in the other).\n - Two types: `semi_join(x, y)` and `anti_join(x, y)`.\n- [**Set operations**](https://r4ds.had.co.nz/relational-data.html#set-operations): Treat **observations as if they were set elements**. Typically used less frequently, but occasionally useful when you want to break a single complex filter into simpler pieces. All these operations work with a complete row, comparing the values of every variable. These expect the x and y inputs to have the same variables, and treat the observations like sets:\n - Examples of set operations: `intersect(x, y)`, `union(x, y)`, and `setdiff(x, y)`.\n:::\n\n## Keys\n\nThe **variables used to connect each pair of tables** are called **keys**. A key is a variable (or set of variables) that uniquely identifies an observation. In simple cases, a single variable is sufficient to identify an observation.\n\n::: callout-tip\n### Note\n\nThere are two types of keys:\n\n- A **primary key** uniquely identifies an observation in its own table.\n- A **foreign key** uniquely identifies an observation in another table.\n:::\n\nLet's consider an example to help us understand the difference between a **primary key** and **foreign key**.\n\n## Example of keys\n\nImagine you are conduct a study and **collecting data on subjects and a health outcome**.\n\nOften, subjects will **make multiple visits** (a so-called longitudinal study) and so we will record the outcome for each visit. Similarly, we may record other information about them, such as the kind of housing they live in.\n\n### The first table\n\nThis code creates a simple table with some made up data about some hypothetical subjects' outcomes.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(tidyverse)\n\noutcomes <- tibble(\n id = rep(c(\"a\", \"b\", \"c\"), each = 3),\n visit = rep(0:2, 3),\n outcome = rnorm(3 * 3, 3)\n)\n\nprint(outcomes)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 9 × 3\n id visit outcome\n \n1 a 0 3.07\n2 a 1 3.25\n3 a 2 3.93\n4 b 0 2.18\n5 b 1 2.91\n6 b 2 2.83\n7 c 0 1.49\n8 c 1 2.56\n9 c 2 1.46\n```\n:::\n:::\n\n\nNote that subjects are labeled by a unique identifer in the `id` column.\n\n### A second table\n\nHere is some code to create a second table (we will be joining the first and second tables shortly). This table contains some data about the hypothetical subjects' housing situation by recording the type of house they live in.\n\n\n::: {.cell exercise='true'}\n\n```{.r .cell-code}\nsubjects <- tibble(\n id = c(\"a\", \"b\", \"c\"),\n house = c(\"detached\", \"rowhouse\", \"rowhouse\")\n)\n\nprint(subjects)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 3 × 2\n id house \n \n1 a detached\n2 b rowhouse\n3 c rowhouse\n```\n:::\n:::\n\n\n::: callout-note\n### Question\n\nWhat is the **primary key** and **foreign key**?\n\n- The `outcomes$id` is a **primary key** because it uniquely identifies each subject in the `outcomes` table.\n- The `subjects$id` is a **foreign key** because it appears in the `subjects` table where it matches each subject to a unique `id`.\n:::\n\n# Mutating joins {#sec-mutjoins}\n\nThe `dplyr` package provides a set of **functions for joining two data frames** into a single data frame based on a set of key columns.\n\nThere are several functions in the `*_join()` family.\n\n- These functions all merge together two data frames\n- They differ in how they handle observations that exist in one but not both data frames.\n\nHere, are the **four functions from this family** that you will likely use the most often:\n\n\n::: {.cell layout-align=\"center\"}\n::: {.cell-output-display}\n|Function |What it includes in merged data frame |\n|:--------------|:---------------------------------------------------------------------------------------------------------|\n|`left_join()` |Includes all observations in the left data frame, whether or not there is a match in the right data frame |\n|`right_join()` |Includes all observations in the right data frame, whether or not there is a match in the left data frame |\n|`inner_join()` |Includes only observations that are in both data frames |\n|`full_join()` |Includes all observations from both data frames |\n:::\n:::\n\n\n![](https://d33wubrfki0l68.cloudfront.net/aeab386461820b029b7e7606ccff1286f623bae1/ef0d4/diagrams/join-venn.png)\n\n\\[[Source from R for Data Science](https://r4ds.had.co.nz/relational-data#relational-data)\\]\n\n## Left Join\n\nRecall the `outcomes` and `subjects` datasets above.\n\n\n::: {.cell}\n\n```{.r .cell-code}\noutcomes\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 9 × 3\n id visit outcome\n \n1 a 0 3.07\n2 a 1 3.25\n3 a 2 3.93\n4 b 0 2.18\n5 b 1 2.91\n6 b 2 2.83\n7 c 0 1.49\n8 c 1 2.56\n9 c 2 1.46\n```\n:::\n\n```{.r .cell-code}\nsubjects\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 3 × 2\n id house \n \n1 a detached\n2 b rowhouse\n3 c rowhouse\n```\n:::\n:::\n\n\nSuppose we want to create a table that combines the information about houses (`subjects`) with the information about the outcomes (`outcomes`).\n\nWe can use the `left_join()` function to merge the `outcomes` and `subjects` tables and produce the output above.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nleft_join(x = outcomes, y = subjects, by = \"id\")\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 9 × 4\n id visit outcome house \n \n1 a 0 3.07 detached\n2 a 1 3.25 detached\n3 a 2 3.93 detached\n4 b 0 2.18 rowhouse\n5 b 1 2.91 rowhouse\n6 b 2 2.83 rowhouse\n7 c 0 1.49 rowhouse\n8 c 1 2.56 rowhouse\n9 c 2 1.46 rowhouse\n```\n:::\n:::\n\n\n::: callout-tip\n### Note\n\nThe `by` argument indicates the column (or columns) that the two tables have in common.\n:::\n\n### Left Join with Incomplete Data\n\nIn the previous examples, the `subjects` table didn't have a `visit` column. But suppose it did? Maybe people move around during the study. We could image a table like this one.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsubjects <- tibble(\n id = c(\"a\", \"b\", \"c\"),\n visit = c(0, 1, 0),\n house = c(\"detached\", \"rowhouse\", \"rowhouse\"),\n)\n\nprint(subjects)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 3 × 3\n id visit house \n \n1 a 0 detached\n2 b 1 rowhouse\n3 c 0 rowhouse\n```\n:::\n:::\n\n\nWhen we left joint the tables now we get:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nleft_join(outcomes, subjects, by = c(\"id\", \"visit\"))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 9 × 4\n id visit outcome house \n \n1 a 0 3.07 detached\n2 a 1 3.25 \n3 a 2 3.93 \n4 b 0 2.18 \n5 b 1 2.91 rowhouse\n6 b 2 2.83 \n7 c 0 1.49 rowhouse\n8 c 1 2.56 \n9 c 2 1.46 \n```\n:::\n:::\n\n\n::: callout-tip\n### Note\n\nTwo things to point out here:\n\n1. If we do not have information about a subject's housing in a given visit, the `left_join()` function automatically inserts an `NA` value to indicate that it is missing.\n\n2. We can \"join\" on multiple variable (e.g. here we joined on the `id` and the `visit` columns).\n:::\n\nWe may even have a situation where we are missing housing data for a subject completely. The following table has no information about subject `a`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsubjects <- tibble(\n id = c(\"b\", \"c\"),\n visit = c(1, 0),\n house = c(\"rowhouse\", \"rowhouse\"),\n)\n\nsubjects\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 2 × 3\n id visit house \n \n1 b 1 rowhouse\n2 c 0 rowhouse\n```\n:::\n:::\n\n\nBut we can still join the tables together and the `house` values for subject `a` will all be `NA`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nleft_join(x = outcomes, y = subjects, by = c(\"id\", \"visit\"))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 9 × 4\n id visit outcome house \n \n1 a 0 3.07 \n2 a 1 3.25 \n3 a 2 3.93 \n4 b 0 2.18 \n5 b 1 2.91 rowhouse\n6 b 2 2.83 \n7 c 0 1.49 rowhouse\n8 c 1 2.56 \n9 c 2 1.46 \n```\n:::\n:::\n\n\n::: callout-tip\n### Important\n\nThe bottom line for `left_join()` is that it **always retains the values in the \"left\" argument** (in this case the `outcomes` table).\n\n- If there are no corresponding values in the \"right\" argument, `NA` values will be filled in.\n:::\n\n## Inner Join\n\nThe `inner_join()` function only **retains the rows of both tables** that have corresponding values. Here we can see the difference.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ninner_join(x = outcomes, y = subjects, by = c(\"id\", \"visit\"))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 2 × 4\n id visit outcome house \n \n1 b 1 2.91 rowhouse\n2 c 0 1.49 rowhouse\n```\n:::\n:::\n\n\n## Right Join\n\nThe `right_join()` function is like the `left_join()` function except that it **gives priority to the \"right\" hand argument**.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nright_join(x = outcomes, y = subjects, by = c(\"id\", \"visit\"))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 2 × 4\n id visit outcome house \n \n1 b 1 2.91 rowhouse\n2 c 0 1.49 rowhouse\n```\n:::\n:::\n\n\n# Summary\n\n- `left_join()` is useful for merging a \"large\" data frame with a \"smaller\" one while retaining all the rows of the \"large\" data frame\n\n- `inner_join()` gives you the intersection of the rows between two data frames\n\n- `right_join()` is like `left_join()` with the arguments reversed (likely only useful at the end of a pipeline)\n\n# Post-lecture materials\n\n### Final Questions\n\nHere are some post-lecture questions to help you think about the material discussed.\n\n::: callout-note\n### Questions\n\n1. If you had three data frames to combine with a shared key, how would you join them using the verbs you now know?\n\n2. Using `df1` and `df2` below, what is the difference between `inner_join(df1, df2)`, `semi_join(df1, df2)` and `anti_join(df1, df2)`?\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# Create first example data frame\ndf1 <- data.frame(\n ID = 1:3,\n X1 = c(\"a1\", \"a2\", \"a3\")\n)\n# Create second example data frame\ndf2 <- data.frame(\n ID = 2:4,\n X2 = c(\"b1\", \"b2\", \"b3\")\n)\n```\n:::\n\n\n3. Try changing the order from the above e.g. `inner_join(df2, df1)`, `semi_join(df2, df1)` and `anti_join(df2, df1)`. What changed? What did not change?\n:::\n\n### Additional Resources\n\n::: callout-tip\n- \n- \n- \n:::\n\n# R session information\n\n\n::: {.cell}\n\n```{.r .cell-code}\noptions(width = 120)\nsessioninfo::session_info()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────\n setting value\n version R version 4.3.1 (2023-06-16)\n os macOS Ventura 13.5\n system aarch64, darwin20\n ui X11\n language (EN)\n collate en_US.UTF-8\n ctype en_US.UTF-8\n tz America/New_York\n date 2023-08-17\n pandoc 3.1.5 @ /opt/homebrew/bin/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────\n package * version date (UTC) lib source\n cli 3.6.1 2023-03-23 [1] CRAN (R 4.3.0)\n colorout 1.2-2 2023-05-06 [1] Github (jalvesaq/colorout@79931fd)\n colorspace 2.1-0 2023-01-23 [1] CRAN (R 4.3.0)\n digest 0.6.33 2023-07-07 [1] CRAN (R 4.3.0)\n dplyr * 1.1.2 2023-04-20 [1] CRAN (R 4.3.0)\n evaluate 0.21 2023-05-05 [1] CRAN (R 4.3.0)\n fansi 1.0.4 2023-01-22 [1] CRAN (R 4.3.0)\n fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.3.0)\n forcats * 1.0.0 2023-01-29 [1] CRAN (R 4.3.0)\n generics 0.1.3 2022-07-05 [1] CRAN (R 4.3.0)\n ggplot2 * 3.4.3 2023-08-14 [1] CRAN (R 4.3.1)\n glue 1.6.2 2022-02-24 [1] CRAN (R 4.3.0)\n gtable 0.3.3 2023-03-21 [1] CRAN (R 4.3.0)\n hms 1.1.3 2023-03-21 [1] CRAN (R 4.3.0)\n htmltools 0.5.6 2023-08-10 [1] CRAN (R 4.3.0)\n htmlwidgets 1.6.2 2023-03-17 [1] CRAN (R 4.3.0)\n jsonlite 1.8.7 2023-06-29 [1] CRAN (R 4.3.0)\n knitr * 1.43 2023-05-25 [1] CRAN (R 4.3.0)\n lifecycle 1.0.3 2022-10-07 [1] CRAN (R 4.3.0)\n lubridate * 1.9.2 2023-02-10 [1] CRAN (R 4.3.0)\n magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.3.0)\n munsell 0.5.0 2018-06-12 [1] CRAN (R 4.3.0)\n pillar 1.9.0 2023-03-22 [1] CRAN (R 4.3.0)\n pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 4.3.0)\n purrr * 1.0.2 2023-08-10 [1] CRAN (R 4.3.0)\n R6 2.5.1 2021-08-19 [1] CRAN (R 4.3.0)\n readr * 2.1.4 2023-02-10 [1] CRAN (R 4.3.0)\n rlang 1.1.1 2023-04-28 [1] CRAN (R 4.3.0)\n rmarkdown 2.24 2023-08-14 [1] CRAN (R 4.3.1)\n rstudioapi 0.15.0 2023-07-07 [1] CRAN (R 4.3.0)\n scales 1.2.1 2022-08-20 [1] CRAN (R 4.3.0)\n sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.3.0)\n stringi 1.7.12 2023-01-11 [1] CRAN (R 4.3.0)\n stringr * 1.5.0 2022-12-02 [1] CRAN (R 4.3.0)\n tibble * 3.2.1 2023-03-20 [1] CRAN (R 4.3.0)\n tidyr * 1.3.0 2023-01-24 [1] CRAN (R 4.3.0)\n tidyselect 1.2.0 2022-10-10 [1] CRAN (R 4.3.0)\n tidyverse * 2.0.0 2023-02-22 [1] CRAN (R 4.3.0)\n timechange 0.2.0 2023-01-11 [1] CRAN (R 4.3.0)\n tzdb 0.4.0 2023-05-12 [1] CRAN (R 4.3.0)\n utf8 1.2.3 2023-01-31 [1] CRAN (R 4.3.0)\n vctrs 0.6.3 2023-06-14 [1] CRAN (R 4.3.0)\n withr 2.5.0 2022-03-03 [1] CRAN (R 4.3.0)\n xfun 0.40 2023-08-09 [1] CRAN (R 4.3.0)\n yaml 2.3.7 2023-01-23 [1] CRAN (R 4.3.0)\n\n [1] /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library\n\n──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n```\n:::\n:::\n", "supporting": [], "filters": [ "rmarkdown/pagebreak.lua" diff --git a/_freeze/posts/11-plotting-systems/index/execute-results/html.json b/_freeze/posts/11-plotting-systems/index/execute-results/html.json index e10a6cd..d091bad 100644 --- a/_freeze/posts/11-plotting-systems/index/execute-results/html.json +++ b/_freeze/posts/11-plotting-systems/index/execute-results/html.json @@ -1,7 +1,7 @@ { - "hash": "33dd70dca1357e6e4f0495a8ce6313a1", + "hash": "6c6916c9091b2c6d74a4ff7c2b8b7db1", "result": { - "markdown": "---\ntitle: \"11 - Plotting Systems\"\nauthor:\n - name: Leonardo Collado Torres\n url: http://lcolladotor.github.io/\n affiliations:\n - id: libd\n name: Lieber Institute for Brain Development\n url: https://libd.org/\n - id: jhsph\n name: Johns Hopkins Bloomberg School of Public Health Department of Biostatistics\n url: https://publichealth.jhu.edu/departments/biostatistics\ndescription: \"Overview of three plotting systems in R\"\ncategories: [module 3, week 3, R, programming, ggplot2, data viz]\n---\n\n\n*This lecture, as the rest of the course, is adapted from the version [Stephanie C. Hicks](https://www.stephaniehicks.com/) designed and maintained in 2021 and 2022. Check the recent changes to this file through the [GitHub history](https://github.com/lcolladotor/jhustatcomputing2023/commits/main/posts/11-plotting-systems/index.qmd).*\n\n> The data may not contain the answer. And, if you torture the data long enough, it will tell you anything. ---*John W. Tukey*\n\n# Pre-lecture materials\n\n### Read ahead\n\n::: callout-note\n## Read ahead\n\n**Before class, you can prepare by reading the following materials:**\n\n1. \n2. Paul Murrell (2011). *R Graphics*, CRC Press.\n3. Hadley Wickham (2009). *ggplot2*, Springer.\n4. Deepayan Sarkar (2008). *Lattice: Multivariate Data Visualization with R*, Springer.\n:::\n\n### Acknowledgements\n\nMaterial for this lecture was borrowed and adopted from\n\n- \n\n# Learning objectives\n\n::: callout-note\n# Learning objectives\n\n**At the end of this lesson you will:**\n\n- Be able to identify and describe the three plotting systems in R\n:::\n\n# Plotting Systems\n\nThere are **three different plotting systems in R** and they each have different characteristics and modes of operation.\n\n::: callout-tip\n### Important\n\nThe three systems are\n\n1. The base plotting system\n2. The lattice system\n3. The ggplot2 system\n\n**This course will focus primarily on the ggplot2 plotting system**. The other two systems are presented for context.\n:::\n\n## The Base Plotting System\n\nThe **base plotting system** is the original plotting system for R. The basic model is sometimes **referred to as the \"artist's palette\" model**.\n\nThe idea is you start with blank canvas and build up from there.\n\nIn more R-specific terms, you **typically start with `plot()` function** (or similar plot creating function) to *initiate* a plot and then *annotate* the plot with various annotation functions (`text`, `lines`, `points`, `axis`)\n\nThe base plotting system is **often the most convenient plotting system** to use because it mirrors how we sometimes think of building plots and analyzing data.\n\nIf we do not have a completely well-formed idea of how we want to look at some data, often we will start by \"throwing some data on the page\" and then slowly add more information to it as our thought process evolves.\n\n::: callout-tip\n### Example\n\nWe might look at a simple scatterplot and then decide to add a linear regression line or a smoother to it to highlight the trends.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ndata(airquality)\nwith(airquality, {\n plot(Temp, Ozone)\n lines(loess.smooth(Temp, Ozone))\n})\n```\n\n::: {.cell-output-display}\n![Scatterplot with loess curve](index_files/figure-html/unnamed-chunk-1-1.png){width=480}\n:::\n:::\n\n:::\n\nIn the code above:\n\n- The `plot()` function creates the initial plot and draws the points (circles) on the canvas.\n- The `lines` function is used to annotate or add to the plot (in this case it adds a loess smoother to the scatterplot).\n\nNext, we use the `plot()` function to draw the points on the scatterplot and then use the `main` argument to add a main title to the plot.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ndata(airquality)\nwith(airquality, {\n plot(Temp, Ozone, main = \"my plot\")\n lines(loess.smooth(Temp, Ozone))\n})\n```\n\n::: {.cell-output-display}\n![Scatterplot with loess curve](index_files/figure-html/unnamed-chunk-2-1.png){width=480}\n:::\n:::\n\n\n::: callout-tip\n### Note\n\nOne downside with constructing base plots is that you **cannot go backwards once the plot has started**.\n\nIt is possible that you could start down the road of constructing a plot and realize later (when it is too late) that you do not have enough room to add a y-axis label or something like that\n:::\n\nIf you have specific plot in mind, there is then a need to **plan in advance** to make sure, for example, that you have set your margins to be the right size to fit all of the annotations that you may want to include.\n\nWhile the base plotting system is nice in that it gives you the flexibility to specify these kinds of details to painstaking accuracy, **sometimes it would be nice if the system could just figure it out for you**.\n\n::: callout-tip\n### Note\n\nAnother downside of the base plotting system is that it is **difficult to describe or translate a plot to others because there is no clear graphical language or grammar** that can be used to communicate what you have done.\n\nThe only real way to describe what you have done in a base plot is to just list the series of commands/functions that you have executed, which is not a particularly compact way of communicating things.\n\nThis is one problem that the `ggplot2` package attempts to address.\n:::\n\n::: callout-tip\n### Example\n\nAnother typical base plot is constructed with the following code.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ndata(cars)\n\n## Create the plot / draw canvas\nwith(cars, plot(speed, dist))\n\n## Add annotation\ntitle(\"Speed vs. Stopping distance\")\n```\n\n::: {.cell-output-display}\n![Base plot with title](index_files/figure-html/unnamed-chunk-3-1.png){width=480}\n:::\n:::\n\n:::\n\nWe will go into more detail on what these functions do in later lessons.\n\n## The Lattice System\n\nThe **lattice plotting system** is implemented in the `lattice` R package which comes with every installation of R (although it is not loaded by default).\n\nTo **use the lattice plotting functions**, you must first load the `lattice` package with the `library` function.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(lattice)\n```\n:::\n\n\nWith the lattice system, **plots are created with a single function call**, such as `xyplot()` or `bwplot()`.\n\nThere is **no real distinction between functions that create or initiate plots** and **functions that annotate plots** because it all happens at once.\n\nLattice plots tend to be **most useful for conditioning types of plots**, i.e. looking at how `y` changes with `x` across levels of `z`.\n\n- e.g. these types of plots are useful for looking at multi-dimensional data and often allow you to squeeze a lot of information into a single window or page.\n\nAnother aspect of lattice that makes it different from base plotting is that **things like margins and spacing are set automatically**.\n\nThis is possible because entire plot is specified at once via a single function call, so all of the available information needed to figure out the spacing and margins is already there.\n\n::: callout-tip\n### Example\n\nHere is a lattice plot that looks at the relationship between life expectancy and income and how that relationship varies by region in the United States.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nstate <- data.frame(state.x77, region = state.region)\nxyplot(Life.Exp ~ Income | region, data = state, layout = c(4, 1))\n```\n\n::: {.cell-output-display}\n![Lattice plot](index_files/figure-html/unnamed-chunk-5-1.png){width=768}\n:::\n:::\n\n:::\n\nYou can see that the entire plot was generated by the call to `xyplot()` and all of the data for the plot were stored in the `state` data frame.\n\nThe **plot itself contains four panels**---one for each region---and **within each panel is a scatterplot** of life expectancy and income.\n\nThe notion of *panels* comes up a lot with lattice plots because you typically have many panels in a lattice plot (each panel typically represents a *condition*, like \"region\").\n\n::: callout-tip\n### Note\n\nDownsides with the lattice system\n\n- It can sometimes be very **awkward to specify an entire plot** in a single function call (you end up with functions with many many arguments).\n- **Annotation in panels in plots is not especially intuitive** and can be difficult to explain. In particular, the use of custom panel functions and subscripts can be difficult to wield and requires intense preparation.\n- Once a plot is created, **you cannot \"add\" to the plot** (but of course you can just make it again with modifications).\n:::\n\n## The ggplot2 System\n\nThe **ggplot2 plotting system** attempts to split the difference between base and lattice in a number of ways.\n\n::: callout-tip\n### Note\n\nTaking cues from lattice, the ggplot2 system automatically deals with spacings, text, titles but also allows you to annotate by \"adding\" to a plot.\n:::\n\nThe ggplot2 system is implemented in the `ggplot2` package (part of the `tidyverse` package), which is available from CRAN (it does not come with R).\n\nYou can install it from CRAN via\n\n\n::: {.cell}\n\n```{.r .cell-code}\ninstall.packages(\"ggplot2\")\n```\n:::\n\n\nand then load it into R via the `library()` function.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(ggplot2)\n```\n:::\n\n\nSuperficially, the `ggplot2` functions are similar to `lattice`, but the system is generally easier and more intuitive to use.\n\nThe defaults used in `ggplot2` make many choices for you, but you can still customize plots to your heart's desire.\n\n::: callout-tip\n### Example\n\nA typical plot with the `ggplot2` package looks as follows.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(tidyverse)\ndata(mpg)\nmpg %>%\n ggplot(aes(displ, hwy)) + \n geom_point()\n```\n\n::: {.cell-output-display}\n![ggplot2 plot](index_files/figure-html/unnamed-chunk-8-1.png){width=576}\n:::\n:::\n\n:::\n\nThere are additional functions in `ggplot2` that allow you to make arbitrarily sophisticated plots.\n\nWe will discuss more about this in the next lecture.\n\n# R session information\n\n\n::: {.cell}\n\n```{.r .cell-code}\noptions(width = 120)\nsessioninfo::session_info()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────\n setting value\n version R version 4.3.1 (2023-06-16)\n os macOS Ventura 13.5\n system aarch64, darwin20\n ui X11\n language (EN)\n collate en_US.UTF-8\n ctype en_US.UTF-8\n tz America/New_York\n date 2023-08-17\n pandoc 3.1.5 @ /opt/homebrew/bin/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────\n package * version date (UTC) lib source\n cli 3.6.1 2023-03-23 [1] CRAN (R 4.3.0)\n colorout 1.2-2 2023-05-06 [1] Github (jalvesaq/colorout@79931fd)\n colorspace 2.1-0 2023-01-23 [1] CRAN (R 4.3.0)\n digest 0.6.33 2023-07-07 [1] CRAN (R 4.3.0)\n dplyr * 1.1.2 2023-04-20 [1] CRAN (R 4.3.0)\n evaluate 0.21 2023-05-05 [1] CRAN (R 4.3.0)\n fansi 1.0.4 2023-01-22 [1] CRAN (R 4.3.0)\n farver 2.1.1 2022-07-06 [1] CRAN (R 4.3.0)\n fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.3.0)\n forcats * 1.0.0 2023-01-29 [1] CRAN (R 4.3.0)\n generics 0.1.3 2022-07-05 [1] CRAN (R 4.3.0)\n ggplot2 * 3.4.3 2023-08-14 [1] CRAN (R 4.3.1)\n glue 1.6.2 2022-02-24 [1] CRAN (R 4.3.0)\n gtable 0.3.3 2023-03-21 [1] CRAN (R 4.3.0)\n hms 1.1.3 2023-03-21 [1] CRAN (R 4.3.0)\n htmltools 0.5.6 2023-08-10 [1] CRAN (R 4.3.0)\n htmlwidgets 1.6.2 2023-03-17 [1] CRAN (R 4.3.0)\n jsonlite 1.8.7 2023-06-29 [1] CRAN (R 4.3.0)\n knitr 1.43 2023-05-25 [1] CRAN (R 4.3.0)\n labeling 0.4.2 2020-10-20 [1] CRAN (R 4.3.0)\n lattice * 0.21-8 2023-04-05 [1] CRAN (R 4.3.1)\n lifecycle 1.0.3 2022-10-07 [1] CRAN (R 4.3.0)\n lubridate * 1.9.2 2023-02-10 [1] CRAN (R 4.3.0)\n magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.3.0)\n munsell 0.5.0 2018-06-12 [1] CRAN (R 4.3.0)\n pillar 1.9.0 2023-03-22 [1] CRAN (R 4.3.0)\n pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 4.3.0)\n purrr * 1.0.2 2023-08-10 [1] CRAN (R 4.3.0)\n R6 2.5.1 2021-08-19 [1] CRAN (R 4.3.0)\n readr * 2.1.4 2023-02-10 [1] CRAN (R 4.3.0)\n rlang 1.1.1 2023-04-28 [1] CRAN (R 4.3.0)\n rmarkdown 2.24 2023-08-14 [1] CRAN (R 4.3.1)\n rstudioapi 0.15.0 2023-07-07 [1] CRAN (R 4.3.0)\n scales 1.2.1 2022-08-20 [1] CRAN (R 4.3.0)\n sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.3.0)\n stringi 1.7.12 2023-01-11 [1] CRAN (R 4.3.0)\n stringr * 1.5.0 2022-12-02 [1] CRAN (R 4.3.0)\n tibble * 3.2.1 2023-03-20 [1] CRAN (R 4.3.0)\n tidyr * 1.3.0 2023-01-24 [1] CRAN (R 4.3.0)\n tidyselect 1.2.0 2022-10-10 [1] CRAN (R 4.3.0)\n tidyverse * 2.0.0 2023-02-22 [1] CRAN (R 4.3.0)\n timechange 0.2.0 2023-01-11 [1] CRAN (R 4.3.0)\n tzdb 0.4.0 2023-05-12 [1] CRAN (R 4.3.0)\n utf8 1.2.3 2023-01-31 [1] CRAN (R 4.3.0)\n vctrs 0.6.3 2023-06-14 [1] CRAN (R 4.3.0)\n withr 2.5.0 2022-03-03 [1] CRAN (R 4.3.0)\n xfun 0.40 2023-08-09 [1] CRAN (R 4.3.0)\n yaml 2.3.7 2023-01-23 [1] CRAN (R 4.3.0)\n\n [1] /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library\n\n──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n```\n:::\n:::\n", + "markdown": "---\ntitle: \"11 - Plotting Systems\"\nauthor:\n - name: Leonardo Collado Torres\n url: http://lcolladotor.github.io/\n affiliations:\n - id: libd\n name: Lieber Institute for Brain Development\n url: https://libd.org/\n - id: jhsph\n name: Johns Hopkins Bloomberg School of Public Health Department of Biostatistics\n url: https://publichealth.jhu.edu/departments/biostatistics\ndescription: \"Overview of three plotting systems in R\"\ncategories: [module 3, week 3, R, programming, ggplot2, data viz]\n---\n\n\n*This lecture, as the rest of the course, is adapted from the version [Stephanie C. Hicks](https://www.stephaniehicks.com/) designed and maintained in 2021 and 2022. Check the recent changes to this file through the [GitHub history](https://github.com/lcolladotor/jhustatcomputing2023/commits/main/posts/11-plotting-systems/index.qmd).*\n\n> The data may not contain the answer. And, if you torture the data long enough, it will tell you anything. ---*John W. Tukey*\n\n# Pre-lecture materials\n\n### Read ahead\n\n::: callout-note\n## Read ahead\n\n**Before class, you can prepare by reading the following materials:**\n\n1. \n2. Paul Murrell (2011). *R Graphics*, CRC Press.\n3. Hadley Wickham (2009). *ggplot2*, Springer.\n4. Deepayan Sarkar (2008). *Lattice: Multivariate Data Visualization with R*, Springer.\n:::\n\n### Acknowledgements\n\nMaterial for this lecture was borrowed and adopted from\n\n- \n\n# Learning objectives\n\n::: callout-note\n# Learning objectives\n\n**At the end of this lesson you will:**\n\n- Be able to identify and describe the three plotting systems in R\n:::\n\n# Plotting Systems\n\nThere are **three different plotting systems in R** and they each have different characteristics and modes of operation.\n\n::: callout-tip\n### Important\n\nThe three systems are\n\n1. The base plotting system\n2. The lattice system\n3. The ggplot2 system\n\n**This course will focus primarily on the ggplot2 plotting system**. The other two systems are presented for context.\n:::\n\n## The Base Plotting System\n\nThe **base plotting system** is the original plotting system for R. The basic model is sometimes **referred to as the \"artist's palette\" model**.\n\nThe idea is you start with blank canvas and build up from there.\n\nIn more R-specific terms, you **typically start with `plot()` function** (or similar plot creating function) to *initiate* a plot and then *annotate* the plot with various annotation functions (`text`, `lines`, `points`, `axis`)\n\nThe base plotting system is **often the most convenient plotting system** to use because it mirrors how we sometimes think of building plots and analyzing data.\n\nIf we do not have a completely well-formed idea of how we want to look at some data, often we will start by \"throwing some data on the page\" and then slowly add more information to it as our thought process evolves.\n\n::: callout-tip\n### Example\n\nWe might look at a simple scatterplot and then decide to add a linear regression line or a smoother to it to highlight the trends.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ndata(airquality)\nwith(airquality, {\n plot(Temp, Ozone)\n lines(loess.smooth(Temp, Ozone))\n})\n```\n\n::: {.cell-output-display}\n![Scatterplot with loess curve](index_files/figure-html/unnamed-chunk-1-1.png){width=480}\n:::\n:::\n\n:::\n\nIn the code above:\n\n- The `plot()` function creates the initial plot and draws the points (circles) on the canvas.\n- The `lines` function is used to annotate or add to the plot (in this case it adds a loess smoother to the scatterplot).\n\nNext, we use the `plot()` function to draw the points on the scatterplot and then use the `main` argument to add a main title to the plot.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ndata(airquality)\nwith(airquality, {\n plot(Temp, Ozone, main = \"my plot\")\n lines(loess.smooth(Temp, Ozone))\n})\n```\n\n::: {.cell-output-display}\n![Scatterplot with loess curve](index_files/figure-html/unnamed-chunk-2-1.png){width=480}\n:::\n:::\n\n\n::: callout-tip\n### Note\n\nOne downside with constructing base plots is that you **cannot go backwards once the plot has started**.\n\nIt is possible that you could start down the road of constructing a plot and realize later (when it is too late) that you do not have enough room to add a y-axis label or something like that\n:::\n\nIf you have specific plot in mind, there is then a need to **plan in advance** to make sure, for example, that you have set your margins to be the right size to fit all of the annotations that you may want to include.\n\nWhile the base plotting system is nice in that it gives you the flexibility to specify these kinds of details to painstaking accuracy, **sometimes it would be nice if the system could just figure it out for you**.\n\n::: callout-tip\n### Note\n\nAnother downside of the base plotting system is that it is **difficult to describe or translate a plot to others because there is no clear graphical language or grammar** that can be used to communicate what you have done.\n\nThe only real way to describe what you have done in a base plot is to just list the series of commands/functions that you have executed, which is not a particularly compact way of communicating things.\n\nThis is one problem that the `ggplot2` package attempts to address.\n:::\n\n::: callout-tip\n### Example\n\nAnother typical base plot is constructed with the following code.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ndata(cars)\n\n## Create the plot / draw canvas\nwith(cars, plot(speed, dist))\n\n## Add annotation\ntitle(\"Speed vs. Stopping distance\")\n```\n\n::: {.cell-output-display}\n![Base plot with title](index_files/figure-html/unnamed-chunk-3-1.png){width=480}\n:::\n:::\n\n:::\n\nWe will go into more detail on what these functions do in later lessons.\n\n## The Lattice System\n\nThe **lattice plotting system** is implemented in the `lattice` R package which comes with every installation of R (although it is not loaded by default).\n\nTo **use the lattice plotting functions**, you must first load the `lattice` package with the `library` function.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(lattice)\n```\n:::\n\n\nWith the lattice system, **plots are created with a single function call**, such as `xyplot()` or `bwplot()`.\n\nThere is **no real distinction between functions that create or initiate plots** and **functions that annotate plots** because it all happens at once.\n\nLattice plots tend to be **most useful for conditioning types of plots**, i.e. looking at how `y` changes with `x` across levels of `z`.\n\n- e.g. these types of plots are useful for looking at multi-dimensional data and often allow you to squeeze a lot of information into a single window or page.\n\nAnother aspect of lattice that makes it different from base plotting is that **things like margins and spacing are set automatically**.\n\nThis is possible because entire plot is specified at once via a single function call, so all of the available information needed to figure out the spacing and margins is already there.\n\n::: callout-tip\n### Example\n\nHere is a lattice plot that looks at the relationship between life expectancy and income and how that relationship varies by region in the United States.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nstate <- data.frame(state.x77, region = state.region)\nxyplot(Life.Exp ~ Income | region, data = state, layout = c(4, 1))\n```\n\n::: {.cell-output-display}\n![Lattice plot](index_files/figure-html/unnamed-chunk-5-1.png){width=768}\n:::\n:::\n\n:::\n\nYou can see that the entire plot was generated by the call to `xyplot()` and all of the data for the plot were stored in the `state` data frame.\n\nThe **plot itself contains four panels**---one for each region---and **within each panel is a scatterplot** of life expectancy and income.\n\nThe notion of *panels* comes up a lot with lattice plots because you typically have many panels in a lattice plot (each panel typically represents a *condition*, like \"region\").\n\n::: callout-tip\n### Note\n\nDownsides with the lattice system\n\n- It can sometimes be very **awkward to specify an entire plot** in a single function call (you end up with functions with many many arguments).\n- **Annotation in panels in plots is not especially intuitive** and can be difficult to explain. In particular, the use of custom panel functions and subscripts can be difficult to wield and requires intense preparation.\n- Once a plot is created, **you cannot \"add\" to the plot** (but of course you can just make it again with modifications).\n:::\n\n## The ggplot2 System\n\nThe **ggplot2 plotting system** attempts to split the difference between base and lattice in a number of ways.\n\n::: callout-tip\n### Note\n\nTaking cues from lattice, the ggplot2 system automatically deals with spacings, text, titles but also allows you to annotate by \"adding\" to a plot.\n:::\n\nThe ggplot2 system is implemented in the `ggplot2` package (part of the `tidyverse` package), which is available from CRAN (it does not come with R).\n\nYou can install it from CRAN via\n\n\n::: {.cell}\n\n```{.r .cell-code}\ninstall.packages(\"ggplot2\")\n```\n:::\n\n\nand then load it into R via the `library()` function.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(ggplot2)\n```\n:::\n\n\nSuperficially, the `ggplot2` functions are similar to `lattice`, but the system is generally easier and more intuitive to use.\n\nThe defaults used in `ggplot2` make many choices for you, but you can still customize plots to your heart's desire.\n\n::: callout-tip\n### Example\n\nA typical plot with the `ggplot2` package looks as follows.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(tidyverse)\ndata(mpg)\nmpg %>%\n ggplot(aes(displ, hwy)) +\n geom_point()\n```\n\n::: {.cell-output-display}\n![ggplot2 plot](index_files/figure-html/unnamed-chunk-8-1.png){width=576}\n:::\n:::\n\n:::\n\nThere are additional functions in `ggplot2` that allow you to make arbitrarily sophisticated plots.\n\nWe will discuss more about this in the next lecture.\n\n# R session information\n\n\n::: {.cell}\n\n```{.r .cell-code}\noptions(width = 120)\nsessioninfo::session_info()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────\n setting value\n version R version 4.3.1 (2023-06-16)\n os macOS Ventura 13.5\n system aarch64, darwin20\n ui X11\n language (EN)\n collate en_US.UTF-8\n ctype en_US.UTF-8\n tz America/New_York\n date 2023-08-17\n pandoc 3.1.5 @ /opt/homebrew/bin/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────\n package * version date (UTC) lib source\n cli 3.6.1 2023-03-23 [1] CRAN (R 4.3.0)\n colorout 1.2-2 2023-05-06 [1] Github (jalvesaq/colorout@79931fd)\n colorspace 2.1-0 2023-01-23 [1] CRAN (R 4.3.0)\n digest 0.6.33 2023-07-07 [1] CRAN (R 4.3.0)\n dplyr * 1.1.2 2023-04-20 [1] CRAN (R 4.3.0)\n evaluate 0.21 2023-05-05 [1] CRAN (R 4.3.0)\n fansi 1.0.4 2023-01-22 [1] CRAN (R 4.3.0)\n farver 2.1.1 2022-07-06 [1] CRAN (R 4.3.0)\n fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.3.0)\n forcats * 1.0.0 2023-01-29 [1] CRAN (R 4.3.0)\n generics 0.1.3 2022-07-05 [1] CRAN (R 4.3.0)\n ggplot2 * 3.4.3 2023-08-14 [1] CRAN (R 4.3.1)\n glue 1.6.2 2022-02-24 [1] CRAN (R 4.3.0)\n gtable 0.3.3 2023-03-21 [1] CRAN (R 4.3.0)\n hms 1.1.3 2023-03-21 [1] CRAN (R 4.3.0)\n htmltools 0.5.6 2023-08-10 [1] CRAN (R 4.3.0)\n htmlwidgets 1.6.2 2023-03-17 [1] CRAN (R 4.3.0)\n jsonlite 1.8.7 2023-06-29 [1] CRAN (R 4.3.0)\n knitr 1.43 2023-05-25 [1] CRAN (R 4.3.0)\n labeling 0.4.2 2020-10-20 [1] CRAN (R 4.3.0)\n lattice * 0.21-8 2023-04-05 [1] CRAN (R 4.3.1)\n lifecycle 1.0.3 2022-10-07 [1] CRAN (R 4.3.0)\n lubridate * 1.9.2 2023-02-10 [1] CRAN (R 4.3.0)\n magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.3.0)\n munsell 0.5.0 2018-06-12 [1] CRAN (R 4.3.0)\n pillar 1.9.0 2023-03-22 [1] CRAN (R 4.3.0)\n pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 4.3.0)\n purrr * 1.0.2 2023-08-10 [1] CRAN (R 4.3.0)\n R6 2.5.1 2021-08-19 [1] CRAN (R 4.3.0)\n readr * 2.1.4 2023-02-10 [1] CRAN (R 4.3.0)\n rlang 1.1.1 2023-04-28 [1] CRAN (R 4.3.0)\n rmarkdown 2.24 2023-08-14 [1] CRAN (R 4.3.1)\n rstudioapi 0.15.0 2023-07-07 [1] CRAN (R 4.3.0)\n scales 1.2.1 2022-08-20 [1] CRAN (R 4.3.0)\n sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.3.0)\n stringi 1.7.12 2023-01-11 [1] CRAN (R 4.3.0)\n stringr * 1.5.0 2022-12-02 [1] CRAN (R 4.3.0)\n tibble * 3.2.1 2023-03-20 [1] CRAN (R 4.3.0)\n tidyr * 1.3.0 2023-01-24 [1] CRAN (R 4.3.0)\n tidyselect 1.2.0 2022-10-10 [1] CRAN (R 4.3.0)\n tidyverse * 2.0.0 2023-02-22 [1] CRAN (R 4.3.0)\n timechange 0.2.0 2023-01-11 [1] CRAN (R 4.3.0)\n tzdb 0.4.0 2023-05-12 [1] CRAN (R 4.3.0)\n utf8 1.2.3 2023-01-31 [1] CRAN (R 4.3.0)\n vctrs 0.6.3 2023-06-14 [1] CRAN (R 4.3.0)\n withr 2.5.0 2022-03-03 [1] CRAN (R 4.3.0)\n xfun 0.40 2023-08-09 [1] CRAN (R 4.3.0)\n yaml 2.3.7 2023-01-23 [1] CRAN (R 4.3.0)\n\n [1] /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library\n\n──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n```\n:::\n:::\n", "supporting": [ "index_files" ], diff --git a/_freeze/posts/12-ggplot2-plotting-system-part-1/index/execute-results/html.json b/_freeze/posts/12-ggplot2-plotting-system-part-1/index/execute-results/html.json index a32e326..36e05af 100644 --- a/_freeze/posts/12-ggplot2-plotting-system-part-1/index/execute-results/html.json +++ b/_freeze/posts/12-ggplot2-plotting-system-part-1/index/execute-results/html.json @@ -1,7 +1,7 @@ { - "hash": "7a7a1e3161c0ff96ad2a3bef68a62f06", + "hash": "94c3dfcaf944f3b724e55205af55c601", "result": { - "markdown": "---\ntitle: \"12 - The ggplot2 plotting system: qplot()\"\nauthor:\n - name: Leonardo Collado Torres\n url: http://lcolladotor.github.io/\n affiliations:\n - id: libd\n name: Lieber Institute for Brain Development\n url: https://libd.org/\n - id: jhsph\n name: Johns Hopkins Bloomberg School of Public Health Department of Biostatistics\n url: https://publichealth.jhu.edu/departments/biostatistics\ndescription: \"An overview of the ggplot2 plotting system in R with qplot()\"\ncategories: [module 3, week 3, R, programming, ggplot2, data viz]\n---\n\n\n*This lecture, as the rest of the course, is adapted from the version [Stephanie C. Hicks](https://www.stephaniehicks.com/) designed and maintained in 2021 and 2022. Check the recent changes to this file through the [GitHub history](https://github.com/lcolladotor/jhustatcomputing2023/commits/main/posts/12-ggplot2-plotting-system-part-1/index.qmd).*\n\n> \"The greatest value of a picture is when it forces us to notice what we never expected to see.\" ---John Tukey\n\n# Pre-lecture materials\n\n### Read ahead\n\n::: callout-note\n## Read ahead\n\n**Before class, you can prepare by reading the following materials:**\n\n1. \n2. \n:::\n\n### Acknowledgements\n\nMaterial for this lecture was borrowed and adopted from\n\n- \n\n# Learning objectives\n\n::: callout-note\n# Learning objectives\n\n**At the end of this lesson you will:**\n\n- Recognize the difference between *aesthetics* and *geoms*\n- Become familiar with different types of plots (e.g. scatterplots, boxplots, and histograms)\n- Be able to facet plots into a grid\n:::\n\n# The ggplot2 Plotting System\n\nThe `ggplot2` package in R is **an implementation of *The Grammar of Graphics*** as described by Leland Wilkinson in his book. The **package was originally written by Hadley Wickham** while he was a graduate student at Iowa State University (he still actively maintains the package).\n\nThe package implements what might be considered a third graphics system for R (along with `base` graphics and `lattice`).\n\nThe package is available from [CRAN](http://cran.r-project.org/package=ggplot2) via `install.packages()`; the latest version of the source can be found on the package's [GitHub Repository](https://github.com/hadley/ggplot2). Documentation of the package can be found at [the tidyverse web site](https://ggplot2.tidyverse.org).\n\nThe **grammar of graphics** represents **an abstraction of graphics ideas and objects**.\n\nYou can think of this as **developing the verbs, nouns, and adjectives for data graphics**.\n\n::: callout-tip\n### Note\n\nDeveloping such a **grammar allows for a \"theory\" of graphics** on which to build new graphics and graphics objects.\n\nTo quote from Hadley Wickham's book on `ggplot2`, we want to \"shorten the distance from mind to page\". In summary,\n\n> \"...the grammar tells us that a statistical graphic is a **mapping** from data to **aesthetic** attributes (colour, shape, size) of **geometric** objects (points, lines, bars). The plot may also contain statistical transformations of the data and is drawn on a specific coordinate system\" -- from *ggplot2* book\n:::\n\nYou might ask yourself \"Why do we need a grammar of graphics?\".\n\nWell, for much the same reasons that **having a grammar is useful for spoken languages**. The grammar allows for\n\n- A more compact summary of the base components of a language\n- An extension of the language to handle situations that we have not before seen\n\nIf you think about making a plot with the base graphics system, the plot is **constructed by calling a series of functions that either create or annotate a plot**. There's **no convenient agreed-upon way to describe the plot**, except to just recite the series of R functions that were called to create the thing in the first place.\n\n::: callout-tip\n### Example\n\nConsider the following plot made using base graphics previously.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nwith(airquality, { \n plot(Temp, Ozone)\n lines(loess.smooth(Temp, Ozone))\n})\n```\n\n::: {.cell-output-display}\n![Scatterplot of Temperature and Ozone in New York (base graphics)](index_files/figure-html/unnamed-chunk-1-1.png){width=480}\n:::\n:::\n\n\nHow would one **describe the creation of this plot**?\n\nWell, we could say that we called the `plot()` function and then added a loess smoother by calling the `lines()` function on the output of `loess.smooth()`.\n\nWhile the base plotting system is convenient and it often mirrors how we think of building plots and analyzing data, there are **drawbacks**:\n\n- You cannot go back once plot has started (e.g. to adjust margins), so there is in fact a need to plan in advance.\n- It is difficult to \"translate\" a plot to others because there is no formal graphical language; each plot is just a series of R commands.\n:::\n\nHere is the same plot made using `ggplot2` in the `tidyverse`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(tidyverse)\nairquality %>%\n ggplot(aes(Temp, Ozone)) + \n geom_point() + \n geom_smooth(method = \"loess\", \n se = FALSE) + \n theme_minimal()\n```\n\n::: {.cell-output-display}\n![Scatterplot of Temperature and Ozone in New York (ggplot2)](index_files/figure-html/unnamed-chunk-2-1.png){width=672}\n:::\n:::\n\n\n::: callout-tip\n### Note\n\nThe output is roughly equivalent and the amount of code is similar, but `ggplot2` allows for a more elegant way of expressing the components of the plot.\n\nIn this case, the plot is a **dataset** (`airquality`) with **aesthetic mappings** (visual properties of the objects in your plot) derived from the `Temp` and `Ozone` variables, a set of **points**, and a **smoother**.\n:::\n\nIn a sense, the `ggplot2` system takes many of the cues from the base plotting system and from the `lattice` plotting systems, and formalizes the cues a bit.\n\nIt **automatically handles things like margins and spacing**, and also has the concept of \"themes\" which **provide a default set of plotting symbols and colors** (which are all customizable).\n\nWhile `ggplot2` bears a superficial similarity to `lattice`, `ggplot2` is generally easier and more intuitive to use.\n\n## The Basics: `qplot()`\n\nThe `qplot()` function in `ggplot2` is meant to get you going **q**uickly.\n\nIt works much like the `plot()` function in base graphics system. It **looks for variables to plot within a data frame**, similar to lattice, or in the parent environment.\n\nIn general, it is good to get used to putting your data in a data frame and then passing it to `qplot()`.\n\n::: callout-tip\n### Pro tip\n\nThe `qplot()` function is **somewhat discouraged** in `ggplot2` now and new users are encouraged to use the more general `ggplot()` function (more details in the next lesson).\n\nHowever, the `qplot()` function is still useful and may be easier to use if transitioning from the base plotting system or a different statistical package.\n:::\n\nPlots are made up of\n\n- **aesthetics** (e.g. size, shape, color)\n- **geoms** (e.g. points, lines)\n\nFactors play an important role for indicating subsets of the data (if they are to have different properties) so they should be **labeled** properly.\n\nThe `qplot()` hides much of what goes on underneath, which is okay for most operations, `ggplot()` is the core function and is very flexible for doing things `qplot()` cannot do.\n\n## Before you start: label your data\n\nOne thing that is always true, but is particularly useful when using `ggplot2`, is that you should always **use informative and descriptive labels on your data**.\n\nMore generally, your data should have appropriate **metadata** so that you can quickly look at a dataset and know\n\n- what are variables?\n- what do the values of each variable mean?\n\n::: callout-tip\n### Pro tip\n\n- **Each column** of a data frame should **have a meaningful (but concise) variable name** that accurately reflects the data stored in that column\n- Non-numeric or **categorical variables should be coded as factor variables** and have meaningful labels for each level of the factor.\n - Might be common to code a binary variable as a \"0\" or a \"1\", but the problem is that from quickly looking at the data, it's impossible to know whether which level of that variable is represented by a \"0\" or a \"1\".\n - Much better to simply label each observation as what they are.\n - If a variable represents temperature categories, it might be better to use \"cold\", \"mild\", and \"hot\" rather than \"1\", \"2\", and \"3\".\n:::\n\nWhile it is sometimes a pain to make sure all of your data are properly labeled, this **investment in time can pay dividends down the road** when you're trying to figure out what you were plotting.\n\nIn other words, including the proper metadata can make your exploratory plots essentially self-documenting.\n\n## ggplot2 \"Hello, world!\"\n\nThis example dataset comes with the `ggplot2` package and contains data on the fuel economy of 38 popular car models from 1999 to 2008.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(tidyverse) # this loads the ggplot2 R package\n# library(ggplot2) # an alternative way to just load the ggplot2 R package\nglimpse(mpg)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nRows: 234\nColumns: 11\n$ manufacturer \"audi\", \"audi\", \"audi\", \"audi\", \"audi\", \"audi\", \"audi\", \"…\n$ model \"a4\", \"a4\", \"a4\", \"a4\", \"a4\", \"a4\", \"a4\", \"a4 quattro\", \"…\n$ displ 1.8, 1.8, 2.0, 2.0, 2.8, 2.8, 3.1, 1.8, 1.8, 2.0, 2.0, 2.…\n$ year 1999, 1999, 2008, 2008, 1999, 1999, 2008, 1999, 1999, 200…\n$ cyl 4, 4, 4, 4, 6, 6, 6, 4, 4, 4, 4, 6, 6, 6, 6, 6, 6, 8, 8, …\n$ trans \"auto(l5)\", \"manual(m5)\", \"manual(m6)\", \"auto(av)\", \"auto…\n$ drv \"f\", \"f\", \"f\", \"f\", \"f\", \"f\", \"f\", \"4\", \"4\", \"4\", \"4\", \"4…\n$ cty 18, 21, 20, 21, 16, 18, 18, 18, 16, 20, 19, 15, 17, 17, 1…\n$ hwy 29, 29, 31, 30, 26, 26, 27, 26, 25, 28, 27, 25, 25, 25, 2…\n$ fl \"p\", \"p\", \"p\", \"p\", \"p\", \"p\", \"p\", \"p\", \"p\", \"p\", \"p\", \"p…\n$ class \"compact\", \"compact\", \"compact\", \"compact\", \"compact\", \"c…\n```\n:::\n:::\n\n\nYou can see from the `glimpse()` (part of the `dplyr` package) output that all of the categorical variables (like \"manufacturer\" or \"class\") are \\*\\*appropriately coded with meaningful label\\*s\\*\\*.\n\nThis will come in handy when `qplot()` has to label different aspects of a plot.\n\nAlso note that all of the **columns/variables have meaningful names** (if sometimes abbreviated), rather than names like \"X1\", and \"X2\", etc.\n\n::: callout-tip\n### Example\n\nWe can **make a quick scatterplot** using `qplot()` of the engine displacement (`displ`) and the highway miles per gallon (`hwy`).\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(x = displ, y = hwy, data = mpg)\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nWarning: `qplot()` was deprecated in ggplot2 3.4.0.\n```\n:::\n\n::: {.cell-output-display}\n![Plot of engine displacement and highway mileage using the mtcars dataset](index_files/figure-html/unnamed-chunk-4-1.png){width=672}\n:::\n:::\n\n:::\n\nIt has a *very* similar feeling to `plot()` in base R.\n\n::: callout-tip\n### Note\n\nIn the call to `qplot()` you **must specify the `data` argument** so that `qplot()` knows where to look up the variables.\n\nYou must also specify `x` and `y`, but hopefully that part is obvious.\n:::\n\n## Modifying aesthetics\n\nWe can introduce a third variable into the plot by **modifying the color** of the points based on the value of that third variable.\n\nColor (or colour) is one type of **aesthetic** and using the `ggplot2` language:\n\n> \"the color of each point can be mapped to a variable\"\n\nThis sounds technical, but let's give an example.\n\n::: callout-tip\n### Example\n\nWe map the `color` argument to the `drv` variable, which indicates whether a car is front wheel drive, rear wheel drive, or 4-wheel drive.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(displ, hwy, data = mpg, color = drv)\n```\n\n::: {.cell-output-display}\n![Engine displacement and highway mileage by drive class](index_files/figure-html/unnamed-chunk-5-1.png){width=672}\n:::\n:::\n\n:::\n\nNow we can see that the front wheel drive cars tend to have lower displacement relative to the 4-wheel or rear wheel drive cars.\n\nAlso, it's clear that the 4-wheel drive cars have the lowest highway gas mileage.\n\n::: callout-tip\n### Note\n\nThe `x` argument and `y` argument are aesthetics too, and they got mapped to the `displ` and `hwy` variables, respectively.\n:::\n\n::: callout-note\n### Question\n\nIn the above plot, I did not specify the `x` and `y` variable. What happens when you run these two code chunks. What's the difference?\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(displ, hwy, data = mpg, color = drv)\n```\n:::\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(x = displ, y = hwy, data = mpg, color = drv)\n```\n:::\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(hwy, displ, data = mpg, color = drv)\n```\n:::\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(y = hwy, x = displ, data = mpg, color = drv)\n```\n:::\n\n:::\n\n::: callout-tip\n### Example\n\nLet's try mapping colors in another dataset, namely the [palmerpenguins](https://allisonhorst.github.io/palmerpenguins/) dataset. These data contain observations for 344 penguins. There are 3 different species of penguins in this dataset, collected from 3 islands in the Palmer Archipelago, Antarctica.\n\n\n::: {.cell layout-align=\"center\"}\n::: {.cell-output-display}\n![Palmer penguins](https://allisonhorst.github.io/palmerpenguins/reference/figures/lter_penguins.png){fig-align='center' width=60%}\n:::\n:::\n\n\n\\[**Source**: [Artwork by Allison Horst](https://github.com/allisonhorst/stats-illustrations)\\]\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(palmerpenguins)\n```\n:::\n\n::: {.cell}\n\n```{.r .cell-code}\nglimpse(penguins)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nRows: 344\nColumns: 8\n$ species Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adel…\n$ island Torgersen, Torgersen, Torgersen, Torgersen, Torgerse…\n$ bill_length_mm 39.1, 39.5, 40.3, NA, 36.7, 39.3, 38.9, 39.2, 34.1, …\n$ bill_depth_mm 18.7, 17.4, 18.0, NA, 19.3, 20.6, 17.8, 19.6, 18.1, …\n$ flipper_length_mm 181, 186, 195, NA, 193, 190, 181, 195, 193, 190, 186…\n$ body_mass_g 3750, 3800, 3250, NA, 3450, 3650, 3625, 4675, 3475, …\n$ sex male, female, female, NA, female, male, female, male…\n$ year 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007…\n```\n:::\n:::\n\n\nIf we wanted to count the number of penguins for each of the three species, we can use the `count()` function in `dplyr`:\n\n\n::: {.cell}\n\n```{.r .cell-code}\npenguins %>% \n count(species)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 3 × 2\n species n\n \n1 Adelie 152\n2 Chinstrap 68\n3 Gentoo 124\n```\n:::\n:::\n\n:::\n\nFor example, we see there are a total of 152 Adelie penguins in the `palmerpenguins` dataset.\n\n::: callout-note\n### Question\n\nIf we wanted to use `qplot()` to map `flipper_length_mm` and `bill_length_mm` to the x and y coordinates, what would we do?\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# try it yourself\n```\n:::\n\n\nNow try mapping color to the `species` variable on top of the code you just wrote:\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# try it yourself\n```\n:::\n\n:::\n\n## Adding a geom\n\nSometimes it is nice to **add a smoother** to a scatterplot to highlight any trends.\n\nTrends can be difficult to see if the data are very noisy or there are many data points obscuring the view.\n\nA smoother is a **type of \"geom\"** that you can add along with your data points.\n\n::: callout-tip\n### Example\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(displ, hwy, data = mpg, geom = c(\"point\", \"smooth\"))\n```\n\n::: {.cell-output .cell-output-stderr}\n```\n`geom_smooth()` using method = 'loess' and formula = 'y ~ x'\n```\n:::\n\n::: {.cell-output-display}\n![Engine displacement and highway mileage w/smoother](index_files/figure-html/unnamed-chunk-16-1.png){width=672}\n:::\n:::\n\n:::\n\nHere it seems that engine displacement and highway mileage have a nonlinear U-shaped relationship, but from the previous plot we know that this is largely due to confounding by the drive class of the car.\n\n::: callout-tip\n### Note\n\nPreviously, we did not have to specify `geom = \"point\"` because that was done automatically.\n\nBut if you want the smoother overlaid with the points, then you need to specify both explicitly.\n:::\n\nLook at what happens if we *do not* include the `point` geom.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(displ, hwy, data = mpg, geom = c(\"smooth\"))\n```\n\n::: {.cell-output .cell-output-stderr}\n```\n`geom_smooth()` using method = 'loess' and formula = 'y ~ x'\n```\n:::\n\n::: {.cell-output-display}\n![Engine displacement and highway mileage w/smoother](index_files/figure-html/unnamed-chunk-17-1.png){width=672}\n:::\n:::\n\n\nSometimes that is the plot you want to show, but in this case it might make more sense to show the data along with the smoother.\n\n::: callout-note\n### Question\n\nLet's **add a smoother** to our `palmerpenguins` dataset example.\n\nUsing the code we previously wrote mapping variables to points and color, add a \"point\" and \"smooth\" geom:\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# try it yourself\n```\n:::\n\n:::\n\n## Histograms and boxplots\n\nThe `qplot()` function can be used to be used to plot 1-dimensional data too.\n\nBy **specifying a single variable**, `qplot()` will by default make a **histogram**.\n\n::: callout-tip\n### Example\n\nWe can make a histogram of the highway mileage data and stratify on the drive class. So technically this is three histograms on top of each other.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(hwy, data = mpg, fill = drv, binwidth = 2)\n```\n\n::: {.cell-output-display}\n![Histogram of highway mileage by drive class](index_files/figure-html/unnamed-chunk-19-1.png){width=672}\n:::\n:::\n\n:::\n\n::: callout-note\n### Question\n\nNotice, I used `fill` here to map color to the `drv` variable. Why is this? What happens when you use `color` instead?\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# try it yourself\n```\n:::\n\n:::\n\nHaving the different colors for each drive class is nice, but the three histograms can be a bit difficult to separate out.\n\n**Side-by-side boxplots** are one solution to this problem.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(drv, hwy, data = mpg, geom = \"boxplot\")\n```\n\n::: {.cell-output-display}\n![Boxplots of highway mileage by drive class](index_files/figure-html/unnamed-chunk-21-1.png){width=672}\n:::\n:::\n\n\nAnother solution is to plot the histograms in separate panels using facets.\n\n## Facets\n\n**Facets** are a way to **create multiple panels of plots based on the levels of categorical variable**.\n\nHere, we want to see a histogram of the highway mileages and the categorical variable is the drive class variable. We can do that using the `facets` argument to `qplot()`.\n\n::: callout-tip\n### Note\n\nThe `facets` argument **expects a formula type of input**, with a `~` separating the left hand side variable and the right hand side variable.\n\n- The **left hand side** variable indicates how the rows of the panels should be divided\n- The **right hand side** variable indicates how the columns of the panels should be divided\n:::\n\n::: callout-tip\n### Example\n\nHere, we just want three rows of histograms (and just one column), one for each drive class, so we specify `drv` on the left hand side and `.` on the right hand side indicating that there's no variable there (it's empty).\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(hwy, data = mpg, facets = drv ~ ., binwidth = 2)\n```\n\n::: {.cell-output-display}\n![Histogram of highway mileage by drive class](index_files/figure-html/unnamed-chunk-22-1.png){width=480}\n:::\n:::\n\n:::\n\nWe could also look at **more data using facets**, so instead of histograms we could look at scatter plots of engine displacement and highway mileage by drive class.\n\nHere, we put the `drv` variable on the right hand side to indicate that we want a column for each drive class (as opposed to splitting by rows like we did above).\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(displ, hwy, data = mpg, facets = . ~ drv)\n```\n\n::: {.cell-output-display}\n![Engine displacement and highway mileage by drive class](index_files/figure-html/unnamed-chunk-23-1.png){width=576}\n:::\n:::\n\n\nWhat if you wanted to **add a smoother to each one of those panels**? Simple, you literally just add the smoother as another **geom**.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(displ, hwy, data = mpg, facets = . ~ drv) + \n geom_smooth(method = \"lm\")\n```\n\n::: {.cell-output-display}\n![Engine displacement and highway mileage by drive class w/smoother](index_files/figure-html/unnamed-chunk-24-1.png){width=576}\n:::\n:::\n\n\n::: callout-tip\n### Note\n\nWe used a different type of smoother above.\n\nHere, we add a **linear regression line** (a type of smoother) to each group to see if there's any difference.\n:::\n\n::: callout-note\n### Question\n\nLet's facet our `palmerpenguins` dataset example and explore different types of plots.\n\nBuilding off the code we previously wrote, perform the following tasks:\n\n- Facet the plot based on `species` with the the three species along rows.\n- Add a linear regression line to each the types of `species`\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# try it yourself\n```\n:::\n\n\nNext, make a histogram of the `body_mass_g` for each of the species colored by the three species.\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# try it yourself\n```\n:::\n\n:::\n\n## Summary\n\nThe `qplot()` function in `ggplot2` is the analog of `plot()` in base graphics but with many built-in features that the traditionaly `plot()` does not provide. The syntax is somewhere in between the base and lattice graphics system. The `qplot()` function is useful for quickly putting data on the page/screen, but for ultimate customization, it may make more sense to use some of the lower level functions that we discuss later in the next lesson.\n\n# Post-lecture materials\n\n### Case Study: MAACS Cohort\n\n
\n\nClick here for case study practicing the `qplot()` function.\n\nThis case study will use data based on the Mouse Allergen and Asthma Cohort Study (MAACS). This study was aimed at characterizing the indoor (home) environment and its relationship with asthma morbidity amonst children aged 5--17 living in Baltimore, MD. The children all had persistent asthma, defined as having had an exacerbation in the past year. A representative publication of results from this study can be found in this paper by [Lu, et al.](https://pubmed.ncbi.nlm.nih.gov/23403052/)\n\n::: keyideas\nBecause the individual-level data for this study are protected by various U.S. privacy laws, we cannot make those data available. For the purposes of this lesson, we have simulated data that share many of the same features of the original data, but do not contain any of the actual measurements or values contained in the original dataset.\n:::\n\nHere is a snapshot of what the data look like.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(here)\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nhere() starts at /Users/leocollado/Dropbox/Code/jhustatcomputing2023\n```\n:::\n\n```{.r .cell-code}\nmaacs <- read_csv(here(\"data\", \"maacs_sim.csv\"), col_types = \"icnn\")\nmaacs\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 750 × 4\n id mopos pm25 eno\n \n 1 1 yes 6.01 28.8 \n 2 2 no 25.2 17.7 \n 3 3 yes 21.8 43.6 \n 4 4 no 13.4 288. \n 5 5 no 49.4 7.60\n 6 6 no 43.4 12.0 \n 7 7 yes 33.0 79.2 \n 8 8 yes 32.7 34.2 \n 9 9 yes 52.2 12.1 \n10 10 yes 51.9 65.0 \n# ℹ 740 more rows\n```\n:::\n:::\n\n\nThe key variables are:\n\n- `mopos`: an indicator of whether the subject is allergic to mouse allergen (yes/no)\n\n- `pm25`: average level of PM2.5 over the course of 7 days (micrograms per cubic meter)\n\n- `eno`: exhaled nitric oxide\n\nThe outcome of interest for this analysis will be exhaled nitric oxide (eNO), which is a measure of pulmonary inflamation. We can get a sense of how eNO is distributed in this population by making a quick histogram of the variable. Here, we take the log of eNO because some right-skew in the data.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(log(eno), data = maacs)\n```\n\n::: {.cell-output .cell-output-stderr}\n```\n`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.\n```\n:::\n\n::: {.cell-output-display}\n![Histogram of log eNO](index_files/figure-html/unnamed-chunk-28-1.png){width=672}\n:::\n:::\n\n\nA quick glance suggests that the histogram is a bit \"fat\", suggesting that there might be multiple groups of people being lumped together. We can stratify the histogram by whether they are allergic to mouse.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(log(eno), data = maacs, fill = mopos)\n```\n\n::: {.cell-output .cell-output-stderr}\n```\n`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.\n```\n:::\n\n::: {.cell-output-display}\n![Histogram of log eNO by mouse allergic status](index_files/figure-html/unnamed-chunk-29-1.png){width=672}\n:::\n:::\n\n\nWe can see from this plot that the non-allergic subjects are shifted slightly to the left, indicating a lower eNO and less pulmonary inflammation. That said, there is significant overlap between the two groups.\n\nAn alternative to histograms is a density smoother, which sometimes can be easier to visualize when there are multiple groups. Here is a density smooth of the entire study population.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(log(eno), data = maacs, geom = \"density\")\n```\n\n::: {.cell-output-display}\n![Density smooth of log eNO](index_files/figure-html/unnamed-chunk-30-1.png){width=672}\n:::\n:::\n\n\nAnd here are the densities straitified by allergic status. We can map the color aesthetic to the `mopos` variable.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(log(eno), data = maacs, geom = \"density\", color = mopos)\n```\n\n::: {.cell-output-display}\n![Density smooth of log eNO by mouse allergic status](index_files/figure-html/unnamed-chunk-31-1.png){width=672}\n:::\n:::\n\n\nThese tell the same story as the stratified histograms, which should come as no surprise.\n\nNow we can examine the indoor environment and its relationship to eNO. Here, we use the level of indoor PM2.5 as a measure of indoor environment air quality. We can make a simple scatterplot of PM2.5 and eNO.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(log(pm25), log(eno), data = maacs, geom = c(\"point\", \"smooth\"))\n```\n\n::: {.cell-output .cell-output-stderr}\n```\n`geom_smooth()` using method = 'loess' and formula = 'y ~ x'\n```\n:::\n\n::: {.cell-output-display}\n![eNO and PM2.5](index_files/figure-html/unnamed-chunk-32-1.png){width=672}\n:::\n:::\n\n\nThe relationship appears modest at best, as there is substantial noise in the data. However, one question that we might be interested in is whether allergic individuals are perhaps more sensitive to PM2.5 inhalation than non-allergic individuals. To examine that question we can stratify the data into two groups.\n\nThis first plot uses different plot symbols for the two groups and overlays them on a single canvas. We can do this by mapping the `mopos` variable to the `shape` aesthetic.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(log(pm25), log(eno), data = maacs, shape = mopos)\n```\n\n::: {.cell-output-display}\n![eNO and PM2.5 by mouse allergic status](index_files/figure-html/unnamed-chunk-33-1.png){width=672}\n:::\n:::\n\n\nBecause there is substantial overlap in the data it is a bit challenging to discern the circles from the triangles. Part of the reason might be that all of the symbols are the same color (black).\n\nWe can plot each group a different color to see if that helps.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(log(pm25), log(eno), data = maacs, color = mopos)\n```\n\n::: {.cell-output-display}\n![eNO and PM2.5 by mouse allergic status](index_files/figure-html/unnamed-chunk-34-1.png){width=672}\n:::\n:::\n\n\nThis is slightly better but the substantial overlap makes it difficult to discern any trends in the data. For this we need to add a smoother of some sort. Here we add a linear regression line (a type of smoother) to each group to see if there's any difference.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(log(pm25), log(eno), data = maacs, color = mopos) + \n geom_smooth(method = \"lm\")\n```\n\n::: {.cell-output .cell-output-stderr}\n```\n`geom_smooth()` using formula = 'y ~ x'\n```\n:::\n\n::: {.cell-output-display}\n![](index_files/figure-html/unnamed-chunk-35-1.png){width=672}\n:::\n:::\n\n\nHere we see quite clearly that the red group and the green group exhibit rather different relationships between PM2.5 and eNO. For the non-allergic individuals, there appears to be a slightly negative relationship between PM2.5 and eNO and for the allergic individuals, there is a positive relationship. This suggests a strong interaction between PM2.5 and allergic status, an hypothesis perhaps worth following up on in greater detail than this brief exploratory analysis.\n\nAnother, and perhaps more clear, way to visualize this interaction is to use separate panels for the non-allergic and allergic individuals using the `facets` argument to `qplot()`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(log(pm25), log(eno), data = maacs, facets = . ~ mopos) + \n geom_smooth(method = \"lm\")\n```\n\n::: {.cell-output .cell-output-stderr}\n```\n`geom_smooth()` using formula = 'y ~ x'\n```\n:::\n\n::: {.cell-output-display}\n![](index_files/figure-html/unnamed-chunk-36-1.png){width=864}\n:::\n:::\n\n\n
\n\n### Final Questions\n\nHere are some post-lecture questions to help you think about the material discussed.\n\n::: callout-note\n### Questions\n\n1. What is gone wrong with this code? Why are the points not blue?\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(x = displ, y = hwy, data = mpg, color = \"blue\")\n```\n\n::: {.cell-output-display}\n![](index_files/figure-html/unnamed-chunk-37-1.png){width=672}\n:::\n:::\n\n\n2. Which variables in `mpg` are categorical? Which variables are continuous? (Hint: type `?mpg` to read the documentation for the dataset). How can you see this information when you run `mpg`?\n\n3. Map a continuous variable to `color`, `size`, and `shape` aesthetics. How do these aesthetics behave differently for categorical vs. continuous variables?\n:::\n\n### Additional Resources\n\n::: callout-tip\n- \n- \n:::\n\n# R session information\n\n\n::: {.cell}\n\n```{.r .cell-code}\noptions(width = 120)\nsessioninfo::session_info()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────\n setting value\n version R version 4.3.1 (2023-06-16)\n os macOS Ventura 13.5\n system aarch64, darwin20\n ui X11\n language (EN)\n collate en_US.UTF-8\n ctype en_US.UTF-8\n tz America/New_York\n date 2023-08-17\n pandoc 3.1.5 @ /opt/homebrew/bin/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────\n package * version date (UTC) lib source\n bit 4.0.5 2022-11-15 [1] CRAN (R 4.3.0)\n bit64 4.0.5 2020-08-30 [1] CRAN (R 4.3.0)\n cli 3.6.1 2023-03-23 [1] CRAN (R 4.3.0)\n colorout 1.2-2 2023-05-06 [1] Github (jalvesaq/colorout@79931fd)\n colorspace 2.1-0 2023-01-23 [1] CRAN (R 4.3.0)\n crayon 1.5.2 2022-09-29 [1] CRAN (R 4.3.0)\n digest 0.6.33 2023-07-07 [1] CRAN (R 4.3.0)\n dplyr * 1.1.2 2023-04-20 [1] CRAN (R 4.3.0)\n evaluate 0.21 2023-05-05 [1] CRAN (R 4.3.0)\n fansi 1.0.4 2023-01-22 [1] CRAN (R 4.3.0)\n farver 2.1.1 2022-07-06 [1] CRAN (R 4.3.0)\n fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.3.0)\n forcats * 1.0.0 2023-01-29 [1] CRAN (R 4.3.0)\n generics 0.1.3 2022-07-05 [1] CRAN (R 4.3.0)\n ggplot2 * 3.4.3 2023-08-14 [1] CRAN (R 4.3.1)\n glue 1.6.2 2022-02-24 [1] CRAN (R 4.3.0)\n gtable 0.3.3 2023-03-21 [1] CRAN (R 4.3.0)\n here * 1.0.1 2020-12-13 [1] CRAN (R 4.3.0)\n hms 1.1.3 2023-03-21 [1] CRAN (R 4.3.0)\n htmltools 0.5.6 2023-08-10 [1] CRAN (R 4.3.0)\n htmlwidgets 1.6.2 2023-03-17 [1] CRAN (R 4.3.0)\n jsonlite 1.8.7 2023-06-29 [1] CRAN (R 4.3.0)\n knitr 1.43 2023-05-25 [1] CRAN (R 4.3.0)\n labeling 0.4.2 2020-10-20 [1] CRAN (R 4.3.0)\n lattice 0.21-8 2023-04-05 [1] CRAN (R 4.3.1)\n lifecycle 1.0.3 2022-10-07 [1] CRAN (R 4.3.0)\n lubridate * 1.9.2 2023-02-10 [1] CRAN (R 4.3.0)\n magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.3.0)\n Matrix 1.6-1 2023-08-14 [1] CRAN (R 4.3.0)\n mgcv 1.9-0 2023-07-11 [1] CRAN (R 4.3.0)\n munsell 0.5.0 2018-06-12 [1] CRAN (R 4.3.0)\n nlme 3.1-163 2023-08-09 [1] CRAN (R 4.3.0)\n palmerpenguins * 0.1.1 2022-08-15 [1] CRAN (R 4.3.0)\n pillar 1.9.0 2023-03-22 [1] CRAN (R 4.3.0)\n pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 4.3.0)\n purrr * 1.0.2 2023-08-10 [1] CRAN (R 4.3.0)\n R6 2.5.1 2021-08-19 [1] CRAN (R 4.3.0)\n readr * 2.1.4 2023-02-10 [1] CRAN (R 4.3.0)\n rlang 1.1.1 2023-04-28 [1] CRAN (R 4.3.0)\n rmarkdown 2.24 2023-08-14 [1] CRAN (R 4.3.1)\n rprojroot 2.0.3 2022-04-02 [1] CRAN (R 4.3.0)\n rstudioapi 0.15.0 2023-07-07 [1] CRAN (R 4.3.0)\n scales 1.2.1 2022-08-20 [1] CRAN (R 4.3.0)\n sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.3.0)\n stringi 1.7.12 2023-01-11 [1] CRAN (R 4.3.0)\n stringr * 1.5.0 2022-12-02 [1] CRAN (R 4.3.0)\n tibble * 3.2.1 2023-03-20 [1] CRAN (R 4.3.0)\n tidyr * 1.3.0 2023-01-24 [1] CRAN (R 4.3.0)\n tidyselect 1.2.0 2022-10-10 [1] CRAN (R 4.3.0)\n tidyverse * 2.0.0 2023-02-22 [1] CRAN (R 4.3.0)\n timechange 0.2.0 2023-01-11 [1] CRAN (R 4.3.0)\n tzdb 0.4.0 2023-05-12 [1] CRAN (R 4.3.0)\n utf8 1.2.3 2023-01-31 [1] CRAN (R 4.3.0)\n vctrs 0.6.3 2023-06-14 [1] CRAN (R 4.3.0)\n vroom 1.6.3 2023-04-28 [1] CRAN (R 4.3.0)\n withr 2.5.0 2022-03-03 [1] CRAN (R 4.3.0)\n xfun 0.40 2023-08-09 [1] CRAN (R 4.3.0)\n yaml 2.3.7 2023-01-23 [1] CRAN (R 4.3.0)\n\n [1] /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library\n\n──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n```\n:::\n:::\n", + "markdown": "---\ntitle: \"12 - The ggplot2 plotting system: qplot()\"\nauthor:\n - name: Leonardo Collado Torres\n url: http://lcolladotor.github.io/\n affiliations:\n - id: libd\n name: Lieber Institute for Brain Development\n url: https://libd.org/\n - id: jhsph\n name: Johns Hopkins Bloomberg School of Public Health Department of Biostatistics\n url: https://publichealth.jhu.edu/departments/biostatistics\ndescription: \"An overview of the ggplot2 plotting system in R with qplot()\"\ncategories: [module 3, week 3, R, programming, ggplot2, data viz]\n---\n\n\n*This lecture, as the rest of the course, is adapted from the version [Stephanie C. Hicks](https://www.stephaniehicks.com/) designed and maintained in 2021 and 2022. Check the recent changes to this file through the [GitHub history](https://github.com/lcolladotor/jhustatcomputing2023/commits/main/posts/12-ggplot2-plotting-system-part-1/index.qmd).*\n\n> \"The greatest value of a picture is when it forces us to notice what we never expected to see.\" ---John Tukey\n\n# Pre-lecture materials\n\n### Read ahead\n\n::: callout-note\n## Read ahead\n\n**Before class, you can prepare by reading the following materials:**\n\n1. \n2. \n:::\n\n### Acknowledgements\n\nMaterial for this lecture was borrowed and adopted from\n\n- \n\n# Learning objectives\n\n::: callout-note\n# Learning objectives\n\n**At the end of this lesson you will:**\n\n- Recognize the difference between *aesthetics* and *geoms*\n- Become familiar with different types of plots (e.g. scatterplots, boxplots, and histograms)\n- Be able to facet plots into a grid\n:::\n\n# The ggplot2 Plotting System\n\nThe `ggplot2` package in R is **an implementation of *The Grammar of Graphics*** as described by Leland Wilkinson in his book. The **package was originally written by Hadley Wickham** while he was a graduate student at Iowa State University (he still actively maintains the package).\n\nThe package implements what might be considered a third graphics system for R (along with `base` graphics and `lattice`).\n\nThe package is available from [CRAN](http://cran.r-project.org/package=ggplot2) via `install.packages()`; the latest version of the source can be found on the package's [GitHub Repository](https://github.com/hadley/ggplot2). Documentation of the package can be found at [the tidyverse web site](https://ggplot2.tidyverse.org).\n\nThe **grammar of graphics** represents **an abstraction of graphics ideas and objects**.\n\nYou can think of this as **developing the verbs, nouns, and adjectives for data graphics**.\n\n::: callout-tip\n### Note\n\nDeveloping such a **grammar allows for a \"theory\" of graphics** on which to build new graphics and graphics objects.\n\nTo quote from Hadley Wickham's book on `ggplot2`, we want to \"shorten the distance from mind to page\". In summary,\n\n> \"...the grammar tells us that a statistical graphic is a **mapping** from data to **aesthetic** attributes (colour, shape, size) of **geometric** objects (points, lines, bars). The plot may also contain statistical transformations of the data and is drawn on a specific coordinate system\" -- from *ggplot2* book\n:::\n\nYou might ask yourself \"Why do we need a grammar of graphics?\".\n\nWell, for much the same reasons that **having a grammar is useful for spoken languages**. The grammar allows for\n\n- A more compact summary of the base components of a language\n- An extension of the language to handle situations that we have not before seen\n\nIf you think about making a plot with the base graphics system, the plot is **constructed by calling a series of functions that either create or annotate a plot**. There's **no convenient agreed-upon way to describe the plot**, except to just recite the series of R functions that were called to create the thing in the first place.\n\n::: callout-tip\n### Example\n\nConsider the following plot made using base graphics previously.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nwith(airquality, {\n plot(Temp, Ozone)\n lines(loess.smooth(Temp, Ozone))\n})\n```\n\n::: {.cell-output-display}\n![Scatterplot of Temperature and Ozone in New York (base graphics)](index_files/figure-html/unnamed-chunk-1-1.png){width=480}\n:::\n:::\n\n\nHow would one **describe the creation of this plot**?\n\nWell, we could say that we called the `plot()` function and then added a loess smoother by calling the `lines()` function on the output of `loess.smooth()`.\n\nWhile the base plotting system is convenient and it often mirrors how we think of building plots and analyzing data, there are **drawbacks**:\n\n- You cannot go back once plot has started (e.g. to adjust margins), so there is in fact a need to plan in advance.\n- It is difficult to \"translate\" a plot to others because there is no formal graphical language; each plot is just a series of R commands.\n:::\n\nHere is the same plot made using `ggplot2` in the `tidyverse`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(tidyverse)\nairquality %>%\n ggplot(aes(Temp, Ozone)) +\n geom_point() +\n geom_smooth(\n method = \"loess\",\n se = FALSE\n ) +\n theme_minimal()\n```\n\n::: {.cell-output-display}\n![Scatterplot of Temperature and Ozone in New York (ggplot2)](index_files/figure-html/unnamed-chunk-2-1.png){width=672}\n:::\n:::\n\n\n::: callout-tip\n### Note\n\nThe output is roughly equivalent and the amount of code is similar, but `ggplot2` allows for a more elegant way of expressing the components of the plot.\n\nIn this case, the plot is a **dataset** (`airquality`) with **aesthetic mappings** (visual properties of the objects in your plot) derived from the `Temp` and `Ozone` variables, a set of **points**, and a **smoother**.\n:::\n\nIn a sense, the `ggplot2` system takes many of the cues from the base plotting system and from the `lattice` plotting systems, and formalizes the cues a bit.\n\nIt **automatically handles things like margins and spacing**, and also has the concept of \"themes\" which **provide a default set of plotting symbols and colors** (which are all customizable).\n\nWhile `ggplot2` bears a superficial similarity to `lattice`, `ggplot2` is generally easier and more intuitive to use.\n\n## The Basics: `qplot()`\n\nThe `qplot()` function in `ggplot2` is meant to get you going **q**uickly.\n\nIt works much like the `plot()` function in base graphics system. It **looks for variables to plot within a data frame**, similar to lattice, or in the parent environment.\n\nIn general, it is good to get used to putting your data in a data frame and then passing it to `qplot()`.\n\n::: callout-tip\n### Pro tip\n\nThe `qplot()` function is **somewhat discouraged** in `ggplot2` now and new users are encouraged to use the more general `ggplot()` function (more details in the next lesson).\n\nHowever, the `qplot()` function is still useful and may be easier to use if transitioning from the base plotting system or a different statistical package.\n:::\n\nPlots are made up of\n\n- **aesthetics** (e.g. size, shape, color)\n- **geoms** (e.g. points, lines)\n\nFactors play an important role for indicating subsets of the data (if they are to have different properties) so they should be **labeled** properly.\n\nThe `qplot()` hides much of what goes on underneath, which is okay for most operations, `ggplot()` is the core function and is very flexible for doing things `qplot()` cannot do.\n\n## Before you start: label your data\n\nOne thing that is always true, but is particularly useful when using `ggplot2`, is that you should always **use informative and descriptive labels on your data**.\n\nMore generally, your data should have appropriate **metadata** so that you can quickly look at a dataset and know\n\n- what are variables?\n- what do the values of each variable mean?\n\n::: callout-tip\n### Pro tip\n\n- **Each column** of a data frame should **have a meaningful (but concise) variable name** that accurately reflects the data stored in that column\n- Non-numeric or **categorical variables should be coded as factor variables** and have meaningful labels for each level of the factor.\n - Might be common to code a binary variable as a \"0\" or a \"1\", but the problem is that from quickly looking at the data, it's impossible to know whether which level of that variable is represented by a \"0\" or a \"1\".\n - Much better to simply label each observation as what they are.\n - If a variable represents temperature categories, it might be better to use \"cold\", \"mild\", and \"hot\" rather than \"1\", \"2\", and \"3\".\n:::\n\nWhile it is sometimes a pain to make sure all of your data are properly labeled, this **investment in time can pay dividends down the road** when you're trying to figure out what you were plotting.\n\nIn other words, including the proper metadata can make your exploratory plots essentially self-documenting.\n\n## ggplot2 \"Hello, world!\"\n\nThis example dataset comes with the `ggplot2` package and contains data on the fuel economy of 38 popular car models from 1999 to 2008.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(tidyverse) # this loads the ggplot2 R package\n# library(ggplot2) # an alternative way to just load the ggplot2 R package\nglimpse(mpg)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nRows: 234\nColumns: 11\n$ manufacturer \"audi\", \"audi\", \"audi\", \"audi\", \"audi\", \"audi\", \"audi\", \"…\n$ model \"a4\", \"a4\", \"a4\", \"a4\", \"a4\", \"a4\", \"a4\", \"a4 quattro\", \"…\n$ displ 1.8, 1.8, 2.0, 2.0, 2.8, 2.8, 3.1, 1.8, 1.8, 2.0, 2.0, 2.…\n$ year 1999, 1999, 2008, 2008, 1999, 1999, 2008, 1999, 1999, 200…\n$ cyl 4, 4, 4, 4, 6, 6, 6, 4, 4, 4, 4, 6, 6, 6, 6, 6, 6, 8, 8, …\n$ trans \"auto(l5)\", \"manual(m5)\", \"manual(m6)\", \"auto(av)\", \"auto…\n$ drv \"f\", \"f\", \"f\", \"f\", \"f\", \"f\", \"f\", \"4\", \"4\", \"4\", \"4\", \"4…\n$ cty 18, 21, 20, 21, 16, 18, 18, 18, 16, 20, 19, 15, 17, 17, 1…\n$ hwy 29, 29, 31, 30, 26, 26, 27, 26, 25, 28, 27, 25, 25, 25, 2…\n$ fl \"p\", \"p\", \"p\", \"p\", \"p\", \"p\", \"p\", \"p\", \"p\", \"p\", \"p\", \"p…\n$ class \"compact\", \"compact\", \"compact\", \"compact\", \"compact\", \"c…\n```\n:::\n:::\n\n\nYou can see from the `glimpse()` (part of the `dplyr` package) output that all of the categorical variables (like \"manufacturer\" or \"class\") are \\*\\*appropriately coded with meaningful label\\*s\\*\\*.\n\nThis will come in handy when `qplot()` has to label different aspects of a plot.\n\nAlso note that all of the **columns/variables have meaningful names** (if sometimes abbreviated), rather than names like \"X1\", and \"X2\", etc.\n\n::: callout-tip\n### Example\n\nWe can **make a quick scatterplot** using `qplot()` of the engine displacement (`displ`) and the highway miles per gallon (`hwy`).\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(x = displ, y = hwy, data = mpg)\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nWarning: `qplot()` was deprecated in ggplot2 3.4.0.\n```\n:::\n\n::: {.cell-output-display}\n![Plot of engine displacement and highway mileage using the mtcars dataset](index_files/figure-html/unnamed-chunk-4-1.png){width=672}\n:::\n:::\n\n:::\n\nIt has a *very* similar feeling to `plot()` in base R.\n\n::: callout-tip\n### Note\n\nIn the call to `qplot()` you **must specify the `data` argument** so that `qplot()` knows where to look up the variables.\n\nYou must also specify `x` and `y`, but hopefully that part is obvious.\n:::\n\n## Modifying aesthetics\n\nWe can introduce a third variable into the plot by **modifying the color** of the points based on the value of that third variable.\n\nColor (or colour) is one type of **aesthetic** and using the `ggplot2` language:\n\n> \"the color of each point can be mapped to a variable\"\n\nThis sounds technical, but let's give an example.\n\n::: callout-tip\n### Example\n\nWe map the `color` argument to the `drv` variable, which indicates whether a car is front wheel drive, rear wheel drive, or 4-wheel drive.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(displ, hwy, data = mpg, color = drv)\n```\n\n::: {.cell-output-display}\n![Engine displacement and highway mileage by drive class](index_files/figure-html/unnamed-chunk-5-1.png){width=672}\n:::\n:::\n\n:::\n\nNow we can see that the front wheel drive cars tend to have lower displacement relative to the 4-wheel or rear wheel drive cars.\n\nAlso, it's clear that the 4-wheel drive cars have the lowest highway gas mileage.\n\n::: callout-tip\n### Note\n\nThe `x` argument and `y` argument are aesthetics too, and they got mapped to the `displ` and `hwy` variables, respectively.\n:::\n\n::: callout-note\n### Question\n\nIn the above plot, I did not specify the `x` and `y` variable. What happens when you run these two code chunks. What's the difference?\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(displ, hwy, data = mpg, color = drv)\n```\n:::\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(x = displ, y = hwy, data = mpg, color = drv)\n```\n:::\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(hwy, displ, data = mpg, color = drv)\n```\n:::\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(y = hwy, x = displ, data = mpg, color = drv)\n```\n:::\n\n:::\n\n::: callout-tip\n### Example\n\nLet's try mapping colors in another dataset, namely the [palmerpenguins](https://allisonhorst.github.io/palmerpenguins/) dataset. These data contain observations for 344 penguins. There are 3 different species of penguins in this dataset, collected from 3 islands in the Palmer Archipelago, Antarctica.\n\n\n::: {.cell layout-align=\"center\"}\n::: {.cell-output-display}\n![Palmer penguins](https://allisonhorst.github.io/palmerpenguins/reference/figures/lter_penguins.png){fig-align='center' width=60%}\n:::\n:::\n\n\n\\[**Source**: [Artwork by Allison Horst](https://github.com/allisonhorst/stats-illustrations)\\]\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(palmerpenguins)\n```\n:::\n\n::: {.cell}\n\n```{.r .cell-code}\nglimpse(penguins)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nRows: 344\nColumns: 8\n$ species Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adel…\n$ island Torgersen, Torgersen, Torgersen, Torgersen, Torgerse…\n$ bill_length_mm 39.1, 39.5, 40.3, NA, 36.7, 39.3, 38.9, 39.2, 34.1, …\n$ bill_depth_mm 18.7, 17.4, 18.0, NA, 19.3, 20.6, 17.8, 19.6, 18.1, …\n$ flipper_length_mm 181, 186, 195, NA, 193, 190, 181, 195, 193, 190, 186…\n$ body_mass_g 3750, 3800, 3250, NA, 3450, 3650, 3625, 4675, 3475, …\n$ sex male, female, female, NA, female, male, female, male…\n$ year 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007…\n```\n:::\n:::\n\n\nIf we wanted to count the number of penguins for each of the three species, we can use the `count()` function in `dplyr`:\n\n\n::: {.cell}\n\n```{.r .cell-code}\npenguins %>%\n count(species)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 3 × 2\n species n\n \n1 Adelie 152\n2 Chinstrap 68\n3 Gentoo 124\n```\n:::\n:::\n\n:::\n\nFor example, we see there are a total of 152 Adelie penguins in the `palmerpenguins` dataset.\n\n::: callout-note\n### Question\n\nIf we wanted to use `qplot()` to map `flipper_length_mm` and `bill_length_mm` to the x and y coordinates, what would we do?\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# try it yourself\n```\n:::\n\n\nNow try mapping color to the `species` variable on top of the code you just wrote:\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# try it yourself\n```\n:::\n\n:::\n\n## Adding a geom\n\nSometimes it is nice to **add a smoother** to a scatterplot to highlight any trends.\n\nTrends can be difficult to see if the data are very noisy or there are many data points obscuring the view.\n\nA smoother is a **type of \"geom\"** that you can add along with your data points.\n\n::: callout-tip\n### Example\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(displ, hwy, data = mpg, geom = c(\"point\", \"smooth\"))\n```\n\n::: {.cell-output .cell-output-stderr}\n```\n`geom_smooth()` using method = 'loess' and formula = 'y ~ x'\n```\n:::\n\n::: {.cell-output-display}\n![Engine displacement and highway mileage w/smoother](index_files/figure-html/unnamed-chunk-16-1.png){width=672}\n:::\n:::\n\n:::\n\nHere it seems that engine displacement and highway mileage have a nonlinear U-shaped relationship, but from the previous plot we know that this is largely due to confounding by the drive class of the car.\n\n::: callout-tip\n### Note\n\nPreviously, we did not have to specify `geom = \"point\"` because that was done automatically.\n\nBut if you want the smoother overlaid with the points, then you need to specify both explicitly.\n:::\n\nLook at what happens if we *do not* include the `point` geom.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(displ, hwy, data = mpg, geom = c(\"smooth\"))\n```\n\n::: {.cell-output .cell-output-stderr}\n```\n`geom_smooth()` using method = 'loess' and formula = 'y ~ x'\n```\n:::\n\n::: {.cell-output-display}\n![Engine displacement and highway mileage w/smoother](index_files/figure-html/unnamed-chunk-17-1.png){width=672}\n:::\n:::\n\n\nSometimes that is the plot you want to show, but in this case it might make more sense to show the data along with the smoother.\n\n::: callout-note\n### Question\n\nLet's **add a smoother** to our `palmerpenguins` dataset example.\n\nUsing the code we previously wrote mapping variables to points and color, add a \"point\" and \"smooth\" geom:\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# try it yourself\n```\n:::\n\n:::\n\n## Histograms and boxplots\n\nThe `qplot()` function can be used to be used to plot 1-dimensional data too.\n\nBy **specifying a single variable**, `qplot()` will by default make a **histogram**.\n\n::: callout-tip\n### Example\n\nWe can make a histogram of the highway mileage data and stratify on the drive class. So technically this is three histograms on top of each other.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(hwy, data = mpg, fill = drv, binwidth = 2)\n```\n\n::: {.cell-output-display}\n![Histogram of highway mileage by drive class](index_files/figure-html/unnamed-chunk-19-1.png){width=672}\n:::\n:::\n\n:::\n\n::: callout-note\n### Question\n\nNotice, I used `fill` here to map color to the `drv` variable. Why is this? What happens when you use `color` instead?\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# try it yourself\n```\n:::\n\n:::\n\nHaving the different colors for each drive class is nice, but the three histograms can be a bit difficult to separate out.\n\n**Side-by-side boxplots** are one solution to this problem.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(drv, hwy, data = mpg, geom = \"boxplot\")\n```\n\n::: {.cell-output-display}\n![Boxplots of highway mileage by drive class](index_files/figure-html/unnamed-chunk-21-1.png){width=672}\n:::\n:::\n\n\nAnother solution is to plot the histograms in separate panels using facets.\n\n## Facets\n\n**Facets** are a way to **create multiple panels of plots based on the levels of categorical variable**.\n\nHere, we want to see a histogram of the highway mileages and the categorical variable is the drive class variable. We can do that using the `facets` argument to `qplot()`.\n\n::: callout-tip\n### Note\n\nThe `facets` argument **expects a formula type of input**, with a `~` separating the left hand side variable and the right hand side variable.\n\n- The **left hand side** variable indicates how the rows of the panels should be divided\n- The **right hand side** variable indicates how the columns of the panels should be divided\n:::\n\n::: callout-tip\n### Example\n\nHere, we just want three rows of histograms (and just one column), one for each drive class, so we specify `drv` on the left hand side and `.` on the right hand side indicating that there's no variable there (it's empty).\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(hwy, data = mpg, facets = drv ~ ., binwidth = 2)\n```\n\n::: {.cell-output-display}\n![Histogram of highway mileage by drive class](index_files/figure-html/unnamed-chunk-22-1.png){width=480}\n:::\n:::\n\n:::\n\nWe could also look at **more data using facets**, so instead of histograms we could look at scatter plots of engine displacement and highway mileage by drive class.\n\nHere, we put the `drv` variable on the right hand side to indicate that we want a column for each drive class (as opposed to splitting by rows like we did above).\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(displ, hwy, data = mpg, facets = . ~ drv)\n```\n\n::: {.cell-output-display}\n![Engine displacement and highway mileage by drive class](index_files/figure-html/unnamed-chunk-23-1.png){width=576}\n:::\n:::\n\n\nWhat if you wanted to **add a smoother to each one of those panels**? Simple, you literally just add the smoother as another **geom**.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(displ, hwy, data = mpg, facets = . ~ drv) +\n geom_smooth(method = \"lm\")\n```\n\n::: {.cell-output-display}\n![Engine displacement and highway mileage by drive class w/smoother](index_files/figure-html/unnamed-chunk-24-1.png){width=576}\n:::\n:::\n\n\n::: callout-tip\n### Note\n\nWe used a different type of smoother above.\n\nHere, we add a **linear regression line** (a type of smoother) to each group to see if there's any difference.\n:::\n\n::: callout-note\n### Question\n\nLet's facet our `palmerpenguins` dataset example and explore different types of plots.\n\nBuilding off the code we previously wrote, perform the following tasks:\n\n- Facet the plot based on `species` with the the three species along rows.\n- Add a linear regression line to each the types of `species`\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# try it yourself\n```\n:::\n\n\nNext, make a histogram of the `body_mass_g` for each of the species colored by the three species.\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# try it yourself\n```\n:::\n\n:::\n\n## Summary\n\nThe `qplot()` function in `ggplot2` is the analog of `plot()` in base graphics but with many built-in features that the traditionaly `plot()` does not provide. The syntax is somewhere in between the base and lattice graphics system. The `qplot()` function is useful for quickly putting data on the page/screen, but for ultimate customization, it may make more sense to use some of the lower level functions that we discuss later in the next lesson.\n\n# Post-lecture materials\n\n### Case Study: MAACS Cohort\n\n
\n\nClick here for case study practicing the `qplot()` function.\n\nThis case study will use data based on the Mouse Allergen and Asthma Cohort Study (MAACS). This study was aimed at characterizing the indoor (home) environment and its relationship with asthma morbidity amonst children aged 5--17 living in Baltimore, MD. The children all had persistent asthma, defined as having had an exacerbation in the past year. A representative publication of results from this study can be found in this paper by [Lu, et al.](https://pubmed.ncbi.nlm.nih.gov/23403052/)\n\n::: keyideas\nBecause the individual-level data for this study are protected by various U.S. privacy laws, we cannot make those data available. For the purposes of this lesson, we have simulated data that share many of the same features of the original data, but do not contain any of the actual measurements or values contained in the original dataset.\n:::\n\nHere is a snapshot of what the data look like.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(here)\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nhere() starts at /Users/leocollado/Dropbox/Code/jhustatcomputing2023\n```\n:::\n\n```{.r .cell-code}\nmaacs <- read_csv(here(\"data\", \"maacs_sim.csv\"), col_types = \"icnn\")\nmaacs\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 750 × 4\n id mopos pm25 eno\n \n 1 1 yes 6.01 28.8 \n 2 2 no 25.2 17.7 \n 3 3 yes 21.8 43.6 \n 4 4 no 13.4 288. \n 5 5 no 49.4 7.60\n 6 6 no 43.4 12.0 \n 7 7 yes 33.0 79.2 \n 8 8 yes 32.7 34.2 \n 9 9 yes 52.2 12.1 \n10 10 yes 51.9 65.0 \n# ℹ 740 more rows\n```\n:::\n:::\n\n\nThe key variables are:\n\n- `mopos`: an indicator of whether the subject is allergic to mouse allergen (yes/no)\n\n- `pm25`: average level of PM2.5 over the course of 7 days (micrograms per cubic meter)\n\n- `eno`: exhaled nitric oxide\n\nThe outcome of interest for this analysis will be exhaled nitric oxide (eNO), which is a measure of pulmonary inflamation. We can get a sense of how eNO is distributed in this population by making a quick histogram of the variable. Here, we take the log of eNO because some right-skew in the data.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(log(eno), data = maacs)\n```\n\n::: {.cell-output .cell-output-stderr}\n```\n`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.\n```\n:::\n\n::: {.cell-output-display}\n![Histogram of log eNO](index_files/figure-html/unnamed-chunk-28-1.png){width=672}\n:::\n:::\n\n\nA quick glance suggests that the histogram is a bit \"fat\", suggesting that there might be multiple groups of people being lumped together. We can stratify the histogram by whether they are allergic to mouse.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(log(eno), data = maacs, fill = mopos)\n```\n\n::: {.cell-output .cell-output-stderr}\n```\n`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.\n```\n:::\n\n::: {.cell-output-display}\n![Histogram of log eNO by mouse allergic status](index_files/figure-html/unnamed-chunk-29-1.png){width=672}\n:::\n:::\n\n\nWe can see from this plot that the non-allergic subjects are shifted slightly to the left, indicating a lower eNO and less pulmonary inflammation. That said, there is significant overlap between the two groups.\n\nAn alternative to histograms is a density smoother, which sometimes can be easier to visualize when there are multiple groups. Here is a density smooth of the entire study population.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(log(eno), data = maacs, geom = \"density\")\n```\n\n::: {.cell-output-display}\n![Density smooth of log eNO](index_files/figure-html/unnamed-chunk-30-1.png){width=672}\n:::\n:::\n\n\nAnd here are the densities straitified by allergic status. We can map the color aesthetic to the `mopos` variable.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(log(eno), data = maacs, geom = \"density\", color = mopos)\n```\n\n::: {.cell-output-display}\n![Density smooth of log eNO by mouse allergic status](index_files/figure-html/unnamed-chunk-31-1.png){width=672}\n:::\n:::\n\n\nThese tell the same story as the stratified histograms, which should come as no surprise.\n\nNow we can examine the indoor environment and its relationship to eNO. Here, we use the level of indoor PM2.5 as a measure of indoor environment air quality. We can make a simple scatterplot of PM2.5 and eNO.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(log(pm25), log(eno), data = maacs, geom = c(\"point\", \"smooth\"))\n```\n\n::: {.cell-output .cell-output-stderr}\n```\n`geom_smooth()` using method = 'loess' and formula = 'y ~ x'\n```\n:::\n\n::: {.cell-output-display}\n![eNO and PM2.5](index_files/figure-html/unnamed-chunk-32-1.png){width=672}\n:::\n:::\n\n\nThe relationship appears modest at best, as there is substantial noise in the data. However, one question that we might be interested in is whether allergic individuals are perhaps more sensitive to PM2.5 inhalation than non-allergic individuals. To examine that question we can stratify the data into two groups.\n\nThis first plot uses different plot symbols for the two groups and overlays them on a single canvas. We can do this by mapping the `mopos` variable to the `shape` aesthetic.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(log(pm25), log(eno), data = maacs, shape = mopos)\n```\n\n::: {.cell-output-display}\n![eNO and PM2.5 by mouse allergic status](index_files/figure-html/unnamed-chunk-33-1.png){width=672}\n:::\n:::\n\n\nBecause there is substantial overlap in the data it is a bit challenging to discern the circles from the triangles. Part of the reason might be that all of the symbols are the same color (black).\n\nWe can plot each group a different color to see if that helps.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(log(pm25), log(eno), data = maacs, color = mopos)\n```\n\n::: {.cell-output-display}\n![eNO and PM2.5 by mouse allergic status](index_files/figure-html/unnamed-chunk-34-1.png){width=672}\n:::\n:::\n\n\nThis is slightly better but the substantial overlap makes it difficult to discern any trends in the data. For this we need to add a smoother of some sort. Here we add a linear regression line (a type of smoother) to each group to see if there's any difference.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(log(pm25), log(eno), data = maacs, color = mopos) +\n geom_smooth(method = \"lm\")\n```\n\n::: {.cell-output .cell-output-stderr}\n```\n`geom_smooth()` using formula = 'y ~ x'\n```\n:::\n\n::: {.cell-output-display}\n![](index_files/figure-html/unnamed-chunk-35-1.png){width=672}\n:::\n:::\n\n\nHere we see quite clearly that the red group and the green group exhibit rather different relationships between PM2.5 and eNO. For the non-allergic individuals, there appears to be a slightly negative relationship between PM2.5 and eNO and for the allergic individuals, there is a positive relationship. This suggests a strong interaction between PM2.5 and allergic status, an hypothesis perhaps worth following up on in greater detail than this brief exploratory analysis.\n\nAnother, and perhaps more clear, way to visualize this interaction is to use separate panels for the non-allergic and allergic individuals using the `facets` argument to `qplot()`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(log(pm25), log(eno), data = maacs, facets = . ~ mopos) +\n geom_smooth(method = \"lm\")\n```\n\n::: {.cell-output .cell-output-stderr}\n```\n`geom_smooth()` using formula = 'y ~ x'\n```\n:::\n\n::: {.cell-output-display}\n![](index_files/figure-html/unnamed-chunk-36-1.png){width=864}\n:::\n:::\n\n\n
\n\n### Final Questions\n\nHere are some post-lecture questions to help you think about the material discussed.\n\n::: callout-note\n### Questions\n\n1. What is gone wrong with this code? Why are the points not blue?\n\n\n::: {.cell}\n\n```{.r .cell-code}\nqplot(x = displ, y = hwy, data = mpg, color = \"blue\")\n```\n\n::: {.cell-output-display}\n![](index_files/figure-html/unnamed-chunk-37-1.png){width=672}\n:::\n:::\n\n\n2. Which variables in `mpg` are categorical? Which variables are continuous? (Hint: type `?mpg` to read the documentation for the dataset). How can you see this information when you run `mpg`?\n\n3. Map a continuous variable to `color`, `size`, and `shape` aesthetics. How do these aesthetics behave differently for categorical vs. continuous variables?\n:::\n\n### Additional Resources\n\n::: callout-tip\n- \n- \n:::\n\n# R session information\n\n\n::: {.cell}\n\n```{.r .cell-code}\noptions(width = 120)\nsessioninfo::session_info()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────\n setting value\n version R version 4.3.1 (2023-06-16)\n os macOS Ventura 13.5\n system aarch64, darwin20\n ui X11\n language (EN)\n collate en_US.UTF-8\n ctype en_US.UTF-8\n tz America/New_York\n date 2023-08-17\n pandoc 3.1.5 @ /opt/homebrew/bin/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────\n package * version date (UTC) lib source\n bit 4.0.5 2022-11-15 [1] CRAN (R 4.3.0)\n bit64 4.0.5 2020-08-30 [1] CRAN (R 4.3.0)\n cli 3.6.1 2023-03-23 [1] CRAN (R 4.3.0)\n colorout 1.2-2 2023-05-06 [1] Github (jalvesaq/colorout@79931fd)\n colorspace 2.1-0 2023-01-23 [1] CRAN (R 4.3.0)\n crayon 1.5.2 2022-09-29 [1] CRAN (R 4.3.0)\n digest 0.6.33 2023-07-07 [1] CRAN (R 4.3.0)\n dplyr * 1.1.2 2023-04-20 [1] CRAN (R 4.3.0)\n evaluate 0.21 2023-05-05 [1] CRAN (R 4.3.0)\n fansi 1.0.4 2023-01-22 [1] CRAN (R 4.3.0)\n farver 2.1.1 2022-07-06 [1] CRAN (R 4.3.0)\n fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.3.0)\n forcats * 1.0.0 2023-01-29 [1] CRAN (R 4.3.0)\n generics 0.1.3 2022-07-05 [1] CRAN (R 4.3.0)\n ggplot2 * 3.4.3 2023-08-14 [1] CRAN (R 4.3.1)\n glue 1.6.2 2022-02-24 [1] CRAN (R 4.3.0)\n gtable 0.3.3 2023-03-21 [1] CRAN (R 4.3.0)\n here * 1.0.1 2020-12-13 [1] CRAN (R 4.3.0)\n hms 1.1.3 2023-03-21 [1] CRAN (R 4.3.0)\n htmltools 0.5.6 2023-08-10 [1] CRAN (R 4.3.0)\n htmlwidgets 1.6.2 2023-03-17 [1] CRAN (R 4.3.0)\n jsonlite 1.8.7 2023-06-29 [1] CRAN (R 4.3.0)\n knitr 1.43 2023-05-25 [1] CRAN (R 4.3.0)\n labeling 0.4.2 2020-10-20 [1] CRAN (R 4.3.0)\n lattice 0.21-8 2023-04-05 [1] CRAN (R 4.3.1)\n lifecycle 1.0.3 2022-10-07 [1] CRAN (R 4.3.0)\n lubridate * 1.9.2 2023-02-10 [1] CRAN (R 4.3.0)\n magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.3.0)\n Matrix 1.6-1 2023-08-14 [1] CRAN (R 4.3.0)\n mgcv 1.9-0 2023-07-11 [1] CRAN (R 4.3.0)\n munsell 0.5.0 2018-06-12 [1] CRAN (R 4.3.0)\n nlme 3.1-163 2023-08-09 [1] CRAN (R 4.3.0)\n palmerpenguins * 0.1.1 2022-08-15 [1] CRAN (R 4.3.0)\n pillar 1.9.0 2023-03-22 [1] CRAN (R 4.3.0)\n pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 4.3.0)\n purrr * 1.0.2 2023-08-10 [1] CRAN (R 4.3.0)\n R6 2.5.1 2021-08-19 [1] CRAN (R 4.3.0)\n readr * 2.1.4 2023-02-10 [1] CRAN (R 4.3.0)\n rlang 1.1.1 2023-04-28 [1] CRAN (R 4.3.0)\n rmarkdown 2.24 2023-08-14 [1] CRAN (R 4.3.1)\n rprojroot 2.0.3 2022-04-02 [1] CRAN (R 4.3.0)\n rstudioapi 0.15.0 2023-07-07 [1] CRAN (R 4.3.0)\n scales 1.2.1 2022-08-20 [1] CRAN (R 4.3.0)\n sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.3.0)\n stringi 1.7.12 2023-01-11 [1] CRAN (R 4.3.0)\n stringr * 1.5.0 2022-12-02 [1] CRAN (R 4.3.0)\n tibble * 3.2.1 2023-03-20 [1] CRAN (R 4.3.0)\n tidyr * 1.3.0 2023-01-24 [1] CRAN (R 4.3.0)\n tidyselect 1.2.0 2022-10-10 [1] CRAN (R 4.3.0)\n tidyverse * 2.0.0 2023-02-22 [1] CRAN (R 4.3.0)\n timechange 0.2.0 2023-01-11 [1] CRAN (R 4.3.0)\n tzdb 0.4.0 2023-05-12 [1] CRAN (R 4.3.0)\n utf8 1.2.3 2023-01-31 [1] CRAN (R 4.3.0)\n vctrs 0.6.3 2023-06-14 [1] CRAN (R 4.3.0)\n vroom 1.6.3 2023-04-28 [1] CRAN (R 4.3.0)\n withr 2.5.0 2022-03-03 [1] CRAN (R 4.3.0)\n xfun 0.40 2023-08-09 [1] CRAN (R 4.3.0)\n yaml 2.3.7 2023-01-23 [1] CRAN (R 4.3.0)\n\n [1] /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library\n\n──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n```\n:::\n:::\n", "supporting": [ "index_files" ], diff --git a/_freeze/posts/13-ggplot2-plotting-system-part-2/index/execute-results/html.json b/_freeze/posts/13-ggplot2-plotting-system-part-2/index/execute-results/html.json index 831e44b..d6c02cd 100644 --- a/_freeze/posts/13-ggplot2-plotting-system-part-2/index/execute-results/html.json +++ b/_freeze/posts/13-ggplot2-plotting-system-part-2/index/execute-results/html.json @@ -1,7 +1,7 @@ { - "hash": "76ec5c219411d3408adcbd15aa8e66ab", + "hash": "d55dbad2db95c2293e2f5b900bdc8450", "result": { - "markdown": "---\ntitle: \"13 - The ggplot2 plotting system: ggplot()\"\nauthor:\n - name: Leonardo Collado Torres\n url: http://lcolladotor.github.io/\n affiliations:\n - id: libd\n name: Lieber Institute for Brain Development\n url: https://libd.org/\n - id: jhsph\n name: Johns Hopkins Bloomberg School of Public Health Department of Biostatistics\n url: https://publichealth.jhu.edu/departments/biostatistics\ndescription: \"An overview of the ggplot2 plotting system in R with ggplot()\"\ncategories: [module 3, week 3, R, programming, ggplot2, data viz]\n---\n\n\n*This lecture, as the rest of the course, is adapted from the version [Stephanie C. Hicks](https://www.stephaniehicks.com/) designed and maintained in 2021 and 2022. Check the recent changes to this file through the [GitHub history](https://github.com/lcolladotor/jhustatcomputing2023/commits/main/posts/13-ggplot2-plotting-system-part-2/index.qmd).*\n\n\n\n# Pre-lecture materials\n\n### Read ahead\n\n::: callout-note\n## Read ahead\n\n**Before class, you can prepare by reading the following materials:**\n\n1. \n2. \n:::\n\n### Acknowledgements\n\nMaterial for this lecture was borrowed and adopted from\n\n- \n\n# Learning objectives\n\n::: callout-note\n# Learning objectives\n\n**At the end of this lesson you will:**\n\n- Be able to build up layers of graphics using `ggplot()`\n- Be able to modify properties of a `ggplot()` including layers and labels\n:::\n\n# The ggplot2 Plotting System\n\nIn this lesson, we will get into a little more of the nitty gritty of **how `ggplot2` builds plots** and how you can customize various aspects of any plot.\n\nPreviously, we used the `qplot()` function to quickly put points on a page.\n\n- The `qplot()` function's syntax is very similar to that of the `plot()` function in base graphics so for those switching over, it makes for an easy transition.\n\nBut it is worth knowing the underlying details of how `ggplot2` works so that you can really exploit its power.\n\n## Basic components of a ggplot2 plot\n\n::: callout-tip\n### Key components\n\nA **`ggplot2` plot** consists of a number of **key components**.\n\n- A **data frame**: stores all of the data that will be displayed on the plot\n\n- **aesthetic mappings**: describe how data are mapped to color, size, shape, location\n\n- **geoms**: geometric objects like points, lines, shapes\n\n- **facets**: describes how conditional/panel plots should be constructed\n\n- **stats**: statistical transformations like binning, quantiles, smoothing\n\n- **scales**: what scale an aesthetic map uses (example: left-handed = red, right-handed = blue)\n\n- **coordinate system**: describes the system in which the locations of the geoms will be drawn\n:::\n\nIt is **essential to organize your data into a data frame** before you start with `ggplot2` (and all the **appropriate metadata** so that your data frame is self-describing and your plots will be self-documenting).\n\nWhen **building plots in `ggplot2`** (rather than using `qplot()`), the **\"artist's palette\" model may be the closest analogy**.\n\nEssentially, you start with some raw data, and then you **gradually add bits and pieces to it to create a plot**.\n\n::: callout-tip\n### Note\n\nPlots are built up in layers, with the typically ordering being\n\n1. Plot the data\n2. Overlay a summary\n3. Add metadata and annotation\n:::\n\nFor quick exploratory plots you may not get past step 1.\n\n## Example: BMI, PM2.5, Asthma\n\nTo demonstrate the various pieces of `ggplot2` we will use a running example from the **Mouse Allergen and Asthma Cohort Study (MAACS)**. Here, the question we are interested in is\n\n> \"Are overweight individuals, as measured by body mass index (BMI), more susceptible than normal weight individuals to the harmful effects of PM2.5 on asthma symptoms?\"\n\nThere is a suggestion that overweight individuals may be more susceptible to the negative effects of inhaling PM2.5.\n\nThis would suggest that increases in PM2.5 exposure in the home of an overweight child would be more deleterious to his/her asthma symptoms than they would be in the home of a normal weight child.\n\nWe want to see if we can see that difference in the data from MAACS.\n\n::: callout-tip\n### Note\n\nBecause the individual-level data for this study are protected by various U.S. privacy laws, we cannot make those data available.\n\nFor the purposes of this lesson, we have **simulated data** that share many of the same features of the original data, but do not contain any of the actual measurements or values contained in the original dataset.\n:::\n\n::: callout-tip\n### Example\n\nWe can look at the data quickly by reading it in as a tibble with `read_csv()` in the `tidyverse` package.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(tidyverse)\nlibrary(here)\nmaacs <- read_csv(here(\"data\", \"bmi_pm25_no2_sim.csv\"),\n col_types = \"nnci\")\nmaacs\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 517 × 4\n logpm25 logno2_new bmicat NocturnalSympt\n \n 1 1.25 1.18 normal weight 1\n 2 1.12 1.55 overweight 0\n 3 1.93 1.43 normal weight 0\n 4 1.37 1.77 overweight 2\n 5 0.775 0.765 normal weight 0\n 6 1.49 1.11 normal weight 0\n 7 2.16 1.43 normal weight 0\n 8 1.65 1.40 normal weight 0\n 9 1.55 1.81 normal weight 0\n10 2.04 1.35 overweight 3\n# ℹ 507 more rows\n```\n:::\n:::\n\n:::\n\nThe outcome we will look at here (`NocturnalSymp`) is the number of days in the past 2 weeks where the child experienced asthma symptoms (e.g. coughing, wheezing) while sleeping.\n\nThe other key variables are:\n\n- `logpm25`: average level of PM2.5 over the course of 7 days (micrograms per cubic meter) on the log scale\n\n- `logno2_new`: exhaled nitric oxide on the log scale\n\n- `bmicat`: categorical variable with BMI status\n\n# Building up in layers\n\nFirst, we can **create a `ggplot` object** that stores the dataset and the basic aesthetics for mapping the x- and y-coordinates for the plot.\n\n::: callout-tip\n### Example\n\nHere, we will eventually be plotting the log of PM2.5 and `NocturnalSymp` variable.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ng <- ggplot(maacs, aes(x = logpm25, \n y = NocturnalSympt))\nsummary(g)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\ndata: logpm25, logno2_new, bmicat, NocturnalSympt [517x4]\nmapping: x = ~logpm25, y = ~NocturnalSympt\nfaceting: \n compute_layout: function\n draw_back: function\n draw_front: function\n draw_labels: function\n draw_panels: function\n finish_data: function\n init_scales: function\n map_data: function\n params: list\n setup_data: function\n setup_params: function\n shrink: TRUE\n train_scales: function\n vars: function\n super: \n```\n:::\n\n```{.r .cell-code}\nclass(g)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"gg\" \"ggplot\"\n```\n:::\n:::\n\n:::\n\nYou can see above that the object `g` contains the dataset `maacs` and the mappings.\n\nNow, normally if you were to `print()` a `ggplot` object a plot would appear on the plot device, however, our object `g` actually does not contain enough information to make a plot yet.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ng <- maacs %>%\n ggplot(aes(logpm25, NocturnalSympt))\nprint(g)\n```\n\n::: {.cell-output-display}\n![Nothing to see here!](index_files/figure-html/unnamed-chunk-3-1.png){width=672}\n:::\n:::\n\n\n## First plot with point layer\n\nTo make a scatter plot, we need add at least one **geom**, such as points.\n\nHere, we add the `geom_point()` function to create a traditional scatter plot.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ng <- maacs %>%\n ggplot(aes(logpm25, NocturnalSympt))\ng + geom_point()\n```\n\n::: {.cell-output-display}\n![Scatterplot of PM2.5 and days with nocturnal symptoms](index_files/figure-html/unnamed-chunk-4-1.png){width=672}\n:::\n:::\n\n\nHow does ggplot know what points to plot? In this case, it can grab them from the data frame `maacs` that served as the input into the `ggplot()` function.\n\n## Adding more layers\n\n### smooth\n\nBecause the data appear rather noisy, it might be better if we added a smoother on top of the points to see if there is a trend in the data with PM2.5.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ng + \n geom_point() + \n geom_smooth()\n```\n\n::: {.cell-output-display}\n![Scatterplot with smoother](index_files/figure-html/unnamed-chunk-5-1.png){width=672}\n:::\n:::\n\n\nThe default smoother is a loess smoother, which is flexible and nonparametric but might be too flexible for our purposes. Perhaps we'd prefer a simple linear regression line to highlight any first order trends. We can do this by specifying `method = \"lm\"` to `geom_smooth()`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ng + \n geom_point() + \n geom_smooth(method = \"lm\")\n```\n\n::: {.cell-output-display}\n![Scatterplot with linear regression line](index_files/figure-html/unnamed-chunk-6-1.png){width=672}\n:::\n:::\n\n\nHere, we can see there appears to be a slight increasing trend, suggesting that higher levels of PM2.5 are associated with increased days with nocturnal symptoms.\n\n::: callout-note\n### Question\n\nLet's use the `ggplot()` function with our `palmerpenguins` dataset example and make a scatter plot with `flipper_length_mm` on the x-axis, `bill_length_mm` on the y-axis, colored by `species`, and a smoother by adding a linear regression.\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# try it yourself\n\nlibrary(palmerpenguins)\npenguins \n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 344 × 8\n species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g\n \n 1 Adelie Torgersen 39.1 18.7 181 3750\n 2 Adelie Torgersen 39.5 17.4 186 3800\n 3 Adelie Torgersen 40.3 18 195 3250\n 4 Adelie Torgersen NA NA NA NA\n 5 Adelie Torgersen 36.7 19.3 193 3450\n 6 Adelie Torgersen 39.3 20.6 190 3650\n 7 Adelie Torgersen 38.9 17.8 181 3625\n 8 Adelie Torgersen 39.2 19.6 195 4675\n 9 Adelie Torgersen 34.1 18.1 193 3475\n10 Adelie Torgersen 42 20.2 190 4250\n# ℹ 334 more rows\n# ℹ 2 more variables: sex , year \n```\n:::\n:::\n\n:::\n\n### facets\n\nBecause our primary question involves comparing overweight individuals to normal weight individuals, we can **stratify the scatter plot** of PM2.5 and nocturnal symptoms by the BMI category (`bmicat`) variable, which indicates whether an individual is overweight or now.\n\nTo visualize this we can **add a `facet_grid()`**, which takes a formula argument.\n\n::: callout-tip\n### Example\n\nWe want one row and two columns, one column for each weight category. So we specify `bmicat` on the right hand side of the forumla passed to `facet_grid()`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ng + \n geom_point() + \n geom_smooth(method = \"lm\") +\n facet_grid(. ~ bmicat) \n```\n\n::: {.cell-output-display}\n![Scatterplot of PM2.5 and nocturnal symptoms by BMI category](index_files/figure-html/unnamed-chunk-8-1.png){width=864}\n:::\n:::\n\n:::\n\nNow it seems clear that the relationship between PM2.5 and nocturnal symptoms is relatively flat among normal weight individuals, while the relationship is increasing among overweight individuals.\n\nThis plot suggests that overweight individuals may be more susceptible to the effects of PM2.5.\n\n# Modifying geom properties\n\nYou can **modify properties of geoms** by specifying options to their respective `geom_*()` functions.\n\n### map aesthetics to constants\n\n::: callout-tip\n### Example\n\nFor example, here we modify the points in the scatterplot to make the color \"steelblue\", the size larger, and the alpha transparency greater.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ng + geom_point(color = \"steelblue\", size = 4, alpha = 1/2)\n```\n\n::: {.cell-output-display}\n![Modifying point color with a constant](index_files/figure-html/unnamed-chunk-9-1.png){width=672}\n:::\n:::\n\n:::\n\n### map aesthetics to variables\n\nIn addition to setting specific geom attributes to constant values, we can **map aesthetics to variables** in our dataset.\n\nFor example, we can map the aesthetic `color` to the variable `bmicat`, so the points will be colored according to the levels of `bmicat`.\n\nWe use the `aes()` function to indicate this difference from the plot above.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ng + geom_point(aes(color = bmicat), size = 4, alpha = 1/2)\n```\n\n::: {.cell-output-display}\n![Mapping color to a variable](index_files/figure-html/unnamed-chunk-10-1.png){width=672}\n:::\n:::\n\n\n## Customizing the smooth\n\nWe can also **customize aspects of the geoms**.\n\nFor example, we can customize the smoother that we overlay on the points with `geom_smooth()`.\n\nHere we change the line type and increase the size from the default. We also remove the shaded standard error from the line.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ng + \n geom_point(aes(color = bmicat), \n size = 2, \n alpha = 1/2) + \n geom_smooth(size = 4, \n linetype = 3, \n method = \"lm\", \n se = FALSE)\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nWarning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.\nℹ Please use `linewidth` instead.\n```\n:::\n\n::: {.cell-output-display}\n![Customizing a smoother](index_files/figure-html/unnamed-chunk-11-1.png){width=672}\n:::\n:::\n\n\n# Other important stuff\n\n## Changing the theme\n\nThe **default theme for `ggplot2` uses the gray background** with white grid lines.\n\nIf you don't find this suitable, you can use the black and white theme by using the `theme_bw()` function.\n\nThe `theme_bw()` function also allows you to set the typeface for the plot, in case you don't want the default Helvetica. Here we change the typeface to Times.\n\n::: callout-tip\n### Note\n\nFor things that only make sense globally, use `theme()`, i.e. `theme(legend.position = \"none\")`. Two standard appearance themes are included\n\n- `theme_gray()`: The default theme (gray background)\n- `theme_bw()`: More stark/plain\n:::\n\n\n::: {.cell}\n\n```{.r .cell-code}\ng + \n geom_point(aes(color = bmicat)) + \n theme_bw(base_family = \"Times\")\n```\n\n::: {.cell-output-display}\n![Modifying the theme for a plot](index_files/figure-html/unnamed-chunk-12-1.png){width=672}\n:::\n:::\n\n\n::: callout-note\n### Question\n\nLet's take our `palmerpenguins` scatterplot from above and change out the theme to use `theme_dark()`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# try it yourself\n\nlibrary(palmerpenguins)\npenguins \n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 344 × 8\n species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g\n \n 1 Adelie Torgersen 39.1 18.7 181 3750\n 2 Adelie Torgersen 39.5 17.4 186 3800\n 3 Adelie Torgersen 40.3 18 195 3250\n 4 Adelie Torgersen NA NA NA NA\n 5 Adelie Torgersen 36.7 19.3 193 3450\n 6 Adelie Torgersen 39.3 20.6 190 3650\n 7 Adelie Torgersen 38.9 17.8 181 3625\n 8 Adelie Torgersen 39.2 19.6 195 4675\n 9 Adelie Torgersen 34.1 18.1 193 3475\n10 Adelie Torgersen 42 20.2 190 4250\n# ℹ 334 more rows\n# ℹ 2 more variables: sex , year \n```\n:::\n:::\n\n:::\n\n## Modifying labels\n\n::: callout-tip\n### Note\n\nThere are a variety of **annotations** you can add to a plot, including **different kinds of labels**.\n\n- `xlab()` for x-axis labels\n- `ylab()` for y-axis labels\n- `ggtitle()` for specifying plot titles\n\n`labs()` function is generic and can be used to modify multiple types of labels at once\n:::\n\nHere is an example of modifying the title and the `x` and `y` labels to make the plot a bit more informative.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ng + \n geom_point(aes(color = bmicat)) + \n labs(title = \"MAACS Cohort\") + \n labs(x = expression(\"log \" * PM[2.5]), \n y = \"Nocturnal Symptoms\")\n```\n\n::: {.cell-output-display}\n![Modifying plot labels](index_files/figure-html/unnamed-chunk-14-1.png){width=672}\n:::\n:::\n\n\n## A quick aside about axis limits\n\nOne quick **quirk about `ggplot2`** that caught me up when I first started using the package can be displayed in the following example.\n\nIf you make a lot of time series plots, you often **want to restrict the range of the y-axis** while still plotting all the data.\n\nIn the base graphics system you can do that as follows.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ntestdat <- data.frame(x = 1:100, \n y = rnorm(100))\ntestdat[50,2] <- 100 ## Outlier!\nplot(testdat$x, \n testdat$y,\n type = \"l\", \n ylim = c(-3,3))\n```\n\n::: {.cell-output-display}\n![Time series plot with base graphics](index_files/figure-html/unnamed-chunk-15-1.png){width=672}\n:::\n:::\n\n\nHere, we have restricted the y-axis range to be between -3 and 3, even though there is a clear outlier in the data.\n\n::: callout-tip\n### Example\n\nWith `ggplot2` the default settings will give you this.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ng <- ggplot(testdat, aes(x = x, y = y))\ng + geom_line()\n```\n\n::: {.cell-output-display}\n![Time series plot with default settings](index_files/figure-html/unnamed-chunk-16-1.png){width=672}\n:::\n:::\n\n\nOne might think that modifying the `ylim()` attribute would give you the same thing as the base plot, but it doesn't (?????)\n\n\n::: {.cell}\n\n```{.r .cell-code}\ng + \n geom_line() + \n ylim(-3, 3)\n```\n\n::: {.cell-output-display}\n![Time series plot with modified ylim](index_files/figure-html/unnamed-chunk-17-1.png){width=672}\n:::\n:::\n\n:::\n\nEffectively, what this does is subset the data so that only observations between -3 and 3 are included, then plot the data.\n\nTo plot the data without subsetting it first and still get the restricted range, you have to do the following.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ng + \n geom_line() + \n coord_cartesian(ylim = c(-3, 3))\n```\n\n::: {.cell-output-display}\n![Time series plot with restricted y-axis range](index_files/figure-html/unnamed-chunk-18-1.png){width=672}\n:::\n:::\n\n\nAnd now you know!\n\n# Post-lecture materials\n\n### Resources\n\n- The *ggplot2* book by Hadley Wickham\n- The *R Graphics Cookbook* by Winston Chang (examples in base plots and in `ggplot2`)\n- [tidyverse web site](http://ggplot2.tidyverse.org)\n\n### More complex example with `ggplot2`\n\nNow you get the sense that plots in the `ggplot2` system are constructed by successively adding components to the plot, starting with the base dataset and maybe a scatterplot. In this section bleow, you can see a slightly more complicated example with an additional variable.\n\n
\n\nClick here for a slightly more complicated example with `ggplot()`.\n\nNow, we will ask the question\n\n> How does the relationship between PM2.5 and nocturnal symptoms vary by BMI category and nitrogen dioxide (NO2)?\n\nUnlike our previous BMI variable, NO2 is continuous, and so we need to make NO2 categorical so we can condition on it in the plotting. We can use the `cut()` function for this purpose. We will divide the NO2 variable into tertiles.\n\nFirst we need to calculate the tertiles with the `quantile()` function.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncutpoints <- quantile(maacs$logno2_new, seq(0, 1, length = 4), na.rm = TRUE)\n```\n:::\n\n\nThen we need to divide the original `logno2_new` variable into the ranges defined by the cut points computed above.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nmaacs$no2tert <- cut(maacs$logno2_new, cutpoints)\n```\n:::\n\n\nThe `not2tert` variable is now a categorical factor variable containing 3 levels, indicating the ranges of NO2 (on the log scale).\n\n\n::: {.cell}\n\n```{.r .cell-code}\n## See the levels of the newly created factor variable\nlevels(maacs$no2tert)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"(0.342,1.23]\" \"(1.23,1.47]\" \"(1.47,2.17]\" \n```\n:::\n:::\n\n\nThe final plot shows the relationship between PM2.5 and nocturnal symptoms by BMI category and NO2 tertile.\n\n\n::: {.cell}\n\n```{.r .cell-code}\n## Setup ggplot with data frame\ng <- maacs %>%\n ggplot(aes(logpm25, NocturnalSympt))\n\n## Add layers\ng + geom_point(alpha = 1/3) + \n facet_grid(bmicat ~ no2tert) + \n geom_smooth(method=\"lm\", se=FALSE, col=\"steelblue\") + \n theme_bw(base_family = \"Avenir\", base_size = 10) + \n labs(x = expression(\"log \" * PM[2.5])) + \n labs(y = \"Nocturnal Symptoms\") + \n labs(title = \"MAACS Cohort\")\n```\n\n::: {.cell-output .cell-output-stderr}\n```\n`geom_smooth()` using formula = 'y ~ x'\n```\n:::\n\n::: {.cell-output-display}\n![PM2.5 and nocturnal symptoms by BMI category and NO2 tertile](index_files/figure-html/unnamed-chunk-22-1.png){width=864}\n:::\n:::\n\n\n
\n\n### Final Questions\n\nHere are some post-lecture questions to help you think about the material discussed.\n\n::: callout-note\n### Questions\n\n1. What happens if you facet on a continuous variable?\n\n2. Read `?facet_wrap`. What does `nrow` do? What does `ncol` do? What other options control the layout of the individual panels? Why doesn't `facet_grid()` have `nrow` and `ncol` arguments?\n\n3. What geom would you use to draw a line chart? A boxplot? A histogram? An area chart?\n\n4. What does `geom_col()` do? How is it different to `geom_bar()`?\n:::\n\n### Additional Resources\n\n::: callout-tip\n- \n- \n:::\n\n# R session information\n\n\n::: {.cell}\n\n```{.r .cell-code}\noptions(width = 120)\nsessioninfo::session_info()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────\n setting value\n version R version 4.3.1 (2023-06-16)\n os macOS Ventura 13.5\n system aarch64, darwin20\n ui X11\n language (EN)\n collate en_US.UTF-8\n ctype en_US.UTF-8\n tz America/New_York\n date 2023-08-17\n pandoc 3.1.5 @ /opt/homebrew/bin/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────\n package * version date (UTC) lib source\n bit 4.0.5 2022-11-15 [1] CRAN (R 4.3.0)\n bit64 4.0.5 2020-08-30 [1] CRAN (R 4.3.0)\n cli 3.6.1 2023-03-23 [1] CRAN (R 4.3.0)\n colorout 1.2-2 2023-05-06 [1] Github (jalvesaq/colorout@79931fd)\n colorspace 2.1-0 2023-01-23 [1] CRAN (R 4.3.0)\n crayon 1.5.2 2022-09-29 [1] CRAN (R 4.3.0)\n digest 0.6.33 2023-07-07 [1] CRAN (R 4.3.0)\n dplyr * 1.1.2 2023-04-20 [1] CRAN (R 4.3.0)\n evaluate 0.21 2023-05-05 [1] CRAN (R 4.3.0)\n fansi 1.0.4 2023-01-22 [1] CRAN (R 4.3.0)\n farver 2.1.1 2022-07-06 [1] CRAN (R 4.3.0)\n fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.3.0)\n forcats * 1.0.0 2023-01-29 [1] CRAN (R 4.3.0)\n generics 0.1.3 2022-07-05 [1] CRAN (R 4.3.0)\n ggplot2 * 3.4.3 2023-08-14 [1] CRAN (R 4.3.1)\n glue 1.6.2 2022-02-24 [1] CRAN (R 4.3.0)\n gtable 0.3.3 2023-03-21 [1] CRAN (R 4.3.0)\n here * 1.0.1 2020-12-13 [1] CRAN (R 4.3.0)\n hms 1.1.3 2023-03-21 [1] CRAN (R 4.3.0)\n htmltools 0.5.6 2023-08-10 [1] CRAN (R 4.3.0)\n htmlwidgets 1.6.2 2023-03-17 [1] CRAN (R 4.3.0)\n jsonlite 1.8.7 2023-06-29 [1] CRAN (R 4.3.0)\n knitr 1.43 2023-05-25 [1] CRAN (R 4.3.0)\n labeling 0.4.2 2020-10-20 [1] CRAN (R 4.3.0)\n lattice 0.21-8 2023-04-05 [1] CRAN (R 4.3.1)\n lifecycle 1.0.3 2022-10-07 [1] CRAN (R 4.3.0)\n lubridate * 1.9.2 2023-02-10 [1] CRAN (R 4.3.0)\n magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.3.0)\n Matrix 1.6-1 2023-08-14 [1] CRAN (R 4.3.0)\n mgcv 1.9-0 2023-07-11 [1] CRAN (R 4.3.0)\n munsell 0.5.0 2018-06-12 [1] CRAN (R 4.3.0)\n nlme 3.1-163 2023-08-09 [1] CRAN (R 4.3.0)\n palmerpenguins * 0.1.1 2022-08-15 [1] CRAN (R 4.3.0)\n pillar 1.9.0 2023-03-22 [1] CRAN (R 4.3.0)\n pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 4.3.0)\n purrr * 1.0.2 2023-08-10 [1] CRAN (R 4.3.0)\n R6 2.5.1 2021-08-19 [1] CRAN (R 4.3.0)\n readr * 2.1.4 2023-02-10 [1] CRAN (R 4.3.0)\n rlang 1.1.1 2023-04-28 [1] CRAN (R 4.3.0)\n rmarkdown 2.24 2023-08-14 [1] CRAN (R 4.3.1)\n rprojroot 2.0.3 2022-04-02 [1] CRAN (R 4.3.0)\n rstudioapi 0.15.0 2023-07-07 [1] CRAN (R 4.3.0)\n scales 1.2.1 2022-08-20 [1] CRAN (R 4.3.0)\n sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.3.0)\n stringi 1.7.12 2023-01-11 [1] CRAN (R 4.3.0)\n stringr * 1.5.0 2022-12-02 [1] CRAN (R 4.3.0)\n tibble * 3.2.1 2023-03-20 [1] CRAN (R 4.3.0)\n tidyr * 1.3.0 2023-01-24 [1] CRAN (R 4.3.0)\n tidyselect 1.2.0 2022-10-10 [1] CRAN (R 4.3.0)\n tidyverse * 2.0.0 2023-02-22 [1] CRAN (R 4.3.0)\n timechange 0.2.0 2023-01-11 [1] CRAN (R 4.3.0)\n tzdb 0.4.0 2023-05-12 [1] CRAN (R 4.3.0)\n utf8 1.2.3 2023-01-31 [1] CRAN (R 4.3.0)\n vctrs 0.6.3 2023-06-14 [1] CRAN (R 4.3.0)\n vroom 1.6.3 2023-04-28 [1] CRAN (R 4.3.0)\n withr 2.5.0 2022-03-03 [1] CRAN (R 4.3.0)\n xfun 0.40 2023-08-09 [1] CRAN (R 4.3.0)\n yaml 2.3.7 2023-01-23 [1] CRAN (R 4.3.0)\n\n [1] /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library\n\n──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n```\n:::\n:::\n", + "markdown": "---\ntitle: \"13 - The ggplot2 plotting system: ggplot()\"\nauthor:\n - name: Leonardo Collado Torres\n url: http://lcolladotor.github.io/\n affiliations:\n - id: libd\n name: Lieber Institute for Brain Development\n url: https://libd.org/\n - id: jhsph\n name: Johns Hopkins Bloomberg School of Public Health Department of Biostatistics\n url: https://publichealth.jhu.edu/departments/biostatistics\ndescription: \"An overview of the ggplot2 plotting system in R with ggplot()\"\ncategories: [module 3, week 3, R, programming, ggplot2, data viz]\n---\n\n\n*This lecture, as the rest of the course, is adapted from the version [Stephanie C. Hicks](https://www.stephaniehicks.com/) designed and maintained in 2021 and 2022. Check the recent changes to this file through the [GitHub history](https://github.com/lcolladotor/jhustatcomputing2023/commits/main/posts/13-ggplot2-plotting-system-part-2/index.qmd).*\n\n\n\n# Pre-lecture materials\n\n### Read ahead\n\n::: callout-note\n## Read ahead\n\n**Before class, you can prepare by reading the following materials:**\n\n1. \n2. \n:::\n\n### Acknowledgements\n\nMaterial for this lecture was borrowed and adopted from\n\n- \n\n# Learning objectives\n\n::: callout-note\n# Learning objectives\n\n**At the end of this lesson you will:**\n\n- Be able to build up layers of graphics using `ggplot()`\n- Be able to modify properties of a `ggplot()` including layers and labels\n:::\n\n# The ggplot2 Plotting System\n\nIn this lesson, we will get into a little more of the nitty gritty of **how `ggplot2` builds plots** and how you can customize various aspects of any plot.\n\nPreviously, we used the `qplot()` function to quickly put points on a page.\n\n- The `qplot()` function's syntax is very similar to that of the `plot()` function in base graphics so for those switching over, it makes for an easy transition.\n\nBut it is worth knowing the underlying details of how `ggplot2` works so that you can really exploit its power.\n\n## Basic components of a ggplot2 plot\n\n::: callout-tip\n### Key components\n\nA **`ggplot2` plot** consists of a number of **key components**.\n\n- A **data frame**: stores all of the data that will be displayed on the plot\n\n- **aesthetic mappings**: describe how data are mapped to color, size, shape, location\n\n- **geoms**: geometric objects like points, lines, shapes\n\n- **facets**: describes how conditional/panel plots should be constructed\n\n- **stats**: statistical transformations like binning, quantiles, smoothing\n\n- **scales**: what scale an aesthetic map uses (example: left-handed = red, right-handed = blue)\n\n- **coordinate system**: describes the system in which the locations of the geoms will be drawn\n:::\n\nIt is **essential to organize your data into a data frame** before you start with `ggplot2` (and all the **appropriate metadata** so that your data frame is self-describing and your plots will be self-documenting).\n\nWhen **building plots in `ggplot2`** (rather than using `qplot()`), the **\"artist's palette\" model may be the closest analogy**.\n\nEssentially, you start with some raw data, and then you **gradually add bits and pieces to it to create a plot**.\n\n::: callout-tip\n### Note\n\nPlots are built up in layers, with the typically ordering being\n\n1. Plot the data\n2. Overlay a summary\n3. Add metadata and annotation\n:::\n\nFor quick exploratory plots you may not get past step 1.\n\n## Example: BMI, PM2.5, Asthma\n\nTo demonstrate the various pieces of `ggplot2` we will use a running example from the **Mouse Allergen and Asthma Cohort Study (MAACS)**. Here, the question we are interested in is\n\n> \"Are overweight individuals, as measured by body mass index (BMI), more susceptible than normal weight individuals to the harmful effects of PM2.5 on asthma symptoms?\"\n\nThere is a suggestion that overweight individuals may be more susceptible to the negative effects of inhaling PM2.5.\n\nThis would suggest that increases in PM2.5 exposure in the home of an overweight child would be more deleterious to his/her asthma symptoms than they would be in the home of a normal weight child.\n\nWe want to see if we can see that difference in the data from MAACS.\n\n::: callout-tip\n### Note\n\nBecause the individual-level data for this study are protected by various U.S. privacy laws, we cannot make those data available.\n\nFor the purposes of this lesson, we have **simulated data** that share many of the same features of the original data, but do not contain any of the actual measurements or values contained in the original dataset.\n:::\n\n::: callout-tip\n### Example\n\nWe can look at the data quickly by reading it in as a tibble with `read_csv()` in the `tidyverse` package.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(tidyverse)\nlibrary(here)\nmaacs <- read_csv(here(\"data\", \"bmi_pm25_no2_sim.csv\"),\n col_types = \"nnci\"\n)\nmaacs\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 517 × 4\n logpm25 logno2_new bmicat NocturnalSympt\n \n 1 1.25 1.18 normal weight 1\n 2 1.12 1.55 overweight 0\n 3 1.93 1.43 normal weight 0\n 4 1.37 1.77 overweight 2\n 5 0.775 0.765 normal weight 0\n 6 1.49 1.11 normal weight 0\n 7 2.16 1.43 normal weight 0\n 8 1.65 1.40 normal weight 0\n 9 1.55 1.81 normal weight 0\n10 2.04 1.35 overweight 3\n# ℹ 507 more rows\n```\n:::\n:::\n\n:::\n\nThe outcome we will look at here (`NocturnalSymp`) is the number of days in the past 2 weeks where the child experienced asthma symptoms (e.g. coughing, wheezing) while sleeping.\n\nThe other key variables are:\n\n- `logpm25`: average level of PM2.5 over the course of 7 days (micrograms per cubic meter) on the log scale\n\n- `logno2_new`: exhaled nitric oxide on the log scale\n\n- `bmicat`: categorical variable with BMI status\n\n# Building up in layers\n\nFirst, we can **create a `ggplot` object** that stores the dataset and the basic aesthetics for mapping the x- and y-coordinates for the plot.\n\n::: callout-tip\n### Example\n\nHere, we will eventually be plotting the log of PM2.5 and `NocturnalSymp` variable.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ng <- ggplot(maacs, aes(\n x = logpm25,\n y = NocturnalSympt\n))\nsummary(g)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\ndata: logpm25, logno2_new, bmicat, NocturnalSympt [517x4]\nmapping: x = ~logpm25, y = ~NocturnalSympt\nfaceting: \n compute_layout: function\n draw_back: function\n draw_front: function\n draw_labels: function\n draw_panels: function\n finish_data: function\n init_scales: function\n map_data: function\n params: list\n setup_data: function\n setup_params: function\n shrink: TRUE\n train_scales: function\n vars: function\n super: \n```\n:::\n\n```{.r .cell-code}\nclass(g)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"gg\" \"ggplot\"\n```\n:::\n:::\n\n:::\n\nYou can see above that the object `g` contains the dataset `maacs` and the mappings.\n\nNow, normally if you were to `print()` a `ggplot` object a plot would appear on the plot device, however, our object `g` actually does not contain enough information to make a plot yet.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ng <- maacs %>%\n ggplot(aes(logpm25, NocturnalSympt))\nprint(g)\n```\n\n::: {.cell-output-display}\n![Nothing to see here!](index_files/figure-html/unnamed-chunk-3-1.png){width=672}\n:::\n:::\n\n\n## First plot with point layer\n\nTo make a scatter plot, we need add at least one **geom**, such as points.\n\nHere, we add the `geom_point()` function to create a traditional scatter plot.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ng <- maacs %>%\n ggplot(aes(logpm25, NocturnalSympt))\ng + geom_point()\n```\n\n::: {.cell-output-display}\n![Scatterplot of PM2.5 and days with nocturnal symptoms](index_files/figure-html/unnamed-chunk-4-1.png){width=672}\n:::\n:::\n\n\nHow does ggplot know what points to plot? In this case, it can grab them from the data frame `maacs` that served as the input into the `ggplot()` function.\n\n## Adding more layers\n\n### smooth\n\nBecause the data appear rather noisy, it might be better if we added a smoother on top of the points to see if there is a trend in the data with PM2.5.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ng +\n geom_point() +\n geom_smooth()\n```\n\n::: {.cell-output-display}\n![Scatterplot with smoother](index_files/figure-html/unnamed-chunk-5-1.png){width=672}\n:::\n:::\n\n\nThe default smoother is a loess smoother, which is flexible and nonparametric but might be too flexible for our purposes. Perhaps we'd prefer a simple linear regression line to highlight any first order trends. We can do this by specifying `method = \"lm\"` to `geom_smooth()`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ng +\n geom_point() +\n geom_smooth(method = \"lm\")\n```\n\n::: {.cell-output-display}\n![Scatterplot with linear regression line](index_files/figure-html/unnamed-chunk-6-1.png){width=672}\n:::\n:::\n\n\nHere, we can see there appears to be a slight increasing trend, suggesting that higher levels of PM2.5 are associated with increased days with nocturnal symptoms.\n\n::: callout-note\n### Question\n\nLet's use the `ggplot()` function with our `palmerpenguins` dataset example and make a scatter plot with `flipper_length_mm` on the x-axis, `bill_length_mm` on the y-axis, colored by `species`, and a smoother by adding a linear regression.\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# try it yourself\n\nlibrary(palmerpenguins)\npenguins\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 344 × 8\n species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g\n \n 1 Adelie Torgersen 39.1 18.7 181 3750\n 2 Adelie Torgersen 39.5 17.4 186 3800\n 3 Adelie Torgersen 40.3 18 195 3250\n 4 Adelie Torgersen NA NA NA NA\n 5 Adelie Torgersen 36.7 19.3 193 3450\n 6 Adelie Torgersen 39.3 20.6 190 3650\n 7 Adelie Torgersen 38.9 17.8 181 3625\n 8 Adelie Torgersen 39.2 19.6 195 4675\n 9 Adelie Torgersen 34.1 18.1 193 3475\n10 Adelie Torgersen 42 20.2 190 4250\n# ℹ 334 more rows\n# ℹ 2 more variables: sex , year \n```\n:::\n:::\n\n:::\n\n### facets\n\nBecause our primary question involves comparing overweight individuals to normal weight individuals, we can **stratify the scatter plot** of PM2.5 and nocturnal symptoms by the BMI category (`bmicat`) variable, which indicates whether an individual is overweight or now.\n\nTo visualize this we can **add a `facet_grid()`**, which takes a formula argument.\n\n::: callout-tip\n### Example\n\nWe want one row and two columns, one column for each weight category. So we specify `bmicat` on the right hand side of the forumla passed to `facet_grid()`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ng +\n geom_point() +\n geom_smooth(method = \"lm\") +\n facet_grid(. ~ bmicat)\n```\n\n::: {.cell-output-display}\n![Scatterplot of PM2.5 and nocturnal symptoms by BMI category](index_files/figure-html/unnamed-chunk-8-1.png){width=864}\n:::\n:::\n\n:::\n\nNow it seems clear that the relationship between PM2.5 and nocturnal symptoms is relatively flat among normal weight individuals, while the relationship is increasing among overweight individuals.\n\nThis plot suggests that overweight individuals may be more susceptible to the effects of PM2.5.\n\n# Modifying geom properties\n\nYou can **modify properties of geoms** by specifying options to their respective `geom_*()` functions.\n\n### map aesthetics to constants\n\n::: callout-tip\n### Example\n\nFor example, here we modify the points in the scatterplot to make the color \"steelblue\", the size larger, and the alpha transparency greater.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ng + geom_point(color = \"steelblue\", size = 4, alpha = 1 / 2)\n```\n\n::: {.cell-output-display}\n![Modifying point color with a constant](index_files/figure-html/unnamed-chunk-9-1.png){width=672}\n:::\n:::\n\n:::\n\n### map aesthetics to variables\n\nIn addition to setting specific geom attributes to constant values, we can **map aesthetics to variables** in our dataset.\n\nFor example, we can map the aesthetic `color` to the variable `bmicat`, so the points will be colored according to the levels of `bmicat`.\n\nWe use the `aes()` function to indicate this difference from the plot above.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ng + geom_point(aes(color = bmicat), size = 4, alpha = 1 / 2)\n```\n\n::: {.cell-output-display}\n![Mapping color to a variable](index_files/figure-html/unnamed-chunk-10-1.png){width=672}\n:::\n:::\n\n\n## Customizing the smooth\n\nWe can also **customize aspects of the geoms**.\n\nFor example, we can customize the smoother that we overlay on the points with `geom_smooth()`.\n\nHere we change the line type and increase the size from the default. We also remove the shaded standard error from the line.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ng +\n geom_point(aes(color = bmicat),\n size = 2,\n alpha = 1 / 2\n ) +\n geom_smooth(\n size = 4,\n linetype = 3,\n method = \"lm\",\n se = FALSE\n )\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nWarning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.\nℹ Please use `linewidth` instead.\n```\n:::\n\n::: {.cell-output-display}\n![Customizing a smoother](index_files/figure-html/unnamed-chunk-11-1.png){width=672}\n:::\n:::\n\n\n# Other important stuff\n\n## Changing the theme\n\nThe **default theme for `ggplot2` uses the gray background** with white grid lines.\n\nIf you don't find this suitable, you can use the black and white theme by using the `theme_bw()` function.\n\nThe `theme_bw()` function also allows you to set the typeface for the plot, in case you don't want the default Helvetica. Here we change the typeface to Times.\n\n::: callout-tip\n### Note\n\nFor things that only make sense globally, use `theme()`, i.e. `theme(legend.position = \"none\")`. Two standard appearance themes are included\n\n- `theme_gray()`: The default theme (gray background)\n- `theme_bw()`: More stark/plain\n:::\n\n\n::: {.cell}\n\n```{.r .cell-code}\ng +\n geom_point(aes(color = bmicat)) +\n theme_bw(base_family = \"Times\")\n```\n\n::: {.cell-output-display}\n![Modifying the theme for a plot](index_files/figure-html/unnamed-chunk-12-1.png){width=672}\n:::\n:::\n\n\n::: callout-note\n### Question\n\nLet's take our `palmerpenguins` scatterplot from above and change out the theme to use `theme_dark()`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# try it yourself\n\nlibrary(palmerpenguins)\npenguins\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 344 × 8\n species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g\n \n 1 Adelie Torgersen 39.1 18.7 181 3750\n 2 Adelie Torgersen 39.5 17.4 186 3800\n 3 Adelie Torgersen 40.3 18 195 3250\n 4 Adelie Torgersen NA NA NA NA\n 5 Adelie Torgersen 36.7 19.3 193 3450\n 6 Adelie Torgersen 39.3 20.6 190 3650\n 7 Adelie Torgersen 38.9 17.8 181 3625\n 8 Adelie Torgersen 39.2 19.6 195 4675\n 9 Adelie Torgersen 34.1 18.1 193 3475\n10 Adelie Torgersen 42 20.2 190 4250\n# ℹ 334 more rows\n# ℹ 2 more variables: sex , year \n```\n:::\n:::\n\n:::\n\n## Modifying labels\n\n::: callout-tip\n### Note\n\nThere are a variety of **annotations** you can add to a plot, including **different kinds of labels**.\n\n- `xlab()` for x-axis labels\n- `ylab()` for y-axis labels\n- `ggtitle()` for specifying plot titles\n\n`labs()` function is generic and can be used to modify multiple types of labels at once\n:::\n\nHere is an example of modifying the title and the `x` and `y` labels to make the plot a bit more informative.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ng +\n geom_point(aes(color = bmicat)) +\n labs(title = \"MAACS Cohort\") +\n labs(\n x = expression(\"log \" * PM[2.5]),\n y = \"Nocturnal Symptoms\"\n )\n```\n\n::: {.cell-output-display}\n![Modifying plot labels](index_files/figure-html/unnamed-chunk-14-1.png){width=672}\n:::\n:::\n\n\n## A quick aside about axis limits\n\nOne quick **quirk about `ggplot2`** that caught me up when I first started using the package can be displayed in the following example.\n\nIf you make a lot of time series plots, you often **want to restrict the range of the y-axis** while still plotting all the data.\n\nIn the base graphics system you can do that as follows.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ntestdat <- data.frame(\n x = 1:100,\n y = rnorm(100)\n)\ntestdat[50, 2] <- 100 ## Outlier!\nplot(testdat$x,\n testdat$y,\n type = \"l\",\n ylim = c(-3, 3)\n)\n```\n\n::: {.cell-output-display}\n![Time series plot with base graphics](index_files/figure-html/unnamed-chunk-15-1.png){width=672}\n:::\n:::\n\n\nHere, we have restricted the y-axis range to be between -3 and 3, even though there is a clear outlier in the data.\n\n::: callout-tip\n### Example\n\nWith `ggplot2` the default settings will give you this.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ng <- ggplot(testdat, aes(x = x, y = y))\ng + geom_line()\n```\n\n::: {.cell-output-display}\n![Time series plot with default settings](index_files/figure-html/unnamed-chunk-16-1.png){width=672}\n:::\n:::\n\n\nOne might think that modifying the `ylim()` attribute would give you the same thing as the base plot, but it doesn't (?????)\n\n\n::: {.cell}\n\n```{.r .cell-code}\ng +\n geom_line() +\n ylim(-3, 3)\n```\n\n::: {.cell-output-display}\n![Time series plot with modified ylim](index_files/figure-html/unnamed-chunk-17-1.png){width=672}\n:::\n:::\n\n:::\n\nEffectively, what this does is subset the data so that only observations between -3 and 3 are included, then plot the data.\n\nTo plot the data without subsetting it first and still get the restricted range, you have to do the following.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ng +\n geom_line() +\n coord_cartesian(ylim = c(-3, 3))\n```\n\n::: {.cell-output-display}\n![Time series plot with restricted y-axis range](index_files/figure-html/unnamed-chunk-18-1.png){width=672}\n:::\n:::\n\n\nAnd now you know!\n\n# Post-lecture materials\n\n### Resources\n\n- The *ggplot2* book by Hadley Wickham\n- The *R Graphics Cookbook* by Winston Chang (examples in base plots and in `ggplot2`)\n- [tidyverse web site](http://ggplot2.tidyverse.org)\n\n### More complex example with `ggplot2`\n\nNow you get the sense that plots in the `ggplot2` system are constructed by successively adding components to the plot, starting with the base dataset and maybe a scatterplot. In this section bleow, you can see a slightly more complicated example with an additional variable.\n\n
\n\nClick here for a slightly more complicated example with `ggplot()`.\n\nNow, we will ask the question\n\n> How does the relationship between PM2.5 and nocturnal symptoms vary by BMI category and nitrogen dioxide (NO2)?\n\nUnlike our previous BMI variable, NO2 is continuous, and so we need to make NO2 categorical so we can condition on it in the plotting. We can use the `cut()` function for this purpose. We will divide the NO2 variable into tertiles.\n\nFirst we need to calculate the tertiles with the `quantile()` function.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncutpoints <- quantile(maacs$logno2_new, seq(0, 1, length = 4), na.rm = TRUE)\n```\n:::\n\n\nThen we need to divide the original `logno2_new` variable into the ranges defined by the cut points computed above.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nmaacs$no2tert <- cut(maacs$logno2_new, cutpoints)\n```\n:::\n\n\nThe `not2tert` variable is now a categorical factor variable containing 3 levels, indicating the ranges of NO2 (on the log scale).\n\n\n::: {.cell}\n\n```{.r .cell-code}\n## See the levels of the newly created factor variable\nlevels(maacs$no2tert)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"(0.342,1.23]\" \"(1.23,1.47]\" \"(1.47,2.17]\" \n```\n:::\n:::\n\n\nThe final plot shows the relationship between PM2.5 and nocturnal symptoms by BMI category and NO2 tertile.\n\n\n::: {.cell}\n\n```{.r .cell-code}\n## Setup ggplot with data frame\ng <- maacs %>%\n ggplot(aes(logpm25, NocturnalSympt))\n\n## Add layers\ng + geom_point(alpha = 1 / 3) +\n facet_grid(bmicat ~ no2tert) +\n geom_smooth(method = \"lm\", se = FALSE, col = \"steelblue\") +\n theme_bw(base_family = \"Avenir\", base_size = 10) +\n labs(x = expression(\"log \" * PM[2.5])) +\n labs(y = \"Nocturnal Symptoms\") +\n labs(title = \"MAACS Cohort\")\n```\n\n::: {.cell-output .cell-output-stderr}\n```\n`geom_smooth()` using formula = 'y ~ x'\n```\n:::\n\n::: {.cell-output-display}\n![PM2.5 and nocturnal symptoms by BMI category and NO2 tertile](index_files/figure-html/unnamed-chunk-22-1.png){width=864}\n:::\n:::\n\n\n
\n\n### Final Questions\n\nHere are some post-lecture questions to help you think about the material discussed.\n\n::: callout-note\n### Questions\n\n1. What happens if you facet on a continuous variable?\n\n2. Read `?facet_wrap`. What does `nrow` do? What does `ncol` do? What other options control the layout of the individual panels? Why doesn't `facet_grid()` have `nrow` and `ncol` arguments?\n\n3. What geom would you use to draw a line chart? A boxplot? A histogram? An area chart?\n\n4. What does `geom_col()` do? How is it different to `geom_bar()`?\n:::\n\n### Additional Resources\n\n::: callout-tip\n- \n- \n:::\n\n# R session information\n\n\n::: {.cell}\n\n```{.r .cell-code}\noptions(width = 120)\nsessioninfo::session_info()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────\n setting value\n version R version 4.3.1 (2023-06-16)\n os macOS Ventura 13.5\n system aarch64, darwin20\n ui X11\n language (EN)\n collate en_US.UTF-8\n ctype en_US.UTF-8\n tz America/New_York\n date 2023-08-17\n pandoc 3.1.5 @ /opt/homebrew/bin/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────\n package * version date (UTC) lib source\n bit 4.0.5 2022-11-15 [1] CRAN (R 4.3.0)\n bit64 4.0.5 2020-08-30 [1] CRAN (R 4.3.0)\n cli 3.6.1 2023-03-23 [1] CRAN (R 4.3.0)\n colorout 1.2-2 2023-05-06 [1] Github (jalvesaq/colorout@79931fd)\n colorspace 2.1-0 2023-01-23 [1] CRAN (R 4.3.0)\n crayon 1.5.2 2022-09-29 [1] CRAN (R 4.3.0)\n digest 0.6.33 2023-07-07 [1] CRAN (R 4.3.0)\n dplyr * 1.1.2 2023-04-20 [1] CRAN (R 4.3.0)\n evaluate 0.21 2023-05-05 [1] CRAN (R 4.3.0)\n fansi 1.0.4 2023-01-22 [1] CRAN (R 4.3.0)\n farver 2.1.1 2022-07-06 [1] CRAN (R 4.3.0)\n fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.3.0)\n forcats * 1.0.0 2023-01-29 [1] CRAN (R 4.3.0)\n generics 0.1.3 2022-07-05 [1] CRAN (R 4.3.0)\n ggplot2 * 3.4.3 2023-08-14 [1] CRAN (R 4.3.1)\n glue 1.6.2 2022-02-24 [1] CRAN (R 4.3.0)\n gtable 0.3.3 2023-03-21 [1] CRAN (R 4.3.0)\n here * 1.0.1 2020-12-13 [1] CRAN (R 4.3.0)\n hms 1.1.3 2023-03-21 [1] CRAN (R 4.3.0)\n htmltools 0.5.6 2023-08-10 [1] CRAN (R 4.3.0)\n htmlwidgets 1.6.2 2023-03-17 [1] CRAN (R 4.3.0)\n jsonlite 1.8.7 2023-06-29 [1] CRAN (R 4.3.0)\n knitr 1.43 2023-05-25 [1] CRAN (R 4.3.0)\n labeling 0.4.2 2020-10-20 [1] CRAN (R 4.3.0)\n lattice 0.21-8 2023-04-05 [1] CRAN (R 4.3.1)\n lifecycle 1.0.3 2022-10-07 [1] CRAN (R 4.3.0)\n lubridate * 1.9.2 2023-02-10 [1] CRAN (R 4.3.0)\n magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.3.0)\n Matrix 1.6-1 2023-08-14 [1] CRAN (R 4.3.0)\n mgcv 1.9-0 2023-07-11 [1] CRAN (R 4.3.0)\n munsell 0.5.0 2018-06-12 [1] CRAN (R 4.3.0)\n nlme 3.1-163 2023-08-09 [1] CRAN (R 4.3.0)\n palmerpenguins * 0.1.1 2022-08-15 [1] CRAN (R 4.3.0)\n pillar 1.9.0 2023-03-22 [1] CRAN (R 4.3.0)\n pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 4.3.0)\n purrr * 1.0.2 2023-08-10 [1] CRAN (R 4.3.0)\n R6 2.5.1 2021-08-19 [1] CRAN (R 4.3.0)\n readr * 2.1.4 2023-02-10 [1] CRAN (R 4.3.0)\n rlang 1.1.1 2023-04-28 [1] CRAN (R 4.3.0)\n rmarkdown 2.24 2023-08-14 [1] CRAN (R 4.3.1)\n rprojroot 2.0.3 2022-04-02 [1] CRAN (R 4.3.0)\n rstudioapi 0.15.0 2023-07-07 [1] CRAN (R 4.3.0)\n scales 1.2.1 2022-08-20 [1] CRAN (R 4.3.0)\n sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.3.0)\n stringi 1.7.12 2023-01-11 [1] CRAN (R 4.3.0)\n stringr * 1.5.0 2022-12-02 [1] CRAN (R 4.3.0)\n tibble * 3.2.1 2023-03-20 [1] CRAN (R 4.3.0)\n tidyr * 1.3.0 2023-01-24 [1] CRAN (R 4.3.0)\n tidyselect 1.2.0 2022-10-10 [1] CRAN (R 4.3.0)\n tidyverse * 2.0.0 2023-02-22 [1] CRAN (R 4.3.0)\n timechange 0.2.0 2023-01-11 [1] CRAN (R 4.3.0)\n tzdb 0.4.0 2023-05-12 [1] CRAN (R 4.3.0)\n utf8 1.2.3 2023-01-31 [1] CRAN (R 4.3.0)\n vctrs 0.6.3 2023-06-14 [1] CRAN (R 4.3.0)\n vroom 1.6.3 2023-04-28 [1] CRAN (R 4.3.0)\n withr 2.5.0 2022-03-03 [1] CRAN (R 4.3.0)\n xfun 0.40 2023-08-09 [1] CRAN (R 4.3.0)\n yaml 2.3.7 2023-01-23 [1] CRAN (R 4.3.0)\n\n [1] /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library\n\n──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n```\n:::\n:::\n", "supporting": [ "index_files" ], diff --git a/_freeze/posts/13-ggplot2-plotting-system-part-2/index/figure-html/unnamed-chunk-15-1.png b/_freeze/posts/13-ggplot2-plotting-system-part-2/index/figure-html/unnamed-chunk-15-1.png index d15ae2e1206062d8cb8f249ce70bf34c6c5386bb..807f126109065a47a00d6cc204238cfda769cf42 100644 GIT binary patch literal 103973 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 XY}(o#H}l7X|1QWVo=rZZfBXLfeszIw literal 115836 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ⅅM)>=7b8&z>e5QuUw9XFl@9{pf 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 xzU-hrp|6H~r{vZD9 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

YRG>|4m$ZOytkLOfY_;&mKm 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 diff --git a/_freeze/posts/13-ggplot2-plotting-system-part-2/index/figure-html/unnamed-chunk-16-1.png b/_freeze/posts/13-ggplot2-plotting-system-part-2/index/figure-html/unnamed-chunk-16-1.png index cd87fdf7c7567e421e121eb8741da25ab61d8fed..ed79c8a2fb693ff8000a2163e110844ae620693c 100644 GIT binary patch literal 64855 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 literal 67324 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

;q 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 diff --git a/_freeze/posts/13-ggplot2-plotting-system-part-2/index/figure-html/unnamed-chunk-17-1.png b/_freeze/posts/13-ggplot2-plotting-system-part-2/index/figure-html/unnamed-chunk-17-1.png index 0c3c0d5a50a165030461cdacb7c78fb110bd84a3..126a38313823577834e3c056e27a2102046f0594 100644 GIT binary patch literal 117208 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ℭg5 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ऐc3b z00Kx_OP7jA#`4f=;^v6xafM;sEky||h303}8Nt1Vb_C(Bgx@ydXdV@2u2|ixDfMBG zY(p|AyGSL1avQKCKX0I#4n%=SQwzPdntBSezPmDmx0mdHh+92_FAag?0q*4Ojb)lN znE8ph#O?BXZ5;T*1h%D#QFuKud}KsPoYv)4un|4G%-)HI$`*|THa(dT=Wo%ko02@V z9Q^(1p;5wrtCI_d^c4Uha>r!^GrGaFdu0;dQNs}Qk8q>#8*o}1-K2bt*8?k%y6$M1 za{a`nmax>CP9dV~eWkXCBi<8468$*EuaFcC;EwN4@N?39oytkdNa(ODLArHxW(L+V zS;LwTxw;3R$Z`M574R+OK12-znNix?9d- z5}=Y_1AY!m?=o{g;xlxA42^FQ$wbBM=6~d`JzZ;&_}g&EjsfJi_^K+}%0#YdA@h}4 z#O(5x${W1cNaqi?Ks#?NX?q>QV&*wo#Vr&ls8;@R2$ra=`XN??vowkb$tiLU##8s& zC-Z9E<=5*V-_Y8`E!Nie2EZiAY~FG)D)W&0dDkIVH=ROz)ZF_=L-XOgaM{Y3?`0a> zPRd<`F$g#pT!5(1zVh-2r#X-4F{J0#F^;>s%>+S>Q2Hjq_?eaFJRWgiK4;v1^IV8+ zm5*=7BgT2?{gH3h7e!fw>aLUwTp_tW1oaNsj9NP z`Wg)jfBw2*8Y_MSJ4B)c?|T7A{T)boV<)~6X{fqw2)-eyu#l}B4_y3{EYJO77y1HX#=OCPJRbKT=nHKsEjC4PIThu=K`NTw(d13r*uUzx8`3%05N z4Z;NyQ8Xfl0o2?o-^1qe;6Nq_7bO)Wu1Zk!m*^145wg64%lD(*eKphnjVZe(OG~PbPP)4-Xo{uqeBQcOb<&ZvfOr@JgJzBu^sxo{1x0GJ`h(x+qCdAZ zimZLTNQZ6EOPlb;S|5FNw_e!;INk+q!HjMuH3q>)BBq|ayO5DtYAMn;b645>YenIE zE;#L*&0#IHcKG3zy54Jv5WH;1C&kJ51(Emm5FghqxcYZ_{&XV?b;G|~leSiWn}p~l z;X2u41iV&D3+<(}xN(_lak)^#l08RwpoF%r_!Z4ii?;s;fcTlj@5F!9hf_(n>*z%O zYJPJf=QA3p1++$7qL4#}{A2{+F~)Qap!K_Q7)Kp@CW>;iV9oke7Dy(ZS+uhveBc2O zT#_jCatGucfQj#3h_e?wcjou%e>`GPuWno$_?we7EY-_jlT@(a^lbpPk@?ttxdpTT zlMcU?^l@n~A<}P^+jgTx%E1~a+V$^2q;?>HH4+IkH`)XtFX)BTk>fMakT-R(83>5w zxU|RTQ8Pk_5m;P^X7LPx%o3yrvv#oe|v z^GAB}qltb$n+Dnq4-K{=Jnt$GwgLDaUiewlBYSes-xJ2=zl``A;~_n=aE==6wHx3* zBN&QU#!XJWlf7NedWnL?z?lK}+WXO!si@0>o1=hRi{<7P|H#i(L9iN)YzWAnoYTX$;N z5NOCngWQoXt$cRZw}AG{+XqdjwC*uvd9MH<4Amb$%{CDGmIHW#=-sWNWV|0uFBao2 zL@Q`jN}|Lb*u#v*Kc8xGLHBx>0W-x9L2xKN(m$`K29=ZlG|LrUW2zE$d4qrO)&*E*E{T(Z-$H(avzaH^5jm+q# z-aBYYvd#k^V5rtG7U`dsc?YC20=x^x&pV+bdpJSHoxwiI9(p^gUbrE)bx+IF^7Zww z)7w(b33Jn##B}M&HzC*>RZz^t(HbHscm%Z2tjfA-b{5x%Jtc1Lp1m-`z1bf3?ZQpG z`Nm2$g0%_qWaYBYfZJNO+h%;F7-|h%cs=e*%8#222(7xmZFE&-7!{S#%=e-7fW%v( ze6RV6FMj}M9yWY&)LM5@u+)ci^OCGjh9VDaVWm}*2NNeynnrw24$$&Rk^waxdk z3!4%l=h?y&BB>ycdEgu-4?{eLgq!T|)#o^wI;OmEDkgg2cqIj-mXkgL4<)2IZrv6X z0cf8)1u`46W!-6HFiCU^J6*A<5Lkgb8Ys){jHGz7-%K^$NX+{*y44w*BI*cI|=Pd0ExSoSAvU~D^9)K8bYD&h#0c9yMg}_EU{jxomK$1X5{6EA>7Hc#E4&^g z_0|H!-%!T>dFwDT&S$S%w4XLeUtnY>A4xNlrcUaD_MyQ**d^8OK^>RszitRgs&f^a zY<-ZPtNqLkZztGz=cTJ4#RH(rn5WqB`{`2NQ7;Y1?Gnxy1^yxN`3y6&iYsb5T5b&w zEo$)lS;3MxF;wce_z!)C-OjyF2;W(%XwBh{gmqqcUIn$?KXdO4ydSZ|rzCM#C~Uj* zdY({(G8aSK#Y5oSwa=yCaFE_ory0yXtC<@__|xIP?XoP}u34`x7#g7ftOWy3yOlwR ztQ@ssTOu6oM(u)MjK6q3gL>RvHPWjd-e{u2h*=>~JX(*sFv_rF7M924$8=DE0=MwN z`CdO@m!Bvl`KSes(M^RtDXj;9XcG7(2$`l}e(bii9Y z9>Gf|*f&n(IRE?!`}$JwiT=s`Cg=m_EPH0^sHGr>(R}hoO`FBaUl_7F!Wi z;+(zI&&3@3$ngwh8aIzYe#|37?+9I^XTKl(?25JFg-drax|)KI&Y+M{0MWr-Hq4iO zb1?iVjw40|BXvl)zX;KvZuW@GF9w`pwPwA|2p~g1OaCL${ui6IKb_{y6_ULN zdS@p05Npd^oM?WnBn;T~P>%?*nk@&mYX8<^BH8s-`rxFr?;}%MNhjH4{>00L_aKY} zeO0OX?_*H-!s)hnr4yjEcc>*q-U(#8jHu8}Pr@s5CDGb`HXSzIB}ohE0rxYDs0QHo z18}od$XR7R=x*ZrG04i-aBx~|QgvB$xXAdhw=DWv(~wWMn2 zwT`j6QI*BAi2%c>Q`295z%6d~uvpPn8^)jhOQ=kW&9PgfnhWj;QWb61NtFO%%&(_y z6pik9C-u*eX1jgj+P*PYaEmo>jAC@QO#Zj4U0|%0%s8H&l5C+wI;VO}`B}&E0XpQ1 zBWwdyx*c_;xH)bBC5Ztm6_3`wy9Kj9O)~%V4VXM?QJ>8E;z3du&wv7<1T}#@7r1eA z^?Bg)bLTE`-F9H=8nsX1Mk}dBlL*r7%*A0pw`^CG+xW>KJo#j-4qt={V?Gj~2~LS> z^n{!lU(@MUJgT8IcW_6DFZ=*_OR;4RroFI@dY_tVG5@FYM|hJ#Ci{hWiY)cuuYSLx zk($G>EC5`ATx3f@!%%b>OB?n0%EPDgpMeS^mw^CKYaMcgMS+;84^LiBKfGLd_&f^1 zJx2pZV>^!hcl#>9Ce(Cf-@JLpcvJQo)bXrgHrgYp_ExgSy%IyZp~{yV^q-w3I~@Zj zB%3A==J!m~yN&_aM&$Ph#_vKpOQ1iG9KdGH$)nadI->D2H(Jvku~cc~5WXAvBv%(9 zX9yJod6;n|aF+kP*G~Z z@FH;;kd457dSy^>n+H;ElSMRoiJjmhXbM4==|Tp6a6h0a?ymyinw9 zp~g5!2l!AU`u5wpAIm&Z*$Yy0l#bTC6(C}Id{c{DO=zSfzOYWRaKq)pHdI`-L>7Qx{=tf z1H#he=db-=ou^xHVwE)S?#?&8F!H=x?2_-H%|}NrI3UgP+DqWPfkf)2o1e3KtJXBA zL97}GBJE`EN&SU_s0Ok~u=B;HdH$$Jkk*27wngiO;rEvE5%86U!$eBGwyyE3)i@{& z_np#m*lNBhX1u=h8#C z?vg>JIx_LH@%P13^Zk8)lyk&V>h--OCsj>(npH7w;Hd{qSt(dpoN`C)0*EJq@);fi z1Q$Lb(hCz(lDpW{p*uU?eG%$Iq_Nb8Pf~i7`l`rWXr`n20jz#R!Lk_q>1n4_Vo`^@ zWrBw@y~f~?u(Z;v9%gIvt)+K2JdNu>ldti-UDLyeuk^V|GWj5gt#VWxMKeNEsU58e z&>U+uJR=h@{-dx7(dl4o?ZZ(*I)9x~EK;*1ZP8^xw`+f`zm0XrZ3OOhPhfC!HR( ztvV_`fTmR4U0gKAju~82e&W+Pb-S>4ahDT5iDXbfDYmY?g-x}yU!Uq8#LKH*`8B#OcDx_88fFE20M(1vB*5M)=lPxA@Z7Q$g zm+P!dpTwT)fJBu&er&Vf{hQ#rwdQEoT@KlA8!u^iH>6Sc_nHMKdXwy zG7!%i5E{>XH{qeT{5F)dh{0WKV z2vIr>LJ4(BV!jv+>q^wCd{6+Q{gc4%nW=6 z9}=6l-wP?7Sd3;>ikP=t39R={+1M6^4K z2t8(_x7aIIWC+Yo{hE}}!RM<4aFo#R=K`qxQGYmaW&l`)8sz#lpR;Vb@xoInbvub( zg)@J-7n)0(A3uJJ0OEgi@cJnN>s=*jil525YPLTtD-p6WpQ z`dWmgj)rCgdU#{o&HHBA^oJW^$9m_Ws_4HZ==sS={iTmYs_Ma&GzbvTz3v4+ZPHz2 zR!0jSr63U3cfXEajHclEQR3a8$H!<7|A1#m@j9kp!cR-k%FdJCNSUgt%Pl~E?)fBLjeF#;U^8(T}i01 z*C_~+c)90hz9dCCYTwl&oID|)BR!}xP}c}DF!9SDwZ`3KvLpdZhQm%X;6_k`h9K0- zy#YSD-1AjFl7y^xv)gjU@C26?iGV5h+Lp11VgYP=9_FJ5@LH8s9r?*DQv0{|d200NBOf(uyip zP~~`UXBce(4m-XP#rbBwZ&FJ5!eT#_MTOCM^(`40LV;TsG?g(wG=?yQD`qX>RjGTW zE+X^Up!@AN%8Cm(zH2UD9N^5obDvFp60x!6_v+r0;m0;&GyhBwj+#DiE;6iCuCJAK zqIu@>7dM2dtS4OVAaAd2TM-;?=askp{Q^x0?K_Jk{6O8^G&T6tEMlx>J;(R?|7OJZ zNiY1|W&Dg+UqVWQk%hSLy@EaHCPBPAUGu#C6;Grr+qu2)uMq=^Pz@m3JYJgRu}*Zu zQ$^r9g1DN-I#ncmkE*qbZ`u$9H0@Wkn{QWVHXh$i`-hASPf#(I(j}2PCiBRQ+|JB@#YH)0pJXikw zHGe7IGH(PG2ROx$)zBip>G{L7#=YV${Ev4RJJs|K zN#^!Wa;WSTy4d6$6`pl@dfY&C`p95D*qgw$W3xp<68mS3JoILo!U+gmc3edonFpQE zDp(|rIGG>w#y%z`b?jOs*t+Ep3`H-JVX%$SBYUCOr|e`|6*p|_Q#(<| z69R3Z>+@QQU6jGaDzY5=umn;`E=+1~sMz27DeHGSo@;S8)7bXJuay#M{i@aR_Z+#> zQa=~P*JJC-jVq)(rT-`ahbyv#JtpJXKl=S+K9hBXh}Y(6&Fj0BgUTTyYSR+FibL@)tL2`S zw#QJ&b^x*OT&e3y?ERY~0Y~qp4e~pKLwuf9Jn$fP33jIHB32}mQqALEh;3Qnpm?d8 zVyD(r*CjoBd@=ziIrH%pZrIO^Q)^83w(7P7e7<5xC%bn_L?pZD8^Vo&`0*}&1{wh( zo`!qfd$iQtcj=oy6TQBgaZ`ZEU%ay+VzXy>%$we2U9g-ds&HujSV~6v?v8>hhr@L{ zJ~16O%?&XQ3eMO^DPtA z&#l1tF{3iS+&d%?de05tyHkQ=9hHxb=OroOVjS4_)d68>%oR>C1FrEhkCT8a+L@Fd?fR%^UwMEOjN&^ic1b&Y=rOG`5QN|M>wl@43xQ^7&L zqPEK+OHi2*pu)0-i*mHPM&HRTDkUy>PN7g_H<`KF@Z@p}y&r$PRFZHZ7Z?L45yr#k5?avjNS2Y_`BMIkNte3j-^1EKeqS)xO(&dUdKD zHaN!bOZI{I>#m0~CJNw7f}EGKgb;E2w_v>D#S44^0!jX9GAllKSeYu}?$IZwEOvUeqKlfcp5KJykpsdc#I?ZG}s< zWigu?qhSJ#KecrEcs(TV9|*?Q&za7)#|)$d7-rw@Xf%VB4=q^>2l8>+<-Fw8xi8c@ z$OhqSjw6GVORE)w_~ozlPt%Ii80)3z0T{FPrI7kL0z^{c9mZV#E79eGhu5p5<9oqd zD5C;%cSDm#_?5^~XYlpU9~Y%}6}nUVEBVRtT{fkVdsVzmj6PriF$U{pd>| z90iiIotqObp+iele=uyi-;N$rLx}a#L#RO1!CU~uWkcmd@xgn>%unfbQSgS{C{*YE zOMDqz%GjNhiJE>}Pk0US16MEH&snXORz{i6ttJJ0Aiy?#FZp~~Xp~vug8)tt{C9*q zn?=2r`3_;O2MEu%B4a{-Y+NDtvub_WALsAGwP}; zdXlbwX5T&8<$%%WMOuO&6OLpU|1dDWJKyn>WV}lAkO3M0!jq_I=p-gt;G$AbGPe>6 znLDV|+@Uq|J^o#^kq<~lDTxd`;im@!gn*`r!y7U2=7hh#S;$BBm?fhm>kT&p3E44_ zNIV)tTdJeyFl2a@T#=0`j?ns+m;!|OB5MTRB1xO&j3bm_!Iv6S8(RXl+1vlUUYjsH zB9U80zZP=ONetXM;qjo5pq7p0UsX~8%F$n)&Myi_Q55BpVLK3FkTtW1Q2m!d9huCd z6i7{TL8%9%20^@!0-S>6B0s_(@A)s`3zx&p6{2w^3 z=Y7|Dzdh^t$;Hgv_jT=S?|tq3ZFw2UImuTM_L)A2y4I{jE)J22jjIVks7u&wm0!|- zq%FCLYMI|#H1`q-eWG1BF{0QedK5YJS5)YB|Kxq-!l633;k(i8S=iV<7TLlf9V*L$ z&h70FSdLzFpU}{uNjS?bfr6;uM&Pe1{F(~xLIR)zErVNwt7{g4e+X4I*}?N-K% zeduRmCL63g$q`t9J@9~a$L$XscgCAKo)}2nCoG(|y8qSq#>|>4^ma*7jlVpsv(rG} z)uuxY1ayQWd=3$qLTcupNsp32O}Zas zb%P;>M1;0x^kj{SSinKi*ll?#HVa_hALaTf`RS8;h}^f^wSj+Gnn^a=y;LUX>2RI= zbk5C>{o0x`S+l~qSQF4jZ?dYRYrnZi1DrM!J%O??*4SC74!fWt)bwmdl)dgQE^EV2 z9shI`0b`2CtQI2(6?Vg;xfP#;11MKfBSF~p^H?`FC?P z+lnATFy`{d~y-6zQ2KEBFJ_F0akB z&QQdJcUm`l@__pDVH*JJ6DoWy;yLIB|fKysK^d z!#<2PQZ*rE_~93@lJ8x(VIF;fda2=aC&9rIAmp5uTBm_hHz!Cnm@25|G%aRRgb`Vy zE-<-}d+@kvSRn36s|ohuj#~v}Qh_Y5sy}}!n^!kFzOy&zw4bGn#`?E+r&xO;gGOt@^zHq!U*B`C5#4e99DCwW--4h1SsfOtRr=~Ko`2}S&_bJsqvDd7ufWmK*Fzs>^m zkcxX|lQJ`Pjt>{sUDE-Qq~SHBd4y=-%R( zIXC7e8xBUU*%2d(0k8xfmzXxhlz44`eSLP%JpHZ{_~F+3=GZ|93{+-oT?l;O zm1~8`yq!FM;^aggS=}4e9{Dpz^LE@1wdG!98Q$H<7co_aL_eN6HQmI?dtReze-0N0 zFLGgI4V`{Mr`mHcXX1zpGt;OZN}fd+X;dXqtZHQi#x0tCCK&c{uweSahuxx1cTem; zf@!Sk?h^^kR<^}F>}L|mBB4zxIG&LFrc~_p6I$=+hM%@*HWNA|j>A^yd<~BnF*N?c zOQ@sFj5KGNZ5E~}x;c7+cnI^5MSi*5ezp99%4{2r^8V8Tx0Dv@q>>P3t{gSvK&u0rSX2zFpFg1OiQB+Y0x|B zM2u+GBrKq+lkj9TL#W7TIBFe^BBF8-G9}NaTXn@hI4{<@%atkXy!lYqJtz)1e%@*>qtKO=xYh!R+XuFDeO(3a zRTLu`MkcSK0a3B9RqJ$%+#YW*obQM91S+j2mOzjAm0we%?R%fhb zG`A)Kq+b5s@d_^_>=^mDa06EkM%W{3{9hi1)SoEYI-uKhS|1ILjB`Cs4z) z4Vr=o%*D>j2Ti^8ioE4@U!uN-J)(!ozKjn=g&&%T1u(Fuk^(@;=L3)RPdoG2-^#ZA zaGIN!Tr05ns(YYyqRHbX{inM>0xq(msugbTOyj-3?0G4y2%C^I(j67^HD~S1#G4CI zw{npICzaKC8y2Hvb6GYk5{hZ<_&w${#2Yk38&(|4l&|tb7MJBgWjO=SMHOkIJ&;h>J3Qn@H?~StVdl`;XC2b`tW?F2jSGgW`9uYGWGR@!45Uiv=*BF6<#? zOAW6NE3xLlQ?u8?a^zaI^}FO7U4O2w;}$9&eYy`pEupWy@t8g03_IJs-6M>!$K&Vr z#f{={9YzuFM`&F-ub3(Sz_UP=-e_tt`b{S$-69I>enb|TZ9C{=F@BfnN^3M&(>`fo z{ARkZ#4#?;E?1v=7nyI2&2U1Y$eS-Y(vZw(td&2DbySM;9#J{nr8=hvxGqZjBT<3f ze1Ly( zaKYpQU1xb_jk=x@Vwh=pmnIn%Z7_5^OMCrLWOb%1S*C|#m#QroB8;8dw1nlCV6@a? z?wf7mr1bqKl!$0J>7B)k(?Zzc9R@Kvj9gh>0#GWa&B9lPB;UUcIo1uUsyK%|rP+I` z^2Ya>H3u@DHjjyd1qMk~DB5*sl|)L5l+4D+c=na&vDK?rFqqVSn?O)sUc484|8njA z%dThj`=Tu`o->BL9F<QHu^s)`3Knt-&WLTj?o z>1em%=QIhT{xG@9nC1BKtE53j+~turLsAmZOCd7Qe2#bpAocbG<#HdRVm9RK$?8C^ zm32PS>^=Q$2SZ}jS`YTxk`(qB_?}AKB8U-d%Za%$f1$?QhxR%Lu4#P|YYTC=iyY9$ z$ilOrqnMf4?%zr43{&ptZjTtuv&%u1N7W~SOI;AU`p=8#Ie*W~qxHy}rigzTSIcIP}H76KJzPOlzM;Q-PeVFaub53TB=uS9V31ok)c%C zD@{P=AK%z_3nkMRaMTZ}SB#%W;IJPJ*9xdcyx)M%#G7a~x{Cdt&7)@e1VwfnAT3xL zY)dn=(W&rL)a$CO4J!VUVPi%LcvX_g@xiir(VrE+{|G|Cti`U4^#xO%m1>=R;IQ2B zXutMtat%o7e!7#S@$M;uul$`qFY;|zYSI@PSCEGL-C&izP6GWtj(!27=^P}~mY*0+ z$|Jzs>JP6B7wo7Ql;D7{#t`#_i!$$pU2-oEf8|y(Lt&N=CPdj6zSZ>(+PUjh@|}-+ zwzEOa6rotcPzIy#ecHHLq@ws0jSn1YVM^k=$WU;dc(P^i-$u+OvAN$-h3gtV)XzG! z9;fa!3jHY?&!N`tu4KQoYa-a5#SQED&sHn(E4-x%ykpy7aahX$5MaWQW+l(3CICBo z^O;!7eouzksq@&oY)Ikpk(VGFJRV1Az+U9WxJCIr7btsVZgwDJdvZi^g_nUgG>LjE z#Y+~>hqvCwU#JP*%W7AnVXJNI@slWK*hEF5ox0Tl1s%ipH|ux zmxqOM(w1I<;SWey9P=Qz=fo@R6PKk*ZYqS4p)L+*qjD)G5tF#`_Io&nMd2j`RjiAi z`UQCfLo8=-?`(7q1L1|d>a90o4p04sXoH{=I&fB4wP%ec;n>autY!E7U_G8@Z3$_AUdr$k_K$GA8Pog%zH`w3iiC2$Qlb?*G$Tm2!9`i8uNJ~aLb}b zV)bzNSdo$$52iJ3&-Uyu5W3BGy0uIe(n<+SXFtxmkq*0PvN~6BW+mJ z1#T_SE-uBfgnp^x_@USH?RF2P_c0MhhwJY*IF)h2dYFf*nW2YzFn`@pP|9E6d#ZoD zUv^NQitkO~OpTQ4iUK!D6;}4SBA$krOAbHinE)8E&(ojr2AoF=lUa^GjSNC@(yr%o zVDskD2(qWa^>cZVC}UlB{^N!*_oAf0ZAh}Q9WcDOK28xMkA7?AP zT9dP(H2zZ7pea{yY`)dpxzSR?)W(Mm@hlNTqf?gXn?7)Vr4=W$=DZJLD8@=s{HIh! zul(5m@GaFKIBnHR?%FFZ!3QGVFK{Mwi1e%*s+ez2*!f&!VOXfbr|yT}vWB**swko? z_Y&xUGGt3{m7#TU8OE!o-%hx4_^|!*#qF5(A1x;CcCNK6Ug27fu||;Ima4BFvKiAV zl?%X8VPW*DGJYP_aMB&dOJwdb(%A2f69AkQ9F2o-+F73it7M_^atbt*s>+x~8sd2u z{)1sk_%o)5y|$ANm;9nd0FDXML{`U1LyUugKb0?<0`GiRN3P_E;wV%nT75DYii|z= zUQ>f+Kgxa;@*@nhI}x;B<94W&B)uni;y5Td4p#mjLYO?|dYC~~Tq4dT+ZSp>$HaKU zH?7X$To!p~&B{PTQj?uHF2n?4&A4te`MubK2GpPDBW|AVx#KhnPl0RVktv#fhM%>Vw3g4$M9ux zf3G-F?kkFI5 z>?zD4)TO3etHO>O zc}f#cci~_lS>t)g!P5wI{|plDB~V}>r8xeBf~)qr-0K!LyM0Yz9H}NVt}+;P#DW}| zvd&xXfEScCK+>RBC(TVqo7Pku)5cDeejg~_r9bQrv$J}^*Q@;DJbsAe)U%uEd$B<# z0g1YeND&2qUqMi&5kjrICxiM=shIEc2%u84a+kow$D?V#LKUH1G6$-i?Wcu&NUwJlNtd;@6vVe!A(w!^xHdbRE!{;#~aoMlA?$hjLLK`TLpU`!9S;~8mc|>*clzs>L@w&r{ zj)iJ>yhisffxq67DBmMbYcFV67knE;| zsmZwBY(3vh$?Af$oLGq@;a`vBgfN_=$4d!}qx9Wyu(=RdF)OqG8tmOs!tRo~J5*y6 zpSa_f*;QoZ$L~u+RSXT$#Jf3On2j@~&^wPhe|U_d>tJv(vT<)<+s4(pK19zcT6@FasIb*c$IQ+~8S?M9d)w zC6f|{BYFVy!RFiv59S+8^$Ad%>k#|m_T1XIb5Z@H@yfmx2b#JCY*qKz$I`NvU*;;J z?;Q6@+kOU%Qc{rgXv?j3RdcWrS#UJekGVs{ow0wg^}J>e3eo0w>}T zia`gr@@i#OAEw@$jx{NQ`kK1j&rqBI{uV8f@y=d78`Tl08`Kii9y(sN@K;oJh>T}= z;q|S*u>jE4E9Uw(CQfaaergfey@(?If;YLmfNTKt)koCjnV!G8s*1=mpV!qkuaGpc5)|L;MPW^Ug4QKduOw< z^bS$IF?IZp_9M+UA|TUm*vDuqIh)o)RQH@&o2US^Gb&bI@)pyh1AA}bCB4MXma`7M zLre>J7#40Q(7d-9GJ@bQ{Xr;lt)>P7z2Dthb1)i27(&AzAiQ(rVWIlTgl}CBxo{mJ zj81}L=u_#8?L6e-YElD?e)tRa3YU2NYJNsanBoqkKTCbzdtlk|5-xdV$8HbUcY^;d7)2+LC{NzsMS*vkz-`_!fME^&Gsh8 z2k}8gzCPaw*$OR1+=&y#G(?*BnaS^{2bs{7g2nL+K@c?vKZPIfF7k3jGopuOa+OLX z^o#orEaYM)7}?|n-%Wmae=Yhi1^vs?MNGOe1yo@v67-4h-Sw&!?c)Vz63uT#;n-bx zGlqf>$**bTx^dU}ehuL#&!YehGS+lQH*duv?xxevVaw>3X0SZ zHIFV>oA0O^evIOW8}bBlL(-`ES5guRZ$}9bAm+B3-AJb8X=|;<3no=*$6k(#fwGle zvAx0ZoIj1=|E<;T1Tl{aI^OI&DC%3wd<40wiu&Ib%HVL=fyiZu;BMjjuop`mn3y%QIq-m7BPT(6V zo{yTNdzN6ZOcIB*{ky4hX4A*oT1eSq?>8#1T$5>6gzW?0V7uV9wxsj_Wh?!2#nk~Q zvRY*DXBmRn6UfDdv$zrx#sC-Svz;T>fQ*101f&x$x(K6dC)p3T7EQjJsX0_5x3Sv$ z)L($FMsnm;d1j&T4$%H3SFa2FgA~7rTii~w7&NgM)Qe2O@&DV8XfZKvvEK&Ts0Nki zAH9o!Ohgq#RQ&|sBy!V;T^xu9=&aA(M{ACm&(Mz;lixhZh{@xW2hVklEHt86*@lbq z$iJws7F3MbZ@tLK9S5lVR5Qt@{JINXb46Lo-j3gEa=X`Sm!_8{I)G13)kYoTJBb~- z*Daf<2$m1DP-V8}i~MT?xEiwk0OMHJW)T;Y;n!^U4e@eZNDS7Tu%5$7o-c~!SZ1J} z0`aLQ(2`zJ1|Z4}SgD7yNn* zK@wZd*!ZLu>0RcK?-?l^9}&A|4%ha2Y{K)yjeq$?$m)MDwAdQ)ej^hd6$5bV0L<$V zz&QyQ$3)@>F5Ha0v(3Nx7Jh7|ft>Wc!YVP0Ataj-ywcW<83X`wTY>%JUHjG}bjHSi zq?!_u3ih=^{GJIb2sn;6^#=X3!6Sjhc8q_BqYaRf*`JQnKi2qj!NhIAk)p&!BqCx( z?Msh@kt2$etPcI`qlD-O+CFGjX}~xIU7?X5MDro)f|t;){{yvF2-P2%?M$#`O5`|0fDe(k_bR8oc=D zS^jSqbpdc&UAFb80EPXL4Dyo~ar`xZI(|IO;0a(&?h_h7blhP?wPYcxrQDji>X)gz zm9EIqr)C%%A7T&T#PA|A5_w76koS*=)`lPxMJ2vwQ!-m48$3WXFT{93xr*6OZ z=e29yg0(Yhd3=Jki;yMwqUK0v3eD~($6FnYAMt3xb z$dj6!L1w^ur03(Yz1#0$(jWQ}eM4zKgx~Jx6fEgJdUI@{>!!2&TIhJ8sb0am!p?zc z_Znx(wdM7N=qng38Fi~S217KY?l#=LSB#LJSPUuYK7L7b9m5@ZMVESZ~mg^Zd zQZMFM(-EvGs$-;bbl%9bcq0yb=JDT8`}Ln$R#sFyNhk-F>>;~WG)B%6m3fS`i>&V2 zvLf%6#eRb0QXe*OjoFSd=)|c~QvA87so5v`^H1hHziN%6Oxvy7G@!jA2RBFqI@b36L zZF91-hQ)M?)(gSyG@DMHzy;?i_C_!39!`sJFcSxe^kYU%Y?~=gPfv|Xv8+gD zfM3v&5N~M^Obgs@_?Ocy{+pf6DB#$6&1|`FL=VD|pG=A&eqXpxOTLMja1F4HsOI=~ z1>y(HINIP_&1uoiq^r|{2iqi~_4-%mGSXj!36pw$d8(*mn<%+?GiVGw zEv!<@BAJ44p8Aovy-9O5ygsp*s)Qy!aPw)Kxxr~S%shxf5oAfHSMVAOypzJAj_An;lS$l#{yk zc}|cR?7&B2x-a}oP#meLQDb=XJ!s5#%6@iSe7|QLHm-Z)=rjfXuJ@hId!!!Z0;y8} z=!wCeqUYI$TVY23e5|Q;4o|@5uZqAXGv64$Jdb_BD-?rD=ACRB)y~?&TsjPJY}Y1| znF!k`=qAwZ6Lc= ze(NcG@eXn|ZWPGz@B!k{MtMKZ%_Q2n8}x|2kM%CX3(AM0q$a4$VVM-q&6FoH0;e<$ zZqH&B62XAJjgODNnU#MG(@3}YCz=Z#vE_#n^O1&~;$K6cH=$5OOe`D*i03#?zTch% z@mA|rp3I111{$DSOPXo79`jd{OhJKrn`Hw<;3mDxg<{l<@`RZR5xTGR@84L3a)PL} zLP%oNBi(wAkmpQ*Krr{`IJs_uJZzOh&4R*17-dbdy2B~->E;LGZej0UrdUufaV;YV0rq5=?tsORoaQx0;1NDPi>IjKNNed%yzR=x5l1hvM z4azv+_>+L$5MwP9fn?!<*@~vMUJ)5N_KDjPa7i7KJZ# z4pKA3oGv$;_FM;ZvHI&n_0JyAUFd-Bheu*|?GMMH2ma)W9V?C~jmU?;c8?79`8(Ou zw40w}nO>~*m1OpgpvQSJ%q%o`Saw7(iP@?IOHZq0+ryk#`>1jy47L)Xcwg7MwZm`| zjicLxqcb<}%FKoIE*nbHrukK7$u23iwko6+%P;A)Jv0bgK?3~o5#s{vGFB%+ARTH>onMb!m3%rIA`^ zz9pURD|?gi_IuQv=aNI?D_yJ4YUKSD{xdad!pOLu%~o%;{P8QRKF+%78pB>c2`E925*2#Lg5EI7r)Up^drE=&qLca@VJwR+^lI3yhh(tq#M{~ zd=}$uQWD-weLSv#lu;NXlK3UnAnS#lsbarW;Z$7iDvZidpSU^U-oUax=`*{>Yidth z!#D24$BS;DtB3F;yP)=OPV(+vW#i%W{)G$snV3`^Sk6)sOh|h-&Ia@_^}7hJdl><% z)?O;*=b2tv1OsTB>x4-McV{(u|3Hk(;Mc*y!Rmthp-kM=UgiTeF;UFo4zRyjKI#hf z{c<%@1%4+ZD349_(|Rr(qHg)LB${T^>^YYZJo0_f<3L;kKh}+YZ}^PHx@)>##DzR1 zEY2Rt>xhi{>S!`30&w_-((O#0*Q)r3pglxIIC2#5Aw8EDE97F`T#1!X6>?voXmwh* zZMWV5mmUIL{Hc-Gr7Zm(l1kWv2iyjqNS-xhKEx(u-}P>^Fwf!ZER!#f3AVhX!fj3N zfn4%ovfefK&w4aRnijnX08K1m=XnV5nG7IyA2ONpJ50@Z z{~DNgQOc}Edjp(D21-t>qY^&uVaM@rIdl}k1j|UXo3mdEERM;~5~qc&*AW^kvGi%@zlan2320x9e=fUB?$rY8f&U z?`G27}~@ugnc zl`t#pANdU|8_JMQ@GJy{V%+gT0RaipUQ43dY+K%2Cj#V4oJ*dkPKJgkjL3`j5s^g? zZ1R^l(LpmEj?HKP4-1xNF9&KFpm!~#V^MO4mG3!icGw8lU^`U~XF(2blF=o-UYO=s z{PN{XvkJ6ftl+~RZayJu6%26~27?vL#}%>TX1>IohOddcJG&}uK5H!-Sge6_T;=X$ zQkO6DrImp5I zrI?i>^=x{flS1(b)BW`I|G}R;1pZ{V9dm;O;y2W6;*5+E05M|QVF##6jP^)<`e?DL37UE+W z1;C`A+|?|N(V>Gyj){;K9$TJ4%9|MX?R$RVdgHw<43+#ED11jsxrt0f2NYTin4Q61 zt9_XsOVa^nNij~Ryw+O0I?wJJ+hXivFKdB_ZF8Vk$K%`yCW*yRgtnAY%^l})jc=Q} zq13+)2MR*S@J{G-aMi%weP8XQ-P2bXx3Ltr@wi|LnQQO3I#m&2O3t}iKF}D2gWv$s zb-ucfeZi@<1D_p**?=iLc{<-7Xh`z%>%S(>wQs#da6}d$xMyYpCyq!*xPWqme@2fX zePgiI+%J+HT4j`iF5S0s-sS z&=Zf>){wYFymoP`+>kkf;u}jaXF+3*a%n|x^J+cs^K5OQ+pD}w_5GH06iXco^9ANOJEM3jdV4>2&QFT)GFKhHsmE* z%)pn!vv(plAKNcc)=Gz`ej>spwb>RyUP6>a!T>{*fC=@74==(~L*?m}|NRjjcLVO} zmkoQY|8*~beS|}Tj-0png0?7E#B?GIgWl6k5^TKvrw>CxR8+U=?BA+{kQFr10Qogc zli@!5H(@#9(8G7U*lPIxT=@%jAbCuo*6u(24tolsH2nL{I{f>QShBOqK=S_%^1p-p zPa^-5$p2L9A5`Rjs`dZJ9ho5}^Y)?9k2;1009Hu2fB$}ard-+x#6-&+w-nEdfRL#sQA z-qjgk_ejpmlK~Z&GwW<~^n-X$%Jj&0N#j0od;yI*lB{w{*&pc8WpyIrO0!bwoCfxF zGP&;tH(@b~zC!bGYJ}9uwiXT6)QFZ; z%e2^9~Q~O|SN1okvs=6!3=eJsfKW#50h1Kp9^DlD|`LIqM zEQqL(wLgdsStF7}$~I2w{nLkz5dRtDx+wQ2TPF+2TH3WdKlY~&JHal?CvVgIlg(xa z)|E}i4L*%OeJBpw_-~8&HvWq>A zQ)PRojKTvzya#o9kl|w)3E+$?=k@v>a{J814AQ%e;n?bANke7Wp@t84C>y4~S8W$i zhO8c>X(roS3dI1!*Y4c(v5C^93h=WCk0C&w4{;R0;u_^IglUaQP*QuHt2;IPQgCB> zGoOqd!Ph-FDCqL{{-Pw~WDKH!*t6^cLkN!EPeL^T9y+x_XoJn+7p#6!LRyw@g>&TodjvIVz1C-vPDj2%h^yWM zki0dt0tT5p%#d0txD@IK?`oj-9f`>uhg9H6Wteg;aw-%lCMqCDirI(mDNqd!znLM0tipy*NKS8EtP1q!TyV-kzSlaGpStsnU5-u|C| zh#~GAR#X3zvu*Ycj~aBLN<+Nzt;Dbl!B>0{O+M;whs^1GT)6bvKGA)mK%CzwS7;29 z@k5g(RGJ8Dr75a_vragP0sb>vE*CGn@3}T&YN5$$lz#D~L7t=4a#Yb$RAyh0l*Xwd zurCl6)oeHU3e}j(Nx)Svb3aJ}TOJ_{MJpIlO85eC^?D$@s){6yHQRPc^oPtMbA!X? zmq*exbG}|v9hoZ)gA{90U$C5K@8vXd>b(~TxizjZSu_fe&XOFVe?Wux&6Uo)*%bSm zhmZkzRuG1^f|@yv?fb9d++YUpV=!_W#JX8s+ZoPg1Y(GyBd>>a#n;WFA%c2N*q?#_ z)JRL3Cg5gWXUJUi@mln8>>+H|Sm5vH#+i|k!r*Y0gp68QDI^8FqOj7KBrCc$nlHzD_?ss_0E1A7P7xrq1h?H zYbD2PgxAJsJ3R@pdwo79W8~@cBNaGEUp;rUW{N*zoaV?-0V3p6f_=^UZ#CmXn5dSxv`^<);G<5z7S=!(TbXpDifB ztq#0Jy011+Q!L*&1zk_Jzdo<9yx_I5VC(LYKM4yKUAg<@CV4i5fz8s3C%iURbSG!j z?cKDU&_(d}q{Yiq=~V(%p1qXe7BVB}tRVPqM?VQO?~WMC4H9pqpB_wMz7w{%tpQOW zPMBNB!DcJ&^|r-FKRU{EPlvA{3=STDOzChuV>WI}6 z+*j|uN9IAF#8)7RM~KC4lkmx97`~^=hQYRzjl#lsJ=^&mn25DE$FH}gk{y>ure|^* zzP)zI4Om}0fFiKg7|{f3oYW1i2S>Dfko z$RX>g@v(K!$4q!|Gto=(5_W?6dUV{Z%#Xe;cCSv?m3#Ia=J$qPlyQ2&gR`a)5h225Ky zytpqe4hkkR$$86*0?=G<-i=-ov>}zt*r~a`Tl<^o;)gw#bEE@UEem&qa@Tg;?uI(S z!LkGGR{@#gV!WLB@(|L6cv4~>%F0I#37|tcm{LUlUNh^J6o;kn5yAN_I>J^StiG3! ziWIw`4*RbVe{Ykqo8JDqY|!_Sm_6t^oH#+g1|%%+c{|iNv0`X4eOF?Yi@({~yLTk8 zaY6mcYM3dL`YBsTqADDs9=PM%6zx#HZwLldsUwECvcKtS@1C}GkJq0{OKDJn&lXYH zK;gqVHEHUEwCfXdrx$XmP8=>nm6ndanRruiplbZ!{p}oFiBplF@pqG6c;TKesLN(- z)IZQIDZB8t*6tG0O4KkoXekzUcwA;b6}|6}xo{JEVno5Wo%Sk%UQ1PmLn(-==MnlS zQJST7x(*KF5?N`%vOwP8(^tv4pEac~I`xKb$Mr?>C^?r^KMrIPzkEy6WYT+2Lav~t zT5t|EtI$`>RB>y|yC0&=EN*A%hMkNbRCrEr=TPhdndr_KA5p?L7i@QbwE@L+84s7d zyq(&z;lj7Q9-D2<*n!;L!No``OcIO$6f7&S41#f_y3Gi$v&@F73Y^Ti{Q1bqdB!ZUQ%w7KoyWLuD*VrwdN$!9V6L; zCrQuo-=0-wS*Pi>+%N=a(pSV%JbNFUO)?Z*BBxF+DrOy^ZaF?T;mpsfB}zDyn#=aG z9?r2t>?+OsyDqJ^ho`FVEWkKV-UIrys`Gg0Hb1-SC=2YH4%_=p z#r5mu7kf1ibbqoJ7E_7+U?_G$2bD?F*;+tDxksRyHpR5av$Ax_E8tO$HE?FJBes`K zR!Q>2jB zzBNzlO23{DQP}m#`KPktCG9<`8*SPvw%>KX#f4sv6+N)lc?)L2 zbHU#l-;^pSB^vau$Gz!ip-wzyAqA=-k=A#`t$cQl%(I-OBloo&PHY+$Txv4+)^E8K9P1w*_sULZT%HHHg*I^AQLlN2~N zl^qHesK>{hKddR&u!@l)tw_phpr2!olB<{7tS`cLc#O=?+gJQ#zrWOjRgTk?mO zejmA+@Nt`7xFLcQd=9wrM5X3|aBF@Y69ocEQk1f^Iv38ww0&NSn+mWLQx$bN80@s z*Drd$+iQcj`$*zPuPJ|1HHVr=>vM32WFJb6JN(nkXDv#7Y(48zD08{V~3IYf`;bRerW`nB4Fa+V@-xO*5V>@(Cg z$RV)5)J-{s^hD(W08;~KJgMi~gi+rCEn6|WQ?!=j027#ZtXC0##l0`mvX?f88akgx z(myYiT<$AFPS^PF(;ZodLD&LS4nxl(5?4K`-yAHwu?qf4_!y)x`_jAD5hb67aiDqy zF&)vehkk&nCSG97EX3K>i9C+J@^c}Fk-^0Jxr6(Y+BP)t78dC3yXGJ(36qsGcxR@TiMMuDdU}Eh@NDn>1FF$!(`Jg<@8y6Upmyz-WqBN` zX%14i$WC2c2=<(fN6hsJ{eHl`dx+f6hshXg4P2J0Ok-sv)_vqw&*y>Aoxz^&qwHVp zDr2V1cz_~2q4B+5inPFu9<<(LbXC5?NjdUpt@P0qTl%S(ya7>jE|Lj)rvG$P@BMF|p z_4UZO8D?>JgP#$p_^4=C=!tF@N$`gD{2H zhCiBf!^?pHn;o?qNWJ&82D`DtNZXD!*a?HmJ5>J zQYH244O$lPndCxj-k-vfb*CY^$Q~T?@1I8YY}FCzKK_fg~ohx>;FZ7&8!JJFLj@RVJ=>#Qk#;~CCT*dE!1sX+*bpm0v(r! zk}O7$n)wFM58^lE=YKPH;~C(S@Xo~g-)mYUgGSp`Wx(uY^1r&8NT_>iul8)>`~7e+ z40o){1vjW6H*{a0Gu;rqxjqwTUyuzZ&98;mNrMdkn0wCfyR0LVCKqN))$8aPhm9>2 zZ@N zTN9aBnQ*Bp{2BNuiMOa^f1a9EO|%4a)td)@D>|Yl23(S~+D4c=_G<@3DgqQ=j>;?3 ztVV;Mo;O>sn$f+T*-^`FW2HMT%n_z0Btq;ZKllvi?;ez7e<(LGb~`2WTTr&q9-FB? z+5ppCqQ3_|pMY|BQ^48`P8g6LkZ7v{aNt8s`ywZ1eg_DN`;Y)zJWJO9*g6oWW+Ml2 ziF(M6wR>%>H6TdG;HCPXj1V-9MdDJ2KSPgi4AN4jCQ5j2jS`&UgdU6jpcQ;9M6J%r7eSx5;fQvGE!A)KiopWIY1= zrV(}LK!~e^P)8mEq3b`YZ?32@m Qf`2C!HBO`+H}n2~0J?)i{r~^~ literal 137409 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

Utl^gq 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 ZhD+S2G;8|If(iakXz3rzI{M3v{{UBLHB0~i diff --git a/_freeze/posts/13-ggplot2-plotting-system-part-2/index/figure-html/unnamed-chunk-18-1.png b/_freeze/posts/13-ggplot2-plotting-system-part-2/index/figure-html/unnamed-chunk-18-1.png index a455f86aba2a3c65ab24ad036c1f7f6b385bc9e2..1f3afa1599d1f5a48c9105ad262edd3370db9032 100644 GIT binary patch literal 118244 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

12rLJosz0WRAhyQtTD6r9xcj8rTOvv*L> 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 literal 138803 zcmagGc_378`#*kW3`P>lQp%pKY>8wa*|Q`>C{$!u*|H5YY0nlygbCRqvSyz)g)p-3 z3fU6bci;O=;dwvL`}6z#@$T`=oO7S+zV2&zU9amp^FUuugKihwE(n6?v@}%>AcztJ zK@>zZ75HTCYI7$9q4wCTsOUSYXsBFsy5?$l{n8a14I395SNkgl8mA!WWN`4gi*|?3 zF)7BC1!bF_ulEqI$6u}-3HoV{+M?Whf-esOw)dOiROcx(=)E`d*2sACi@fUr}G-0 zK9;y|sU|F#8MN`C`#$vu?}8bM+HJZ!L|!UATZpGlt>(nbSUuk6ion%?BDG$}58Z)h zLi5G3O#KvZ7NU>1Mt!@-ka%vW$NheesD1uNhE1Cidz#<8(8aRyJFdHaD}K0g&bR!~ zsC!1HbQAGtTFX;ghW`r`|xxe)02g_9?_LqpQy=*&4=Ec>A%EG@M4bCtcrzw6g$w-JkwQea=%v8;% zaM$A5ZuigP9&7U}o+j~6(ci;mSZUdU_{5A0f1mmsU{WZM!eCkC9uWGy=d*5iL@gq* zDv@niKY}x2@`BmN0)1=IIQ+DTg%Xj;G+r9K4(OkXG+j2}xOe;Ka=@3uEkoW=a zWUg?58bj+K>n7RLd!#-^@wi#fmNd0^BX|uGr5}|)8ojApyd@@pPgzLq}sr zqhsxpb{7j-tc%H`GIis`vNpFd_rtbq4kGTKyISI18#musjgT}0ap0(l&k#kO$@{^NHrHogQoOKYk#H$Q#OJ%+`v{<7Q?pU)J z&dDDz*f*s3t-&qPHStD2?(@X~QCCY>%Nv|-i5dDZRTMc%c7L z<=LOVTU^KT>h^pOvX3t)j2(aYzGi6f@~#|-BP_dzi3Guk($TU*O{sedqwR*FTwjTk z@2+WWth07|zp!yjq&m4KAh&2%Btt)tML}A%t2=?S9juswvJ_Lj77V-uK3wico@@<# z|JLLTTjNX4iFtD`7rs8I!>__(b9LPZJ4?~h54|C5Qf%^h(SE$rRtEyaNt^RpS9Nuv zBj9f|gt%u9p}=1V@E;ra4}y>c?8Y-l;!%6~YNkG|5`AZ7S9>Qq*MH7?Umf^) zQ!KG=FkfaQe`) z23#FvjDtq);-VgM|LeUFLcihPAIh*l8$ytpPKYq8{I5i?lt{ueivJY`7Es&_e3|TQ zcI58Ai3=f77#Zq++b09YssMbc(OqD)``?8^<6QUrA4;&JMB_q=>@)WNyB-*z;Y0tT zS|A3#X%_>;?%Zr}>|d47a2|p9k0n+1zS&rru>E+k%+q;pp}4BzbyC2OPE4l#^5SMU;p+OT71wr}=ps)Ay8u z{HFsscPI5Q<#8g9n!E~X%dzBCSQ$-b&kPjIsQ_`g0|0Ys2BJx z&zN%72gaFFU+|qQY+9J?wvC&rT>aH~^I}_N7H1VMUfOfxyi(^%T{(l`(d%9IX&;pc zBumkk)&8PZ>%$b(dsOeyb1s}K=hYXqY9H~8cgZ=n7`^V3$8gw&I+d74$lbMlZiFf% z%i7SL9Sgvi0;{lj(Luj`$v^ChN&o}7U)NQ~Gj1P~&cG-CpPz0iUw;&BRd6_HYpDWJ z3{>FZDxvz1`?m}VUxY&AiuiODchq0Of|f}tXlG8lzV#XLGi)v8_zaG%qZQ{zq^5>u zNM+D&eL@NW_V4+uhVtL#m1W?9x)8FaJllRXXO4TEy6(bx`rekLMvPpLnc5@l&X%^M zgx9pv2gXj_dVz^$`w3i;5WVs)KJC&iK{3VPnzDI;o7=XD--XoC&B1+qwRH)EJP!LJ zdguTD=U@Npi$Uf%p@~5kONVVSCHa6tg|xmZ|GPr_Xc(Z$ixK)jtZFu+cPsD*b@1PyQi{ zx-hVg55d~4TMEPw{}~80!_2OjS$(gk?pf52c_GrTo7Ad%%LqA z5hx^jnjr;BKm1^8<3ai$9HS3DIr8t}nCJ#Xl-akl0E3q?*U)_f+>Qm6?gMrguOP#_ z{cIzq0d7s^w;k-;+v4JZYPGh%|7XBVX6AxqyHa0V-m((n8_H99rnV_#ZyMRRZK8QE zxGH-gwP@?AtqqVD(>V=xkrEqMyM6v>Ynt1K&c;3wnAnl@9W4VycTH!{zb?T=dJN7g zWT0lp_z9)Z;*TtsYR0V_h%LaX^wxJ1Hnu+bhZI5QffV--MrUs8@(K&uyHQU)He~tB zbC4q&XT+x$LA^_J|rE`5n7+0 zXxBJuygPJ`Qp`)){l`;Vy^M@>M-?O-T~&l0e`!Je%nxsj&nWacKCduY&>X9E--zny z^n1sMt=6E5cWq2 z{wrfa3Z}tC14P+?{PIvla$17Vk?$P#+Sv0EA_MFtgP%eh8xnsiblxJC6K96&k`47_ zY!HrhC3?v_6%RnvZ#>#mB>8lh~)|Bym_H%qf%^YkZF2j<}t5EQnE&9 zNPc+Bk^4BTW#?j4#nK^~Q}W}g*;P*c9*y#|U(zSEhGUt}7do5+nMt62Z{bqI`PDjq zg_8Rm2$EWhM9AxgCVjm;o4TlaN=$Y{BP~7;&US|(GnPl|KTvD5b&5xqd!8nL3q>L( zNS%}~);l!0k|4*SI4Q_M=^ZmRs>AzAj>IZI1wqX|^qJ30Yd#c3w?9|0GT~;#Jp@6Y zxKhgj6=F~nRJ&?Alu`1K1D3-A9m$+)D$D_~y9IRS2-KC1`u9*6Nu5{!w;%!G&w@C> ze$LI{z?RoTcs0tqu1AyACO+NRGDM;gY?_6`8PZ#JBaT6UnlraaP-5#7(rehl58{6A zxWs=rHiqjN`1*QL%64AkV$kOriu6#ArE)qMzAc;?3-EV|lbzc}z9jOp)szMlQn ztLhj@SWs;14ge~UgewlZ=cb>E7{))f90w|Xm5J;wA?KNY5BSdv65)U!6ON5EK56IeEU2y8Pwkag(x=JhRbzHU*)m(QS9_^%Ire*8xBsBzZ)XwyF@$5jA! zLVB07b3IuyhIJSoGsBT?bhIh?cfatTgvMY1K!xVTuiKvTM@=y_AeI@gjcO>Jq9W@R zZwv#%cRKuACrcKGSO7b4*?NWoPy^`&c(Ukx&B5)1AV?$SQ5n*@%F60T2#ZkR5g2*% zW(&2FYqZfgaD8PVdUyvheTI|pQ%NTbVG&s)G*!d+ydnppB%jItEO7PP6YP{4|2W>e zykWb&B#`bWoi((85#gVMbjj{RYv8|SmsUwg?zF7qU)_@gm|OQ8!9bFNVh_m2F@$D- z>fc`4_m30AVU8nfAiJ5VtFGM4f7XZso_*2b9oyE5f1Z!OOX-C+cuzP?27vlzK#lfC zJa^1z)C`v~cCi>*=FNSBnc>!~sbW3zl=qLFe+CdIcIv(Hf2~M`3ODSd!JWXJ-b>c< z3!w6-%a{KnDpk?|Bt%vjmnC>$CA~R$!FO=ru+^^p$Js#0M%u$uh+4G19v%Fk|8GcN zaF~cDMGudi!5$w}FrC>}5`}(iuQ-Qb`Zz-&yfGKFqM~fIVCJ@@K1C zz}5r}2L!zK>f3qgJ;q;^MGMF;3X7@b*7G4KOo3IPcR?SBYg;8dI zw$yb*=_wq!BS7Ml9s7|svn3=k7Znq$n6;2pfKJCqK(#7iM)%-nL-;UQ)ba2W+oJw) z@f}_SV*;)y3m4eN_7L9ek8>3mH(wV=W*{{}IpWP5(IlBY8{{KG3j%-R64ly)+2p9B z+SGhTsp2-?7bnVni5yQcTp-5dt+aMXT^6kf9j|Ag$ISs7!G`X%&UE* zfoW;WchDgDNHPf5>>zydI`RTxCyDw z+yO+FxI_&(6I+95RG)HbC!b>a!GZP_vpknaNAA<~9XQ)n>YDMI_0K7`0$Vhmy?pJD z!EX5#{vpzS5#oc)7$5hNAIbu(q*R=pdPh!oAqLl4Szg^TC({{@WXN#fQ%7bC4bc65 zxS;=5z|8m0>X1q(j0K`w=B?&>EGS8~QgNWqw{}|lx3htjCK7e!Zi`u@haJ)$p>O^v zFzjwycqA*lC=6OI6&-xBord^@03OjgA@_s>k1>N4h@Y7LWbFU7 zLGn|6P!MF1k&vJ*HCg!w;SizEPrtQ&2wx4?rz1ks!P2ZWdKWMnxL2n6{B2gd{Qmz$ z2stFP_xLE27hO=bT<#xd!@LK}AEe@w*;)P)9D!tY7*7Xd+>mUeEke^lkaI&!Bw4sT zfD*2D=kAn(1Y1A~OqmAiA3~kpHCmzQfl7ZR_LQmY57yKNj%{Znv4givWxa_vUc$-*X0h>>&ilEy-s^Nh$C5O+%xhn@gb@ zVqR})zXQVv7CKLs^MB)=Nf3Q2M?O?dU?kigT08iPD+cpfXd+0GuFdJN{0#)HKLA4C z1rV)puKQnR4St>><4Hhpx-U(CGxeCEX}P zE>VPKg?rNL)8WR8&hqM$PaUrZtQKmOqlfCZ8K{PYXFQf=DEM zKvqHE?6-mvS^1!-IfGBc@EU$Ri?$1ERu33gz#KrxKIBh@;S^>H2)t1FK#=QCWc(|) z_yv49l4I!$N(XsOh`j&gdBRHU5zHi+@gd<#Iu0w zi|*?h@91G31%RP~QiwW%7SFjps&S*JCXF~z5Nq;+6BDsU109(c#~!wND8I^3%ZCE@qDbbsw8yo2|+2y{|*jRFu$ z+tP!-f{Za!2!}Jc_B7&gq7vIHDyGFWIdJNnXADfA}f9cb$tMz^zb(t*ryJ`c#&Fo{awNl!4-DKU?FswL=QP zhw+|Xwe&rGA1Ip+w}RHE2S$FKkLwR4$^d~pe&qmW{huy@L(10oQVS~p;>TRangKh|D~W2 zO83|@YDFw+^!1fbJiU9^;EN$7H%R4o_4#zSuf`7`xu-g7(hCOaHK_LOB|&M_m~{?9 zHBoYjCVn@WpZ#CTn5-RT3Y3}CBDwo7t)E?wKY6lk-t3QVB??af5N&5H|+Ny@aR{v720R19Q;0PaEWZ?=bR&KhNR(#?Pz z2F@SJy*!qABWHOgy6O;i{-tHG=Tskir%{lId68<4PwUGh>GE%MgRf4K69HKQbuNIw zHAwf3E*T(YOAV(Gna$sxB9$@>Z;@H>c(e{bra$&9c^0>ft!|Iut9s^2Jv1`07+L=enJHgUpC(algOs+&B7wH_B$=I|hXo zVwg#Y2U)h$HAR6BLFaOn63#0xj^8RJXHB#Y541AZe5O&|OVqqbcx6y&V{kO-k?6xh z%bD$Nxa_-=HTscNf*GNr}zyVx#3i~?rM7e?IDELO+Y6-1!%S8Tfr5ki%f7B1^2WtUA)1(a}3 zN~9P}mmE)N8`m(Mce^($P@xNi)XiCOb6ot{xo`cw(%Soan&MT{-u{Zm>G|cfX2hE^+dJ?XzQ%-whf#Xgacay|{Dl6CW}kUFtDKgV^MLk{qTflDT7f z6WavutL6S*){!f9H;(7)D_hmaNQ}&KYY*?-TdaW3=5pOI* z`{q1neM4Ll*CXtS<+=rt)7^{1*k?%3zK-Q9#c#j5U3peWXYx`Y(N99JXC=&j^OckJ z&90RtB3`6p@d@@?r=!k1+xg?Wi{7+Z7EQRVh78^T4ec_;Me_$iB~?G$BWy0ZS7}jU zrpjj337Lx+0>D5gvylv*v0#?$RgwmcRiDuM|B>1|x_jceZsGwN`IxfWAYZUGUuV<%{gUZ&sWToO1;K0>h+W5uV+U{ z&sFZcowdI&Y^=S0Gi7s+l(=2HO==MDpfrcE>{qDS*mD5>DjxTb73A4F2hN;`u50_dylQKjLhY z6(%hdPpq$BoboY=2uazVJqR)z$k|-UNsgDhsSf^kldU&kb3OUh(I+Z!jFEhkk*p{M z)uKs1%C*S(hU=o$UWESY*LBi8Mai6=c@_(p zl*E;c#M-VeK3jRt$`vWybNzi!vt0m~2+?W4?c&7|FC*D{S_o+&P%D_!Xq7 z;lR4kSQLN?6LJxM>iA0HVI+ZbZGd`~8P@b4!MVbYST&nmEB{?x;v59U4-SB`{4=BA zJ|Kr{_~pO+GcB#ocMbyW#C5K%yTotc<6KIGWc`+=pPh>4#T0VEa8J|l$<+h+kCby9 z1bD(_pIN1!clj4kk0kxR!!GBky4ZWua&RmhUPW9I)DJ3-$7;9LT_8BU+!)}m<$?vV zU1)xv~ORtpet~WVcD>%#%^wYd(f^rR^1>rRxjb@2yW|f}IdC0D`fyk^zO#5MU13qnQTDVE31X=76-FU^RIf|r&fCuVhb0~ zVIK7Q5x*h9MTpKVL4Ll)@WwmYz0!XO8*y%+rhN`hncD|u#JB`EZoF=mh4#R^>+C-x z|68@?-s2c~l#mMt3&UtOj;e1zqRZttBjns3*8}v}55PQ`THNy7QPqJ2-(L?nd`6#} z_C;Ix*cW)u{unK2){9%mg0$}C;3sg0*AUQIK{zT5_Cp$LA1Klih00@DNiZiIw+I&o z`=h`PFBP)B*k;?z7)fJO*ZgPWY`uM;mW};`l1l)ko7+o*>hvB+-4|b9{&<1LLp5FR zNn-Z{r5$FEhz6BvNbcDTxV8*qI_WiS)iSK29X|XGu!EyjFw2%kG#@Kl(HVQ+vbs^s z!KX@4LV`Z9)d=WwkL>!vi*e@TWg4+#TUMbU^z8{gtiuCa1q7De>e%Y5SuOtRZF*v2 zabW$!nKjk9`J8}?+UGxk0q$eYZ43qm`o*CNG_FU#KN3q22?aHdYFwNHFM|=0;+kw% z^YIoBd34RWSYJR?)tiO`Nq2*?WOTYaj13NFB}mJauhBdQ5k7OHO{4jV>rTHao#5(4 z2gB(<1Wo242aOesr50f--ulQ z1IKjsZ(e*bQG_|g<-AfhnZ%1Ji$x|19tq&VfhK@_?o&S~oY|a$0BEgBZopR+tIU>! z@xWfT8<@{~JAu>ic#5!auG>h%(s@zQ%ez3i&!qyIfD}!@0pzC+L=Qj0LD2Sc$RQB~Dhp+_z^s{*kOcBjii;(UALHgW5{vTac`+r@wmtH~ zTqIuvJ3fX5K#$*ZXJefkhMYqSL}Ke7w7|-{1PFF^b-A;rLD;q8##3{6amo6xdHD&m zvXWW1FdnPqJ1!vZbw-_gX{?sxKmT%M;VWdv35Yb4lN(@#J{mhxwjh+by6}pJLYM*Y zx+mDw)FDutpfG_m;V_L)%Esvh6o&({qDbL0JHC>($Gus%>D&8zwjaxX#5(fO-Ws2X zG}L=woOS+~dF#DQ=`PbPlP#6rgB*R1zg~niFTedYrN{h;0?vZ4B%V zB_0_d)azJaz*qahTvNbl2#0xvQ(RxS1-RXCu{Zb9d#Ck{^;N^-{Jp@luOlj`Ur@(u}efQ^0D zCoB^k2I)`bJx;1&RL`K^ZD#{&P>RchbhIQtAUGeT688}tgRoKh5>TddlapQwJpZ{{ z1)Q9C*8>B%;-Cf0&Bgn{febMzMCr=k!Jnrlyysg@G$z_}&Ulbkah}KM5;Ddz>ffD4 z`3Mn|>kA;kGkE%Try9=m0+Dyar{O*!CIE=LQ0y#t02bGLpsauW*9A5md?GnJF(BeM z68u)mezrXlcwsVA>Mwe34T~#+AEF2oK87R|YRc>f!=^oMjS5Y#E|y)LFPr zFvm+eaKsc!_c`0Xxtl7$KHGUQaV`ZQtj38R9pe^9ftm_P*y^FvMomV-3mX4d}uAjIP(nLfgSEOS>1m;&HXFq1m4paDlG`L*fyO(E=ZR||XcY_#2f ze`FnLJFkKBWQ6KP4jp8~5KNFh{aPHiT3njJol;!AF7}`4z^bDbfQ49e#?Zii$_3|z z3ZHpl`cxwIbN;g^DiM8vsLuh~#Z!S&5sb?Kha7E=eYdDeu-jGM$7-}Vsr8%sVi2&L z>OdERU7$rKMQPk3pYWc{f%pho@hYt2`QhTvnsw&h9(Dj-6r7F%qNp8t4vvwNr5`_Y z;=iHoh`NFC78LQw#?XRSU%&W*MtIZ_pxxJept%mZKD?NFoi33uZStAfYx*rUZ{jci zZ+BSL{qf45q@#m_(K>qD5%gto@XwwiXY=Q8y9yl#vDGJl?@aOPbKn00Eimq!q!s|V$s zcga`Rvqb=IZnrk!O|)FrivFK++m><$N$@#_1f-Xa`G8yE>V@6YKcuT7X7SehL7k@cn~m!a+QX?R-@O^@`0Bye)U>O7 zsb_9Y%_tJcu(LU<%~k<9OevXOgC@B}l0(dyTeR(N>PE~=az?P`w9@tewhz;>_ zw&u=8?WVTz%$*9WYidvnpO=PJ7qYm|$8q;{5UW1b*|4~y?4l7Q2^$;GDIe7%2tqLa zETr2S=XwvL#4n!7E%2JDxZa4yw3IH2FsIv*eODe?ZXO?lofZYc-?b0(*x{p=2gIUH zNsNRIZ^IvNDyR0js@nHY=q)p#xe11^ngR78yCP6ugriDS7%uRr42DO6t$qUA_|*5V z1q@U33k)PHWq)UZ3Zp~dSaf{v#yt=dLO7K;I+?tDJ2ii6i-=o5Gb0BJ4=1%K= zY(TpoAt>vDbo+ciVtj9XC8#EwA7dK?EW0>roY!D>GUy`EcZYe*3O9~8g!&5f4aN7^ zW9~41W_|;TSh%`vSn&RM)Z*A8uhuVo<2CDDeh2s#01wK315UadG{vL#zx=e~He53H z{q3h&c>$^KwO@^dJFB0WH5H*6PtZveJ#dgQ<{3zp{lGOT(KO;cFzBS&T$@Ho z&6TT4I1NP(^z5y?V`5E-DO6z5dqx2R3q0I$v3q~k321~%n@a@LaF2vV+IYov@udiT zb)4R8`SUik5wl<^HGrirA4YX2LUu9&3#TBwJxE0H#=eH;ph1Ac>EV?&*Jf>{+Q5v) zu{fd@hM7^2p`#MJ>J$nPpPI>q8)|R+w51)Pf;vWmwzly#U6A$Hh!8 zPOsv+B5MITlQ;hDCkW~L7^VrS)H2PPKNk_h)LoMCAKPq#VRHR)!XXeX2EkZ@Y=~zH z3&3E8`0i^}6|G~>SD+MHv2tw z`AUMdgxIT7RnPJM9qs>|Oe zXuaO?7(UAv_q{AeKm&xHlb~=9NoLQWL?*LzR0RZFsCpg**xWu&-=DAF^f;q1`KeXr z+-O|2E*M9MV9ssozu9x+Q`UxKTh;@MwePI$dHYw<`l(&*vI-~n<4dfrc0z*rMzJzC z$UVZiW8`FB2`u|tF}D;349cz?Ez(OHcl#){-+p+`*XoXN{+WPc`8kBjCeGOj84u0}N{4?xbz?=!sjLfK!#kQFK zyf!I!oYMc8N(cy$zd?Xxw~RC3MX3uA;@><+VdfEK^%$XVd7xSLU-z-mtB%h-HS?u+Pu}MqEDwb`Q)V83yv`sN7WsJw5)&it4|R*2P(OzSmQD!EU`52 z5QtGKpsgx9)Rz1ct)q(3z>d3GzO1@A)i(;5ShtU~3NN(NssupoM%e@jf{HBmt`bAc zZ5%MRT9@vk?ANlZl3ryUd)8&z&p+1!H3}e4II|U?=&09vcmYf_zY#W`8iSonJLsri z>XSLE(c{s6vFWAd`uHgOl$XXD@7fy28jPFf;8DY>uE4JViaf-HK95584uP8pM( zE!h2QT*%5Hu;IYR77s|u8uiD)T*~ImwPE|b*@<~LtF0WpUMEug;f^mEg-O2#Rcx6T zgTZIUIBt#D6PM1gq314IJ!T~M==4vtx6drk-8^dfnUT=Xu{F_^`ybV)JZOo@ z(cN8O)&vh!&koFSoavn{c${EfBu1yK5m^n7ypLd^k$*(>J`Kx3D}1#Gqw82-lKF|HrdJd1Yi znY7NQl)X9GRd{$RRW?q0ufOLVste7jRo%zfnCK1!=^o{r06rmySltc!f1k3Tv_yX& zYo&0><#C@~ei0trA|M(VV^$T}aN0jkL6SlSQ`f*e(IRy23Y|`SjaKs|lpVWP2tXG* zFYx7t;Wi#R)68KVT2$y2n7nbXvkA#(0;ChOpma~aRTsPY0dUIo=pO&o$=|jH%>W1A zz8C}z_dTnBb};1@#tuOj1`Ow`Mn?Y;HfUaGdOQa|CR<{^3Z{*Y)l~Q{s-r?#^9Kb{ zER0}^@IKoopjto zzT#{B9G%#bobs94(T&xqoCHV%JkFW!ERE+69i z&CMMc5-Y%qx#9}AxdBsr*cqI(RXno)qaaHHve7;SkRpdp6uCHJ07os&3tt^kY~nz~+zK^_2wli`n)K%zbhhy!#n+ztRjgly|(+gl2I zz)MTCEfgC3>MqXlxg_9syJ#PP%ZX^CigQ5s*{%_QPBLO9HQ+hrZVOGbTyIGexwlJJ z5xj!?Tj8u&`Sd9PvzZ1odA1zDgy&P6V>o|K68uW6vpgX^Sial^L{j2+BpX*<88wLL ztkQaN2CEHF}p zkl^=yR~M(~pU{o*;D|(61=u8ODM{!wCtrr)`n7no_!CH@?iW7ejqH!xlsMlDmP<9#8zPY!#tXpdzA&P9p9M7p7$R_5i0st&AW?G{ViAYPbGRz;$5P~&5p)H^ zlo$_l!{mKwm!BCooyYWXELFq8nq zryWQ8hT&bx1EM%E&2em4K`cmd`s*(W{63Yw5`?;Lzb?v_D_WJ=(#7OQ1B>nACso%o*+UF=nf&v0h_i5n@&j9!#9Fauo7>~2_sWs zdeFHf(IYt5?O$|)B9?T@9&#ULC4%8QDreMQ4Y<8=xY<{q|4}9{W-R%zN9JZc3kZD9 z(c>9PH&xBp)*xfu<1(KEskzV1Ub*(qaAXe%B9CllK>=R&U@)M_nW-}6-Nn=nSVZYG z_p^t>=*~s;eCY&ZIoaSXKFOhVrECLP%F19`tJKtDpCgYCAZcms!oI8snToByJs(=r zl{mkQWII0#k3)F?)0k$*XFbH)9Q6ta0Zh z05Gb7D`JEu)gvze&My;3eSDH*2qZfXA9-wKX07&OJ0k(amDou_H7Fq~oTY9mZk|i_ zlJO3Hk0xC{zJMXTB0emoxh@ZKJA(n2bAfF?1;MfXRebRMJOQ57qpJ5d0DXVo@32u5 z*!m%`gcKlbdXUug96`TIMiNZ0S0%mv7O*`ID~kgQeHDP znZ7x*+x@zzNT^V@HZ9KKpjR3Ap^%A3#p}zKX=~V%Cl0{Dkkjmr#11JUejRT;Ld=X{ zVVW$Bg&X;M*kvV;-lgXCC^fkcr2`nJqtGZ%O^-XVtm-qN8ZfHD85^v)Uf;h~Uvf6b z+vXDB?r-k{6oc>Dpyp^(qA_g+2pYI|g@8Z?%}@FQ`)QHvJ$*{Aopposbn330o+zJk zYVKdx;GvW7g~ihjY}|B6s+l-|B($z|9K@>uYZXnZJ_hVC7I*Wzm zW2y;vvwO|5v)o9+IS!ol@Ne4P2V1R^4V_P$^|n{7cUP$eEZz)|)~@Dw=RR53-liKq z2#zWh6W83Io$ee8(aA_O2U1GK;Q)s^V2YT^VFrBdNe!rABV&*kv%ZlSb-B5^ugJ_y z9ha&8+jZtbf4=RR-^xD$y;g{NLv1IbxCd|&BxH@HhDcR`$Md?gk(D9U1=L*2byE~< zJW!^$@d1Q`jkafLdHK2ib&eFzLsb_{TCW74-k}TFp;ktM^95*M%5Jy5up>xaS})5$ z$gVkWdCdDdC<(f#`b3vAhOX%zM67(+cV>w5L)&?x%ee@@&iVQ)p$btK>fvAsb0bv8 zw7}03#IkB0M071e>A|<>qBpG-1PzC*Lc%>Rj$dEYR~V=n%e2-@t9;#dK?@+41RI~yqYA^F;?Xy9d8mp z=f2CYn-^n}W5FJOqx!&|kBdUnMOO@2_s8x*klyiIQKN3r!a)DG;PTO&a*4`K^UzM(@xB7)9cz4%<-;k-rE&Y?&sWX8*H!M70{Qtz!GKLGo9+C^?j^=7 z2h-IzRYeg|p`AvVZzYgB?>G^Z@dbNM8K=E`>vUA$MRQZJOD`Me6uTZBQ}sbdVR^tc zJf=QWrxQ?|bqa+k+&4L#aaLpxKy9&PiuBp3gY=l0FKdc~h2(QxBSll~b7fR|v3hZj zQ*|GO_eG)#a*QRBEh_?jpyo8268^m!V0MIDmc=Y;IIHce?y9`O-zYlG8{=RtW{W)| zft2hH5mD71EylcEQ=_Z+GeQT=LCa0l-kQd-i93V~BCK88avII0peR zJ!(jTt^$n(MOn|Pkc%g1d+U%}+OtK#mMXd`>Fvztc>sBPUI!Dv)jD8q>;RYq>&)!N zT{s5@v+h*0ae;+4$+lM)4_>nZuR1&~BeYA~#(Nl-=k%E?k$dlw{6L~(r}u(VnE`44 zwjs+hUS-IVUw5^zZK^nOx4KVSe{r-{&KE`5?{jKmK4+h*d~aed%BK?5W`FiNB7{e? z?746Cr7YkV7~~1r9!oHGl`2LRun4ecQs3*2^#?KI*gT@Z06L`&3Z4Mhdo@hOM zd|{pqs*gqHV2jlh3b0Z*>7m9=H4%`=DF{9}F6tl%)Eq-cg4guS`W`9(H>N;LadoJi zSZghY(y4goHxi94IGe2Mblp#iu>0C4)DR}ze1+GmqF!Xs?$*5r=*@c5KukAG4V-=Y zyzaU89S+2YmN`6ulSIvZDzsNycD+>=lqfiQ%G0f{MAs%;^kxt zc!e`@^CREEYK|_wg=wSB-@(4PJ<02W!#iEZWY*kA7ZNkGlOL@B$Vtt`7x=jEd2#hu zt4qDrFXbpJA2j5&DmQ=QAb6NR8DvZs8(>YWixPR{ZgzP+a@G*c81Uj|z&H?*3AUy= zhQqVd8wL^B7eXfmCSs(J1!GWp(G(!^zF(eR<}@4<1+TgEmU=us_zS>#i4m3@`E)Vij^P{CHE2 zMdN;q<oEyD1 zG*8TP@KT_cUu>OcBl2AR-qGL6V+UU;JD)RVlX;+`kk&8j-j*^ycX4$s@FO0xt98t&c;wNO~s2suYJn zuC*372n+!fTQ5;vXDR(bQl|Zg2}QKpr(x%I_pFN8U0FYdYfhjTG+A?Lk5r|9Wqdm3 zD_v$hJBWN^YHpxnbss+V4GrUqRo*$*(&`CyeE)l7dz`G@z_xolO7C*4M1YgBm4um1Kf@uW+Pl?ED z?0)OaJp+Z!Id9*U27hOz_J6C-uRvFQf;oN8)oVj1@Fu8N?JO}a{tFmL&@(s$)6WMinTq1`XGN0OMioGLO=sq5}95^62$(|xNzB6kl0^^Rur zPFl$4-O+;&BBhi>K0Q!~HNX7O$t^17HbxK@n7+f?+de=mv|jG6vo<9tA>*d!pK2N- z%Z48=29!jZck$ah0tDPHtw`Co0LEYWt7TEKj4@RP*Z6e}lnDhyFrmse7Lhz(M{wu) zdD0A_z$pxkvybvqJn;DKzT!Ir(0GyOXvEuhvfjRCvHoX$KsIO%XjB`%1O|vCj{;Id zimTH}bS%T(|2YL=jL!=Ee#x8`CeTT?^!Ur572fR4&vAuf6ZrrtJ78@COgXQ^$X=;} zeyp3tyM3V$N(i8yUbfUb?j4+rAc0>#dZK;10@V6>AgR_`A0nj?H`n_&>-pN#9%J1o z2SfExbABYD>9%8SAtnNMd=(87H(UZ(C^2!ndsaT;EyS5*M#);NvX&F4tW0O_2mv$N z71MK%ny#1Br#YQ@J#P|6hH17b8O4HAXd_nAhH@*&)7Z%I7aSXmZ0DPWrj3tJQ9E=C zn_Xc?I806yE5BZ=2raeiGCZl*UGwTj3{vTiaasr#Gy=Nr8OK~d0MF2tbWKFR?V;L; zNx>!1%To44FL)*6elo16Ri#=Ek*d-9NP=26(G#4my9}~L(NZ3r ziSM{x$Y%rEG5I*EPWkC56N|}4@J3@qZGS3u#2RX$XwqGBST!qMN$v)%qZ!(owvvhc zW!0T;Zd~y@h)~D5-r{1=199i1xq&D*;2QU8?(0*NyCI8g(VUAO5q*#e26T=iF;;%YK zozW%o{q71o=oT&W>K_JfqIrK(nKB$u01}yEb}zKb3xKZLWJr4oJj+iD?6>+P3L27k z@Hem48R=@^_$i`oLe6vxbUxsRVpBiJqPiGI0TI{MF}c)8bM0ze4Qx~$%^ zo83p?;wl%|+FfO>SFsqdzW)Iu?FSW~1PLQ5mf&R#GzrXeH+XE6E4bgj3cOWUqj^z2 zzprA@v0ExQYrQV(OzL};u-f$3^vFx7xuks1#50x?(T?c~2fz9NG< z^>IcKjIvoUc7Qn<1f}F?dh!kARhj65A2pQIhv)*p1Sf(%%=9D3uW|dIpOl#%Ihuvg zr}rwovv6RdA!TN;!g+qyvg(oiwZ0KbFeyt1T0WD@FlEk3v;-=Hr!&;|YgsemL4WIJ z&7~EaTx;H=`~pC0K!-QWOI3wpH(YF*fn%}z0G)~DkwUIXTsL)hYV)ihzQ%&$obRI# z>K*Np8azjrEaljCyHWgcUX8+}#}o zUIA&5kNBm_=Bv~bn6~l2;as?>_L!_|gf4uv{i!r-^yO3S1eu)Ri`Fwx3nHQ7#?Hv?73H*Q} z^W5mShv7;oNC_NCQ(%}bS!pRyX#jtES@&(*1DdRu^VkfRP*gZQCNF6@S~>Kg)>&C5 z5|=F}Fu8T5;B+0Rz{R#X?o@M=t<2(r9fOqPX41URjltEuWbW0@gs8s0WP6o$ zakHSy7184o7jY1YWtoPaK4}WH_8xBC(AkHLEHAGvuLsTqx&a=>SDX_wIZnv-1+**{ zfqdrh(7*oW|D)=?1F8Pw|Iu@7Ns^+-NnjZ2?Q+6fU*xO08l+J3?Lof+tKiV@VlCBdw|-9@grp!kx&wk8YChbCfVVx|xz=2M5lIl#K?G*)G|v(Q@|MDk-qSEb2(`^70SJwuYk9)JPC zmBcmZfgxLZ?;bMyczpMhDu>^TghsiN@0P6pw!NBkjNs%mL2OWmw1{vHf4kxPKybAG z)XmULQ)X8SKuFrfdFB626PaX4{E@aGIl#`jK7q;sgemvhNaTaw1JL`?WcG?xO#==w z`UEMz_6lc5E-Ie}8 zEmpm8W*=Fg*q$f7%i6RC%0Fq}Xu5KwAt) zP+4{D8a&udJm&7V5cmk5>;hiiK%<}?$bAR?5#aaO_$~FzT|FrZ*mDn{=AJ9ZX+D!u zMi4Tj$MuuDuRtMSQh+uTwNSxfjcZlkt{z7iH^si~Jhya&trPesO_Wd>FmKZ(Tns^-cbDo zsG6b3y3_Id{)YJ>I&yjk=G!83zLe>; zRZof9sN^UrW3P-F8vx4QE>W_&P6mpk7h7KBC#}vXwqid8u zVCp1 z`-I+sKD~ln?VxG4>Ja+1!&W1tMPXfgJy|llMgO%8X*BAl(QSsjq|lXd))ArEecbx` zg$+RfuWDa}9#lE947xBnHk9R+k=;4n8FH5Q%#v z;Z|6se`r>kLtg7*E!jAbL`>tx`|i(vx^pdFvo;cJkPM2?)q^_Uy_BRlN6{3G4618V z0t5*$waI!^0tS4!2G*__N0+;Zxr$QGmcbCg#Y7fJ?PbrGV;d8V-Mq&q7NB#|yZR~x z3jJ3rKakwjhqPGbJrep^M-7*2wc$}}Jn!W7S22B=%s!2rA%2`uI_Rd{TQ|q<$upcf z))U)5FsNPZ{nFWNQlmS|evUn^P79{HoBsL}q*u?H4M1?C&U`10dN6njrtrRU@04mT zGv{v(pfZwxZt^TK}+ky_Rk6Eb22sO;u0`wB(}3wS=3-(CZ?`@Y=2LbT}W zK1!nmirv8|C`c0WUPmP)S?Z5g<++9|Ht%v%XhlPYkkn9Ylc5#q7Y0oB9$C#%>PNjn z3|StWIiQl7%=&Ug@W+FDV()7Xb-A>v;B`Xxenaf0g?fOLth#+%^!8JU#rS6Z~5KDA>7fldR!Q1h2! z_krG-@VoB2GB)(B4)s;h1$DeYMvRUrF?tZCV&xCis#UVI^f~rtH#V=Ldg%bC0!EU3 z^4iD+J%LjV!nE{#MTN5?sL=S`byn4bVTj!qpbt31bi>fH172 zT$xNp5LwrBYGhVRs%NOh4`~zx)e?CKrmwlOAB5KQg;G8Ux@?`e_yLrv4QNrC7X4FZ zvbi-R3zhWq8;dbxx9X}D0$-@~-}M`>m1p$?h?t*)lM>Po7%GZ*+>-zMOwf@KyH_7Z zL53Wj89SX!C9%_$`M*n+ACL$hPeUh^2svJ#s_{O+%DMGg@#w_p=xDyi@%n^Perw2o zBSL+*|CtUjr+`GuHp0&3!~f5p-FuJIcRJMfxNPbS*M+nkFsDM{_qotcP&o!M_y$^R zwHz~6_-1TIZ+Zm4rOUsAOD2zgzN#8BBhCrfV8uPYK^9O--0j0#K0HoL$OH8+XguLyTRUbQ_t0dQO!>74IGK)= zC~lDAl%awsvqZ}u(s1SFNrqhbe1lBuoSlO5YZpI1yATy}r~igCIH6A&ij{7|Q|qA0 zso|wU{v17tp7@YuE{5i|S6A-s?%Aj!IDlO?-NwEeX9!S!lCJ^}j2c2?L4Ys8(#j>e*RmCaF6AWC}F?I@kjv>RaE7%qf;H3gKj2CIa$o=m@R$+-Mw$P<$kCwE9BkEIs`>GZf_r3Z; z2w`pZUP`&@WpD2=QG3sE{G$a&jB}Qd>4nDD$^eD2hzo{~1uNJ?UsCSgz^P7&r6|=7 zo{){IbgwQxtkv&YcZQDW!c>yq#qv&6(g^{5INW{-6Ipq@df9gq=4f7vDR9mq#G4FT z*G{Y%6EDoDR(NXB>l0d|=F-6wvuC3cdJ8c2%YMLjwxFn1_Ja^lYMk|ZG6jvmR0;I= z;b>3^bstt;h7z()#sMj|WHxo2P~vR+7())yW9qZmo4wVqD0_jVtzhSoV|!^%GL)VB>-iX)Aw|MH zR;zA6!fH@9SvnD4Hm`r)EOdU{ZX7)%Cd_#T?Md+R4kPxiN`;m-a6IgcYy-W74};m2nAt%>#21>mL7NSii`u`}2ul$L|?F4o17@&|Se zQXBqYtb1T#>eZ77G$Rck7SObYvzg|QaKKD#oaeHkIOdIE;p)C!I8lzZ)Y^S4TPn~T z0BYrNqm*67V}hFjSkP)MU6%im8&~F8%-$sL2(F2O0Ox&Td0!x)IrcY~Vl_lQ9Ps>? zJ<_UaMR}o@wgkYg8^IyHxz{Cl38J#IpYHv5x$U&Ve197;qyZds^|B-Z^`a}<81*>) zz7q2j$`U3ooR(xSYD`Rp&MKhskTPq^SVlZFS#U3L6}YB<`vt`G#@1PWYt|I677RLk z%^-hulK_M;?jpXNt}&Ep4lX!>6#jC&aeJP6^5o;%h=|+mkG{+(GvwjV$*_3NC3!7v z57b%jpxTovfWr>1ns`$}Yac@-9AH*l&RV<%)r`2n^cPhv@4aR`dp2B(o`)5C^xJ+2 zd5QNi>Ti*rZEbP=xPRdOPu>N(9`L4YnPda*JMKaMqeI_esW_MB8n+x^`E#HK%3yQG zJ|_Nwa-n2XfB);P?ui$sr}ftM@77?BNpcl0>u##=;97Ip6H(E5iM3866sOXJwd%zI zse?ZrLAW*QE#;l}OxON~Su&U*P0K@Ti;m4*s%5vYJGV{pM9YfGoY=quOmdvvKnrc_ z#MhczNN+_6oi~Il_yAwOBoC0}B)%QSC#t7e;+VTUzrS9)(VBk27S?#*-nwSkxo(0v zahL-!XE}g+60%pDKe~)MCI)NEd>Ylo=*)2cN zdbW?bOd#~Daz<{_u8glwsv$KFEB9pTM4i@Z z5eJFuPb)lxcULpRIX+q(G>r7h&#ooNpb3p=HtBAzWlmY&JK9DBx2>*El)wi6cPc%| z@@P-1e^HxCHFs!Oa(A<>M80AFQK@D`f(9X^v!!B+Ve*`-V!iTCf&NkG`dYAe)C(}o zdoK2+B@s-9(EGLJzsVBKy~qB5Z(|^Dz;>R6uk{C#a;=>YZOHLoLNSZI5Q$TWp6HDwqJI8S?=!W;-+nil^=YKk8MFkiM zw3A%mM{hkMFHDJLQ-Z0D9LY`SwvcRQsoCqt_3RCk4To!tx8u44boS50*w313XG>uP zpOvRjT{1Mitv3g=IPFGWfD+DO;_ z<{%+_w(zfq_||Ht^2%>HILqVNuWu=;fNZ&^Bqt}#X2R*i>u#`qkF4=h~nS=ZlY zkelqv)T8jb_~g+;ZzW_NP-*J9Dm}h8W*TnPO#R1|IPBURmXT0Md5!~!-A#`??f|nA zmMej1c6CML^>2hz0cV#K}aQeWwQj!zTId5t2%R0Lev^=^|n?| zkh3|v^?C^3xY4G}{hILULW2SuqEFh8c6uEHs$%n@v*pyrCdm!p)Q>*^rtSTqY9GS0 zLEC_>*%^SY{~t$jON7HXQDe;p{c@RU*(r_co7g{_ao<{4%yptY?-DSwvcKU5Cig*` z2}E`VE#7{w|58io(nR-j!jP~|6_6W6?2bjjcgR@p^tW2?NPW?%T%-K=Ul0N8bOx4i z^N$T=5Oz87^2aMQHC#xAtLOdT0Oix7>e#+22bUbSPciXA|9!`HBSpaWK<5ku1z}1i z+(%ZAV#NXLG}Sa!;2fXg)}^8_jF&h{GTGlz;2nEZGT=S1no`rX`ty_1u|M7s7}u-K z!p0;5jvMRBHyw$=8SFo3bdCN7bpfy{|Ie}T@Pta=5q&>t5#*IxWkCer6&m||rIf~4 zRp`ip5T=hIms4mspD+S!AwXb9p4b_sT{RIKvU-}V?T!`=S>5vP&jR=f`GQSXw>-^P zxZc?XLRKM<)5(qe)hc@~Lvm?Tk;botT1!Ihq5OdS5N2QC_=Lu5(_Wafo5qtHd1m36 zW6WYx7?)4oAw*C7+rY0yvU?o!IQG9%nkox&q6-t*9@ya(gg7kw!yBT&9I{ta(=_}p znA1)!!z)7owhHHLZh3TXixG(uc4R#vZHk=!NArp8-3`;^(QEkIt~U!geu|P=lk9xM z3F{`!+rSv|SiB%Nv^?Fw`qJ;ph-FfOhsKJjr((k#B3W=(7Q3S)GcXA)PBK{j3Bnl- z@>&T6-2i45&dJMWp=;0?b_ekd&8?4s{+c?v#Jz$eRD_}oeR|x%@#CP(r@1&{?e!c< zD|-nd%nE(Mf*7U>?ni^PqNR}#;)rzy7!le*YQ!C0C{a;~+*Iivn72)1go@?Cj?_^k2*9`yytYT3a6A=JoS~fiPqZ4Z#QfB1kpOTK% z<$j#I*#Aq0WkZWUR^WMBuc13-7B#yI;`AbDBB*mP?L>Mz@2QJ5=dLxa-ZrcqY~tQB8Jc}b_HH&JuQ zRjjObH#wTfrir%au4lKKnfRUyOun>we8Wm_inQ~7yB{HMcS9S=M<-2I1B2>jZ&i)j zY17{fUbE(mkU#3w>Dyh~St3Pnz0fJF<(oV%Uf*QHB>GS^FkiKX)Tmo36Zo}u6B}GG zRY#5?-u;j-QIKA`62Abj(>h57DV!-zy)JB-oC2un>97aBPUmQ%+_i_RJk2Q}DFAVN z*|$-o{@)L}^$K2CIt3}Bgo*h+qrulZWCjetXn-a8y);B?V7eK%N-WQ7c)w8A1$QR= zAvtShOPG#Pb9=H&cb|K#g13M>X zK4rLD);=g4k@$1F=0Yu?Ws9@6!8V4X5IQVeYzl_e8oaxBwDddI!t-56v3jyJS%<3U zWZ+J3KPR!D^LOV-XU54R&-pJ#eW$~my7<$U4|Kb04}eE9nW38|hjwY5vn1LBY$`Pq z{%CDg#0pnr-#!krnl<~bWrEOT$Ux8>;f(AWE_DFB^yOXn%Q0Ceg+}e2ZJXNC zkkj!~e=}-AzzWQHH47}o5Uob)f<4C*!rnYA#BZUbB9cwAZB3R&AkXR$N{-oBwjt68xi{pQ%YbIB&j1UBwoAMQZte1QsVjN$ONQbMk5xy1~3fm{uxJX$UcJ>%Fu*&P;Yad{7njQZe2ltoZk zuZNv}R^|9G2@G)UEPpnA+hwwRT6WT2-5mkptS}ZzIB`Zs9zjW=!ezz4*FXKh%=KQFF(YTNj43%1SDyri6zEhvl4O+zF^ zNFS|{+@-&%%0q~&wu-`>UvS=#K~$xa zOLx7xXVR=Ra2v`+p!{PJtM+Ws%ja&Ar*|TjbZr8G!%*#txn`}2YBK~i9)8kQexg42 z-Lz4c0B#Z3sh>IYi7cJlv5tDDaO=kOSwd}tbdk=;LC_e1+OV&L%fysDc`Z99cWT6| z^K|V7ZhG%&Cjk6o#t3l+Pd)#IQt64)6YutwL%j&`V3I8w5i_|(l1Mql(F>^sOD5EV zvQWaHXgc?&>o(geC!*=u@W}Vnq67?X5ETC8w>wW`M{7}6LjLM zgIifnlS(JcxYgDmLb==6(e?SHvAb%ha~vi@*rxC;kFbD{*1F)`Qr93yROj#+PJxJv zMRsI?)SmwWASaWX>VSsPQ{H$b=##`+V;|30hWSmkS~ZA1`H&6$?$?rO)F~vv+aj^o z@e{!wBIXwvXJ`qUBx+8~7v$o}K_{bdkOBov>+sG4tB<6>zzIsm^8`Q+%3QNV}mItw9}0@DPwzn@$F(hRF`-KUl;Db ziKEd)^L?c<>>eI}{RI^=5kaS5A=3)14HBT;ul5Dwn6aBT;woDIVqraN!J)wnlFid= zN*a!S-Wz|U1Y;vFpS6dav=5s79evL`?gDFOm~o;!Q?eo>v(Hdv9b~%8;Iyi#{W$EdHKm=ZkK>>cqnMF&3u0#QG6z$m%)YT0zmgAegjm*G>+Wu+a zrPWxi*|6i!cl29%%3-Tp-$6?y10WfX-LDoSMVRys8B*T8XC-cpX16)Ynm>aSfD*i5 zJ9GPpM%V1IrzPqTnM{X2^|vstIz9lZ9@c`VIn{-!%$~c5a0~t=dB1M|PZPF9ecdwO zlk)&*N8g<4wLNW2k$ka&?k!0bpb`etk)do_L}oQ|>iYDC{W1OYN6qvh+FzXtAn|Wrf*@Ne2@)L{C>H6-1su zwTn9G)eqv?hYa$sfmnxXi(}qt&LtBepa&2x~BZ2i~E`Lw6y-_^AQ>n)SeL|?7yh@D(blQCO7nS`?@tixOh zoe?+@Gr9Mp3ZpmOySo^2x|nTA9J1`4-?RVcO&8h3srxlKy}P3=^xP5ys|Dpc!%+iw z(`s}x_yxqV5^tnO1gxvlSgz&f^T6YRY=u)$;i$NcxVn-c(Cb(4eu5Z89@#jrHhFJn zd!B0o_P}ETU{g05ZCilxQAVfcd=hm9^ndM1`-P_RKia}>0(7WXC^?vRDbaBO>SU+c zDxG8rtky4=O=O-1?G3%c%im}>tPv;EM}OUGst~oa6%J)n(B}7wj@IP%H^a zie<43e6=eXvLm@QWkPp?h$YornkBStc{x>W;KapAao@tAH(6DZW0tqOigm{0M&u%Z z4$p&k%xAcvsB&MxE2C*%)Oj_VUO260M;b<~bnR|zdsN&A9MM3tOmWx*h`nT4+DTsD zjQ=B!2wioB#sGgspL=D1`Z2M2plYbFw=)WkKP_?8o?f*)^A8*k9cfw+_h49Go(a<* zx5UsDzZ!w+uEOmuR%!}@xMBv@1St_`PPrBbDIqzzm!G4`6Fa;9W><)5$yw4M8kjfD z=|HHvu&bZO)9dD(<=3%c7RD=-wwy(7%ejdvBy#|J^SZNZg#77NbUTA|k6=o0a6Iw5 zuq)ou!omi1WcxHJXpB0vf$Vs53^!o)p`7hUBUNWjw64DQM4dKgE`LUg^GI;{m(mRy zY?Hu0))u;7juNZW{B!%=TZnN43V-``=HJpiWwUn>9js%7Hh=4BJj=Jq zvm`s^omAsi%hBZmLI`hUREPa4>7A3O8*(r_9j)@IaF&__u3{K~$3-2d-9C%1ZY8^n z)vS02%5koXIVStJT!eTDPc|}RKc`Eu6G;B>E1fEe=Z|EE=rquyYxoB3(_jW&4PaTu zN+0F2vjIb$X>f^BE9LG~bve*%4ZeP1!b8y<-08EfW2eAVKQ(%)eadBS3xan(^7j^& zRqi*(1$p*jUVAhD+u2d9)A2GXf3=I3#QfxZ^P(NU_^bI~k}ZYQxpUXSr8+h$2q0uH zB+V@j-F5n|%}YY8&?3vM<5gn~Wwdj7e1ph|AMk z$UNg_(q7 z{3)Q16^z7m@u?jH@nR7C9*ypLiNo|O`$F7^9abNwJ|z=S%28~;awIzU*=tPPwi`>a z_WZl*V{>4jte#mt=#K%?kvq%ddebaYI$fvJZOu|F{qtX2z!9(&*Sk#oX+nILGf?2P0Q69L=`86vJ_X`5i{lTPM(7a^w$(1-7SSV~ z-NR`d?*iO1G48Mn0=-@lDKUs5FSlRzw!!njJe%@;B3jR zXyM(a*b(3@I#AVf?n7mogJ@-rS>CyijLl zkZz!6*`zoAh5VKEfB9Y)Po7pXe!?@R=**v0`;;k;-?Rxr)154_l&V*{j?M=S8Tm*F zRS8iuDjLHnC@C2DbLVM=cnwP)b{XH`zWY7?i~19r2fQkJ0#8&P^0*scod49&t!Vr# z(Tlfuqg!xehMG9jE_CJeU^{~-N8Io6JlO4#^Oy=UlEd_PT7rSVD5DJ6^zZGZlL7+0 zdh$3zGiJO5xM_|r`L0o1uP>a3s%Ix5K`d6T>^s$uf3kF*l2hDYKPqIR_0OmX{xlU^ zB!*_anUmj}&~>p(eY)L-&K~c9YrX4$fG|ckUK+)#*DrIc5xA6t@!~c2o(#Br$#d=1 zJBMgnd%5zC>)z@|F{J~|dlU$F3w#50!LWkV-rXF9@>gvuA7p6|Erf~9Nm3FmVQKIn z0LAX{!F)RdIIygu*KbJKS(U!aIep#IAPxf4tohrcEwB`3c%&L^1N z60atuNvF+HjWk&eY?tjdz^K4PHq>pUsqT%qS-dEpImHTFO?-%Ls-q^%!wtz^$|qhfBP{byLjcu zSDQ!m14zp_>ZSPK%A6N9AfAQ$u}`QY7d*wM>(wG2_`B`A2t!{&^9uJ{e@d4yyRF1u z+^lz5eh#{V<9&9_ikbXZ{JnU~4u}aMgnLk3yi#G)1+Byt?yGTe2-c%tcG0|_yiULc zbWMVWQHdOWJ@kkw3uDW)Y0Cy~h&omz$BeK;N-`$iDwMe1>~i}{64Kf!2-j}3n*Nns zMF3J1=#Dqacq-gvZxz962U%ivbmkEa=ofgUCktO*Zl`_D^LrxoD@kD3*Vv68o9q8s zafb??cw8h&FNLD({#{Wo2hZhs9Ymocq|pU*Eq=K<5&aiyau#hqNiesG&0Wc6KW8mv zEKi2is7>USGW%oi2v1?5n)&JX9>U-JurBK^*)8yjy0)xoAQS5B;!-J8PsCeK12t8r z!y#2)UF>u;D<3~^8evtD**`hjN&6}Vxw5`+7ZR^cL2<9~ld20p%;t95 zBT^Ew45PD-Cp1a2gs;rz$*7z4uibhGzoNd3&sU>H3HsEJRICvH+u}h8_e+pw->sPf zia)fo6nB#=7%$r++NWF_mh%)jfMbkM|EuyP*|ZZ2b1W5$J-g-3%IxNh2{|Nf1&XJZ z%}YpXFU}JZ`II(|Dv!rQT1g#wj>P`ds3q~ zdspEKBn@Znp{;}C-NSF2qN!*uE`KeO6!fd{Bj)>`b(dZYvis|HVBt)c-4Q7XJIGtQ@3Uw}Tpkp;GjbW+5_k||dd@#w zJME;`V@cgQX8ngfVD9>(7F}|m#w<2Glht#6*d%CPh zTRx~xrxHBgGdxyY(o%%K9@{ft4Fb+3ollI-dd2(}2H~R_&IG4^j$3e*3Ss4t9KMYI zIi$tnagtu@Q0!d>-IcGXr$wj6u$uOtyA+G4K#Ft@q~0R$zU{%5u4@n`lX_{E8kV%6OI!Sq$WZxXW{WbY-v#1w#_4i; zXcH^vQHSaU(R)bVEdBCS#dkcPOF~d|eAc6XAWMU=R*jcoQM_$=-KBy!+xOtrh5x05C_9f`;FKm#Z(Y|`C`Jw(_ zj;vpEp!>GX13$Q!p>dC{34OhPg)8F2!^W2%BQMQ158sLMIQ~~4S>qnniX$I%&M$BJ zQvL-xu~ zhc-y>&__X+P500LW&seY6$G!;Onq=56)V#%50;d6+GU%2@i3nsD7%03U!0v^1%5cF zPTwneymj90gBvY_?r?~cPZETmzP&%}^2Nb@NSZ%II$hXBUrhlH@S@dC2kr>72xV;r zob1+i^I9aq>+wN22#BA$2jWE*57m-dwoR)pzOc}k!db5wPeO0AgXxEOiOr=eTp_^n zZpnlseNQR)Ye20~A1H6(Gp$^%Ic(`rc051oPanm9y)LMues$e=tZsjRso+t7?|Y*Q z5OsE@5{?9YFLPNRv}X`XF0QcNhqKIn%TdPZuu~ZG;?_oi?t4e zV$)hJo1U3va;qep9#FuKy!x)6Qn2TgZ8GH)pW;4Lfqr-T)GFvUT2tn+{Okh^zD1?{-cN`tzTW> zAlTWwmGEY;L;fPySBX}@KCnhE*OXDsg&u}71X^MA-*xL{91r%NPoRREpY87E#DFBc z?!#p8?9qRD)I1=_Ie`g6N8CpKMnZ%t=)duHaMg{#HEqrrrizQFOII8!#BxkltD#Jt zKAIfJK-Z@qsh3hYQp|RZO&tTA-RT`$i6%iN&dKdx>rloRXvc$6Y&t)5@jg6kB)8H=dCdBJFf4_k0Tg)7p zhbI4~se9N}4cyF**gtRwNr_CtNqoMnjc2~`pTzx+SHwoSH@rFh@Sk^cinl=MmrA%# zmB$g@>Tv_8a?KK*k_NZ(xXTB3^Q@)pGzHVwbD_v#<3^Fv(0IT1J4})r2?@0~75owI zpG|%^YT4fp&Ve8uW1Bk%#B{TuV|P(DPPW)n?r#P^LYBp(ASV25>$Lc5+!Ndxj_BA{ ziSn+Sgaj^wB5M9|nsIGS9SUI+qq}(HtD!vGAN$>1@HZf={)i&2hVr&98RoVIj^g~7 z#N#$ci=E_&S%d-v0>W&b4(t0r8lfJs*!;>Vjy7`z}$%^rB>GJ>eWk4{a+^ z_hxJUP0SM=p0FsrDQFiZl;zwY22{c%GK8ozfA|#iwiGKwTAxkWMVtO2cK7kY9ffyH zcj%Xg57&O@9Gi_&kMO$|X{NfeLXwMWRqAZ$M+tg16$hNnhcw^>q}Ft|L8>ZbuXo#R zzVQtA9mdb)rMTejXV*v&r8px^!CP?8soHOeA1Ed!_o680>|&Spwddr=v9H%=_j6h<=Ss=M`cYmuSDd~_dEb}3$7ADF6 z^|}Uo)Cz&*uRfmBTr#8+kCV*8&sBZMpkqyZgI9pz>10i|kR!TIiD6#$CPZCIeUp^P zC1USDSh?hMcxyM$TV~SjbMn$#(&^8fF|7)w{{vzb&2O?KnoqYzLSe!#b{Egzw10e! z^>7t^x|-IUwX5CqFCr|cga*;K4pryrL-_Ku{9JV6lRqsxafBlEEsjz;(?_+kcz8H**7K+49H69Eak*$mEZBht%SOyD2S({x`+( zN=vl%Hk|vl%;86ozTU)RywwXXmr;1A@IX9wqyFVqvXA|hQF8sG<-id^66x!BU5QkvP)Mg1_Tu= zpFrZbKS7Z-W9m+JBd+Qbmmm|#)OKr!jVrz%&AS^GlIv>L<8x*cr*&u{xf3^=ztj*f z1=WeI;y~jYG2%-}eBVw9KE%|U66NtbT#uPWQ^VTSPl5sab-`>jmKAGk`_p3QBFj+bby*HqEU5Y89_R0vqhjuN&WLDbpB@kUNt#%Er(p82dZwglGrM?Rs)>S7%im$#wRIZst zhLQ>F(M7NCFMr?Wm;2rz@Bg}|X8zdjnurPU_=`0)d>QKj5^cO4zCItxD|yxM=_Od( zlFwCOZgyok{cQOaTvxy)T>aV+jCR!JVY5uFOz&h}%IX)AOUT?MKgB&{j#K$l3~k1= zp|3;qr}LZL^VR~TH!}r8UCGikm9icCXiJzO4oZeL9pVxuE)zJO8x$N$_|a-+=KXgm zH|Xa7J^y{wZ|(ar(=K=&FBVe_C4*Dkw+;-Xuy|z#{%T*bX8eXNrEg!I+^2x7^tO~P z_d?#!x$NUm4$;ITaLUP@rNp17gn6rIAJ^N_B8JzjYXZ!@(fM~NoR7N}PBC8koTWd~ zbVNEdkK-HWsV0V_S_9++gC@W=3k_=_dc%rNl0lBw7w?UL)lq)m|28<@z4gJeSJGT+ zQ|TcS4!x!NF3{Ulkrcs~4j(ZlF-h`$h_8u!`ILMYLfi(+-WCP&UzR>1!6$^#d_7^W zZ@=}tomh`lD7aT9W3?)62C9y9|2UHShTG1b9K|HM)wZqq*+%U`*eX3lt0Z2<(11J_ z!jCh!QXqQIAHjO3F!lHM(cIMgUp+2J8-M3}=>&P`L{p&oVmuax3^fkPBPuo8L0{dn zRU~jx-lV%%B_v(+O_VrS@s=D7aByB7A$5@v3mNxpyI+)1&$h|@Xlkf zx_Rm=M{=o>CyJP_v{wF^-Ruf)P2k%}Jz-l11qN{`hgEwI4m{V*XW@ZQ1{Sc``&I#5 z4DT>fq1Sqhg7*=**9#A*t}ACaI=%D5@`Qm;KhriJymwr3#*U|1|4w|G`;OyCUg%T$ ziyhZ@0Q~Y%@gY0UB-yvNw{xJriTKTM)tQ$jwLp=MWoggGMl8AVhri*D5<6wGS}}&Rk5k`DcL4k*pbWxz5>`5Z1%%mSvezrb`!|#!9hQVC^V0D`Ge&6kXH@qs!ITw=+>X@4X zd?DJGx)Wx6J$T%bR>6%OcWfjZ^dlrFzO-QOgS7DD0a@$i7rp^?Ze1+XzsK8}Hk@-- zTIN(CgH%o;oZa`76S$>DQKJj)^G>^39(y-$gwiF-2U9%~Pk-7HSRd^q{+A== zW(+iLh{j0qB1Tex@4|v?RSV^vKP$H&_%%L98#W_yq(k>4JcszRVdB9D8lh3#9aWcc z35x3;0~p0_01;qBwRzxY<&|R3WO4qL&sl|MPPlUfWabw}%CyL(Sg}`Uey_ZxV`=b7qu-hifG^8Q$1lXZ z+Rc%YV9;G2+KFtEz+a6W9-s-ks{2S|tl&Z^lpIO+@dV0-S11`*>Q0VTP^`krt3ASq zIYI?w^NoW;1*kf%8~WGEfpmJ+>E9mbLC;D(hcIow9loRUIm1iCERerc4z4_ll7EPP z_YIrb?h*T<*o#8`3OrqjQ=STD7IuN&W3HAe{Vr^!_LHz97E{;>y1icUR#JC2Ezj@O zTbIM*Lhel~t!swlRiX?b@uZ_aKnQwpF2#{-XUk{)?iI+MYWOe5qRj8RRHDBn7j21J zTaeuE*W-Rd_{X0{eTqccBlXFFI?N|=Fg?v2j-g*hK@bDv@s?Vf0+S12>(JZZ*&xyu zL1cIDvs}7(O=p7tLLsy_m+F3fk|LL*{tTvKPqrAPFOewx*En81_k2cpOjD_-|c-vW$d;bz^n^muo94GVh2 zZH(SOvdBGd)I6`()V6dJ38XrdzJHr`32N$2ksgQU`;h$v8%n3dfc?{%NH-wvi(vi5 zV`Zw>EDqK6dx#%Rb?CwAievt`%S^;)XA6ZNJ-)D+pfOp$^8TonkOy@{KyJy&uyZzE zg6wS_U7axf(e!@s+x2mTaYSma`^CY?Udg|YQ3HWdyyoBf2iyLv4+^m?P<#Y6W*YyX z(=I>9pSJ30jX+0)n8p-_5>Zv|jzfbC&c&5>kH1&tjx#5ZxG1`kzRQAln1S}Go4py^K8n)xH0`5=}B4lnv4bL5$94H zj#rAScjn(rKf00fNCR68)y5BcxspA+ihZJcc*8zMtHq|7q0{bXMBC_G&v)c7%XIGm zLO4{Zeg0`u%jLrgAyI#gsmkBVv@C)m5pwW7+4*lVN41VPcoC^wj$T*SLB=nK4_v>k z9W;#Og2pLz-cxN!b$vQ4wJpV*&J7=C_8u=Zaeb-weBTzY@Qhg2>{-+Oq?y9x7XEUL zxLWmY(0NGdW7t|T1>7U5Rqp~Sg`54$%2z938mcm{2EUrm5~%O)OP?p4-26UL7Z6k& znt&{q5=GV3muZSElD$-^0x?vvRbr=0?j{a*9EO3 z6iTQ@GiWa}a*de=B_LjuQ2zfOG)MyI3jJx@yLwMuV?5v zN4Kt;&m8+%mwD=0uD+0AKVRy)pVWJ@SyWuM;(nhJBDMf^xYMBbuu$&BoY7_tJ{5ybT)iF70{*@mzZ^Ia4m|@O{U;{1qcKddH!SQrR}*ukxgdM|XkUrrj;y{^3iZ<1h}88W4%3$Ke(()2 zWFKVrh|7xTK2g)ANyTdT)`}T9w8puDM)#{zCZi!^NA1RHS{rhE9`nxV1LFhvAOP23 z(qu+d6Rx|w4lZh<((Q$rKrV_pNByN^o(QL%d&|1B|1!WH!Y@9uu{elezBT!&5eU=0 zm8{kHshgGQv)+k0`Yw=dUzUY02F|OO$S>~lN6s7ZeA>x7^eZd>-njMEh+K&{Ch>~K z4I|j^xk1(Glt1rY@+^C9LFyrlq33Iz@#y9|-`(Gp7vDUAO%~cu{`BrYs4$mGzfW@4)e(H)w-k>`L@G$e}p(WvgCl9Jk;4H>UStqcl|KIx9450O?mf|*8Y>! zmS4p`WQ8KqHJ~QliahueFB`TLob^{f6sU6SW`rLsEfq#@8uPxYp-H!|{NZqZqw{D;M zq8bTmyGEno$$Bmy7Q2)D<0mH}1RyxhlH(rSQ=`?ZhOY|uy1je%IcCxC?nv)0k*l4K zk?Ui4y@kgk2q-^T5HG|ZKv%+P#F?Yt7CemOgT_xQ68YRy$YyJI@CX5jB%dCx*;avCH=Gcb>eM*zYzaTc7Ds8|+3$r35V^bS7<_ijSx|9jombiJibDfe8Mz zAl)z+a7#-!gLHSNAPn8zoenv4y@&7bef|PI?Ad4SwXRyX;d8xC>@uOD2Gz^&=vV3H z?fS5z_HHxqoSITRp}kP@&u0t`x7`g*$y08ZY{Wja4=;2i|a z*|4Ms=8snQ%`5DQ&#+|!Il!^QoSHUxgO?);_l-GG#Otv6(fRiB)9l0idx+tkSExyo zcxO8xit)4T>k~ztUORRrsy!!f2SvU|ZC4=s3C`^Jh(lRV5XCO02I#O9)w^r&B@~|p z7H|Gda%|dqHFZV|c|eglr81MNilqm};uDyY2RJvZlR=*<-0N&D`vT{iFjSu(aPN0? z;qsj7ak;~LsmeG#o&oY+hYQnL&_L@} zQJ$cg=K3g5TI{r-4wzq2tlz;Peq?teFQDU;`|kQ1V|=1&!EV4`VM_)s$n@p6p!^RG z{pTKt7}~85P+w=S{(EdY$&6+>oE<|5qAmH94FE>)2rA0{t1k$``M}|PG`!s*oN_JB z@_B?-J&4YX0e%V|PFWcf4W=t`FiZJq7K<~IO87C*H}xg)C^=d0fR_dMU8U`*tY7Ax zs%vN%mp_XWh*9JYs`|A&epMb4c|ZJzX_|qtA(PTV`S=rhW(iCh>G3bqAK>cJlWD8^ z3cl^{jKLcWW*m8 zJ2)nik9J3|O>Pn(rXO^%r9X~0jEZTv65-=gk$si4l}nYCowmu#q_hR%;p*HHy@?3Z zB1sj)l)n}Yuf*39k zBbbAwZT8%)NKM?)wx-V@H1mucP)h+nkj!rTz;mhx!)I+;#B!84<*mYo`9+f_mH-kX zsL1vjMJVz)BZKBQ6VM$}33Yy>8thWI$^<|~TCL*QWL}g=(+r;^of8`nAl65VH(rbl zObf&iA-X?|qaIzaG-x{D_~aBNqaw7bxyDecm%8d%LWjTm{$7~qr7$maI5ys05s#hE z8WBUC&&6(vum}}-kgY#IX>@DnmVjMAzBYgVy{vxImPt1f;ypYF0%u#D~t zJ1{N!kZrT9#ak$tQe%H2K#+N<{3-_V4G`6*CrSw#wNntCtF6ftu=pwJn91|;$qi~7 zl6No%zZ#}_?&uNKKlbd6C!1Hw%Y_ctI^5aRwd-?m%PfXS3Ja;1t1-q@zr-4K@M+ zj(3)$u-ek5rl|XEvoF2=iH78vq~2a_yw>vmsU*kem8eeg^XJutWdL4MKHKl$vfZP^XGjMz^ zs3`qD&%2Ps-i3OPp62y)wEw zc4alwOYblWK{L)s2OF)3{o(y;EmSsK#Mu0Ze#z|*>2yX$*bvp*vADlssL`BACQt+6 z5%H5z`8o62a|q00TMa)oKTWKAc_4;K-$RhW67cX0*le#$Z=4>J$RR738cBxXUB$5~_+qw6U% z>Qb%nCdeaZ{0;-JsrGnz>LN;n0FXQCfBy_DB0Yi>z}naE4bSl)s#Rjc6_;6l2~ft5 za*VH8NwKn5W82`ix?J>ddbs08<5OQQepA9Py*ldtg{u@;$OQ7l{&6GE**MwN8VTQ{Pbi3yNIVAe1bEmh73nl!n4~dTv)i@v2&U)B~!I^4w z`{)H0)|^5Jy-qO%5n*Jbqi~+vTqj{Ksnc!Ow^g(B*uz=Pmcb0JU3gjOmOuvBPYI<8 z7Z^-rLcsAMj|z~tYtp7G&gUhSm6}Ngy*&jLFCA>6z7)i5LoUE3v5MSa@B1nAogY|O zPprUf>|=^ETE_n>gpPYo`dk*+Tv-IHxtM@$C83|&?t(JbpFgP6< zw{XjhU_!Of44V>@s&eAgz^J+f9t%(aO24GsC*!zy9>E=|OS1f!hzH@3DM?Zmtu->D z%Ma&1-#h=|6yTA?G;rERC!Zp8q;wCq5oP?cq4tkOJVAlr|Nie2Gpx5U5sY%gC4F8S z4P=ZjD>dRmuhdtIh!Ka^sfPf|a|3uttB+-3*V-zT3Ku`>a=YpP1ba!(n!*9Ka*P?_o&xw|9w2 zH;dyJ%X^YLHA7!vnzYex2v$rch(f+ueis({J(||>62NWVsds6>gpve@<2*{W8%vyf4Sr^%eM!q3|NyleRDlpYZ!-Bxu9{}o3ET#)` zuigkBA`M;&Z~fVGfA$~wAvciVSQjLmr9^p1lB%#13rNg(cis*TIBgP$fpWi?$x7PD zsZf&l>lz1u>B5kp0_yQev(%VWkE{FL5AB}JU=Ru&yxt8z+8EfYz!q9V$)yo1YVf-A zbBMtlgP%I^ATz-)T@{L##w07`Br$;lp0xzap5~yMDE^0t)MW=BMTL}HQFHc@|42q= zv^6D8P!?|zPG)&krLZr!6DjMamss6mdQum+rbGWYE>U4CI`q_i_82$DN7$~JU#MU3 z0j*aF*KchKj(n`8z_jy%&Y)Ogo#2PfXz5zfI291rRIJd6f3}fw&HMTE zf~tXk<)YhIXwtC5vFokHAAWeLVktRK;|!D9MKL;dr2<%dyIe}pyBwsoQ!wHCE99nI8#ByGwVSMI~(-^ zgM9HYnPKHfFyvX~k;qdCETqj9Rnbo>LFtdCg3du=QMl$ZLsI>RgCxJbSI_tiEyC6S z6Lv!M{b{j`t$I>$HD>5}l&(=i+WrGzY$sU1NV}P4nIZ@-k!fJ1`}GS?xO}4I`k#|! zj5iqjn<8>)POYqa$f)!$1)WIa&ND6bLymKRPn_V5&M2pW3<^M4a%>*b9%(Jw2;}Zr z8Z6)B*R8p=*V&$;3c>16?|RLtE)0FFv2e@gCq}h1A6d6MW0!#IRiLLY4^icm-Pi|A z?~XxUd;+KHGZ59nEZH09XsVST8SyfI3=UJUdNyNS2g{gqxf;UEL z2}gAT7vZqvCQpx)I_gW38LwWpfMS2D!ipn4Zik1#eV@Tr9Y)gaULNb*53lX58g=9aPi6$sx@8)_2;rp#0_$>EG~} zy($KU>U*TBRgqLc-YXAy^WQ8}PinoD;H~lx4Pk!>pElgyTw0YHP%wm*Z!45huIow^ zTk04H@N!G%?)PuqK zpx`#943{$Wf+OV6S0r6wD*=rTBy0l-N6+v-3H|>?&#&}GQRMjt)Xs}O?BNIhD|ws~ zhWEu_EEIl)`pHwzqN>v+MJEVt#`T-B%p^h}fjBTYJu>Q#L;UGrG*|)zqNMFl;xsPe z8oalJjE0VC!)_idv9UtWEwlAo!kv>fv>dlvfgI6HG@Fo_kHXRTbeqk%cP<2}FwuH( zXa#IuY@0Zejp4#-Uv~WTb_~>sZ^1=^^EvfnKf>WjPEXm?%ifF6BL5vM;Yg=HkxnFc zv7|=|`4=B|-XjPxM_pPF6__SoVfv4*^exbpY^Ht6@#Z5MX~I3o^#E-3&nfB^9)5&;bZYlBc;hR8UN5=n(}(riE}V&amvj4bt!s1m}^w8exVA44eQVsdOt9Z zSjZ&y4{DRdgiFl(nB`s$64sl$C*U;BzJ;I{SI5@<6J{Q*rQcWF;+UNTd{Xpp;?7#Z zN(*b^nw8F3RuF|*a1(V&0u`$@s;O5Tq6XLk3tmUNclx6da_guF7>k&oLSXvM(nPJf z=wgQ=L34t|W|}d)>Devc!LmLDCvWyw5~;PMBiU=!rc8Uw)WdlKUn|S%G;8!Zg!lpe zC(mjhd~=&jae}NNWyg5+q6#(h)8NcZvozF~OtxcS>};>p|AY}el3Nvmo~Jrvn<7wc z7lkQ+T2I@Gt*DK`feIYefK6&MQr&U#6;kg3mtj|&6c?M_4)Mz`77ICr>G?%FpO5n!J26)z=tJzw|Nb2E|MH8O*gP*TUe*HatwVwAK_ktF9zLSV% ze8w8`jwYO^ZnoqugE#eU&_^h4t=Ah5Xrd6V*!dUZKliXK)OYV%qv1gR!$_?-pTIP# zL(744C}<&_FTE^fxGbF`z1=6>6F>Vyy8e1n_CANIx90WBrsbC|ds!`R1kPtb5&Nmw_UP?h1;XKu# zj^jj0FA3U%nh9t6Xv6GPaO=U1$^p__zMe0(c{4eMpW~dWLXE0%O0mraEUafuFKvct z=_UZ!nDnIbg-I{*?JBE8ttYsIQum5ep(^qb>7f4pjC1C(LqYRKOf{|;5rmAS}A9K_~8tD#G+eS%2@QT(|y z;Wxz#;5oAX7KaZWw-OX&;pIS7sqbN?otiSW4xb?6+QPQ{5h$J%#T^%(82^K)Z_>OL zPAXx>&0m=^EC!A&5Qe{e4_SR*8A;=LI9=~19$bfhJbz`CAqA}r{Gevfs;-5JVxbMUzKxXqdbeir2U@+r0TXmsS_tR6Ec zkej{TX(+_fv8qj9U|01`yH4mCx4V}6tAcaL(=HVxHwtMs6(4#f8|h$FSHo=w?U8bL zU_BuAVzptq64bzloaIG0gzhNHAsn_3Tw}w%@Slp@sA_>LgY5VEa-_Omxi*1|d^^H~ z!U`_Wc4keJTT@%8X1-I-Xt-5Z99gt@>j*ud`V?C6&79%aXPeUsQv9;DPPzJ4gr2-d zzxy;J7^_jCU!1W|ro;f~<{O%foJ$F_0nh)?#`;~SItVrGb=Mgu9}m4uvI*xuQ-yXs z+%&snRoc3)pFb|@A6f~q^Maplf7SGvmaU|}Xpm^Px(`@hACEcb74U80moR{43MKd! z`#NNs&qyhm-*9K*jukMH0cV<^?KBV*dyqtx07*@+_0jcMco?;D>EtLHqQN9I;K}eD@1W%_}sjgTZ4SBlO!OFT)l0N zgr8Xz0hDBSeIQep1^vg&VVz)!k%CU>Hu5-J`d@>*>K9$I#HXh zP~>8qprHXZz3UR61tPhed;6S+zn>NaMbxb|w4X4nYaCwPoHjQrJhK}N^TDLgId&7z z;Q1YKbD(vnwV4dg*hw{ZgtAlKh*zdwQ@9<3R2EO4bM%EJ;)3*v1-e+E85dDhZOhL@ zO*v+T0aaT#-Z&X2Z|i?{`-Ouv82IzQ8i>DQQr@!(b z!;j<}$=osy5)$T}!2UOsq5f50_(SXcH&+f}_d~h{mr^+iqiy;{K@54K+i4e>79t3m9j`fCk0VGa<%1@BebFL|GS=3{wM)vxin zTNXH^U6OVyv{F3pL!|`@ASWsuL}6n=wj_Y&(IDT1e!13urb298x_uioRUpQ{f%5Os zx|`eX{Ff0PwSIU&thE@~mw619%J4&dov;ceGAqQj&^^FZED;4QuFwFXwN-%+hW++S z56{45BA)E$6bJKtBBVdKOo<>3zS2w-+QIGnLGmN?&ftZ^xjM zXn@iNhgRF#wV0Rdn|CQ2X4dOGKDj$n!+Z~Rexl73i)vTi(@(6GdLpK66WaVf?|N8X z?c6D*osZoeW;fqwgfWht*?&UXtF~T(3xj7^>sLZWTtL}uw!Aj&J18eDfqe9%enR!k z%u=1!mx@x@#+_7}!qgcle=Q-%8zACrU<;y)B`p6eiw2ASod|~6O)*8vf(pee;lqk)|*nraMYo6l{&&h#!gVg+f$7BD?-eIe^N|q)d!opO4VxExJsmGZg5H0N`8%`@>L7&fiY|s ziVw|Gm2=6bi>k~9OfZ>v*qR@k)v{P0eOo?XvS&jY+b{sT=ajjOYh)#xFGVEl3N8B$pim!0E!W!*3O!f`N)*Hzh# zEv|ky7o}*j(c(B8c%{SLFtbKc@%eyv-xDkU_(mlGeWK&^v4YcxCrToz{EB|}Oews8d>BJrPIO?pKsLt~Gz zu(g7@53LQ;N72y5PpYNhJAL@56(mNBHCw-f2L*0$+`v(Gj&Lx3gUly6b#_?tBCpzT zmTzd#oLw}jXRIk}(Bwez5SK`hQ{5jKdYph&^}}n!BTMW9Ho&sU|Lir|$1df}J2WDQ zf1awiiIkCzZs)tp4%Gm6ig%P%YIrD+1ECu!QBvhZks26CRBZWgW{-myMVkZBn#d#8 z`VNf7xy9%ad*EN1QRdwccPBPU1UC zE3@uycq`ZV!7|yRL0RB~eZgmx zVlahynFQv5koKhHL!NWJs~TL*V&0nQukaJW02|fGn&=AJL`&J*NtAdM{HROCr>tIL zl$bJD3elCen#gR#phLcw)V}^mXC3oA`H7a1?g==!pIBIUFX6y+?9wtY+k_}gxC`+B z4m)wlS~m-qsHfG?Jk<*5$a`Va?|Fx3&?76ipN_4wxPdyxvRjQJ9s{;{m!~_{&*{Lz z_hE0`wbAFSjbT^RI^d8tDE)LpNnox5Pa^fSVFMj0XXuUZ`cGzWF%6U@wJ8Y+#|E$c zY3gy_)vjY%24VJwP*6bj(0EPaDk>Q)vCG=+M!`4cfi%#{(+97b9Aq zXUX5RtZD+PVGQa78yNl=(Mj1!yc{ln3E8>b@!x)6zOk&M4-<}fynp58@0fXqq1dITbBYa}8#zk;ly76iZFF(&#J_4&p87%`i zfs`?&_N+~Dn#M#mk~z|>%bU^uhANS>etfMt_J^I zHi;ezg_VJWQIt{=~F)KQ}i zB4=A$w69icI_gNa#t%iu6b9G6h-5V`)imXAh;2ubKym88QxyfRYwE0bkFYkb5rOK% zQ8m#cGd=t1w0vjw839v`T(wKcs->^jbV!Us5g zqtKIF#YKEjUCu3A{H{h0Pzb`m1awFirN9@H9*2X$F1|@UmPZ)Au$GaMic%c~$)Y_b zsc`qPq`&5jW1zsmR{!CmTQ zra7wK#TrRi&`u1KVIU3oa^DloRGyRx_-FW4fC)x%a$D-aGf$7aU%pGlFh7x_XLB`W zJG#!`{9s++g#F8i10lvqVt9Sc)eGh7)OEKQv${TP?g16+NBZ>laYpDz<>eQ{B}r1w zbFn`CU%>Dg0s#;=I#|yth1jq4*>|DM*y44?cLwi94mHxmsIT*H*}xB-$!1@PhrMR7 z8BCO@`=@e1B`UTz?u9dt`*o)|zaoVO`cQdBN*F3C09bxg`I-U6qz&TGHwxlgsHfOG z4Xk?mIEy;6&HwkIC6H55(px;hy;0K`{PbwORp^QHZ09d?P5=X1aNn}}U$o!#qeD&R zaKj)G&V3PS8Miivlgce-c9##o-T;4(mPdtn6#kP=%7i4pEejE@ikB=2aZZk2`uZ2= zk@@Lr;9^CEr@xza>hC4#Msdp(@^?aepw`d+FW2m&4gEGD*$N?v6SdPB?F%Mw4pFK7 z{Jq4XG9-GtJS~p;!)bh5L2g!Ps4r;s@=#TxU z$}5bqT$BoTnt{6HKX>t3a^&9sd%A&b=B~`c;q)+EGd79r$n21id?u+uOx^fwJIyPX zc(W}rzgDo}UQ@u1_O~ih)G%H8YNAL&6BtnnLDurUR~|SB+bhpZGwSyiW7{y)>^)$5 z8sfNAFL5kBIMH-c`7N*#71xv@l0C74d_X8e281MU$4Mm>Zp9$u{_zZ?CULC~YOLrK z`Q4?)?vRbt7Zd&sK^xyIEs`wD)AJK&Y8^ zua~K5&-eDSe$!0+D1NTdme+>YlG>#5;v;O&NF>v!k9nV$ouEu{EPHzzMXV8mt^A3%SKcIk20ID~4@{$eiR~wI z7&JukgU9A4J1>cEYw^*k>EWMn;2bgoW&G~=@-hzoG#LR-;ZvN?1?f1Ib~X|G++01IIsM{M<5mukYy z_j=9}55D}ZA)Dvu6NT=7_OG#$f^Tjd$nfgrsDQ%h0srm^N;8pnE-Lr&qvhK zx>OHu&~-l-qH(yq3T257nD0W@jj}ZlDrkABH^59^x=X!5KQ+Y;cCpz8fkRt4gUs#B z@5=CSn{)U*n1z77bwZsB`;e=GqZ`>k zz9KOX+PO6V_E;0|@8xy&GEz(Wlbzs966KK`q=`YXkhOadIuGz|SOm+3xond*E&9XB z3{_zx#zX>ILY{nNCh{{g?8n;nr1MKdMVb|{M_Fat2FQz_8+Z5))1mq7;DIZvTbF|2 z@=WqPHdLgjUuX{I9-Fg~^|#1b?B|-c!KsOeRSCq!or?TpD&I(a{HZt2Pn%fpFQ4t9 zmlPJ@*!eOqnB!+F0o)d-aQgBDK)xGwOud}7Z5JaE%V?A`@4Ji;tGB z$QKuEXs#ffG+Ynx5gjg93O#F1IQIz{!D80^4mi)uU?Cof>1^fYeHs_Ar{L24zXNV* za&IFRa0(W5arL8VS`zGkXVLd$%!d?YS841T>`(8~!RADUH0c{jqt?`QHhEm+ft>Bp z6$(gb!g0N`A#OV_gQa7{HR5P{yvJSfa06q8rMFa5BAq<>n5LY#!^E|jlFlZz$;rv1 zB*an|3t3A1Y~)-R7g1)dvHkrz@}yvGaSX_5B|<82RiP%8<7_umXtr+-tcVAh%GjY0tvC|T+(yCa`M7y2+H)R<_7rrQ) zscD3=M~H9u5T=0X3dD#9vP>-z8oSaW#h^GB^^bU*6`kSE!oFd9iC{D)5culI=5il0 z2u3gPxy&fv^<}9A8*xql(y|4c@kYIkjCXJARIW=y)nT8z6)r{iB!uC6@#^-^TZgAS|s?7{P~{gSvx)mQ+=OPg;tSQCo^4Su7H4L z504u*vW!VEMYh_uSz{tpVM3#)I21f*U70Xe)DK{jmLAEABe=BwJRykX8@Jbi%R>FQ z!{H=WA<;e3eGLi3>Y;~Zo*5QLC|B*U;KysygC_26)1`eX9o8v(6NB|Sjpk!tubXdAZ|9GDzk#j5VQ>u_j5QyA8)z^Oc~vAVkJvArr0 zlNv%jlnHf6X^HaRI!-zo8KUyM_-mMv(v}}KZlijD^XhUFz9iHFXBTT@Cv|`2vzc-j zM*Rl|rjpi7yk*lR=rNN=Qlr*RT)<+Qz|8f(B3?vG$*I5Dq3n%s5jaubD8bTpXJLN* zd-MIhV)s6)x)QDCi!l%oa|9wo|NNSL(3``zK$QDgIczx1OJTVpPT;vUGWZ&Co&Mcd z;dR*E7r@V}UmRg_f0AECuHS*B=I!M__V?4|e`+6zfIbS^*HMWrbf-a4=Un#y=f**L z`Il4QG%NIKciqF6|A=@XF6R9IEyQg6d9>m>YA-KjiG_?P8fE)ogQQ?smysU0VtRlleH9}pOZ0v?&c#s3wVSXLJ38|ePkvW?P7^QmWZY@0)51x~UhgJ0|$OE4a00Pc@` z*-9RllCAhj{DxB;^z0axyl75hpoH-1JG#ZW+y~9Ry(q7?mykhS8e9yyE+_XetKd}Nle+nS8?qB zLAp;`T*wp{2v=}j0z-9_vqBD(2`)SAt~yAPF7CoQ>?sPNz4Ca1@Gk>5;S78AC#u|9DBXLA+9~ngtlOam=wU70jZ+ zriX7)uVZjtQ%g9h2%U)!X+xob)U<-+SQOG-w{IglL+ww z%_?!;MfUiTSBf6_`GVng#rNN~LQpxFDUvE){xOXDNZB)3t6!i>EVML<#q`sq9bo3koiZf5E=0()Gd`U;_aePpQmji33;>u)R z?DUyLy?)$(OpKnQLQg()tBTaV(58}995)F5U|dm-T1Bt?`O>Ixe8Rioael|ZkOWF|4*1N?Q9TWc043fFkB4QmU2bm^~v7i{+=DSU{ zK;#c*d<68Pk@okzDf`HuiFp0r(XrQq2WXGkJNV3gVvjv@WjQ`*J0afQVKL)ZLIBuu zZ7j?E51VnteFw6IbNk#1(u|;#OTkb!Aw=ZQ2DA?>T5T`Pn{%J<9Op=a3Qs zv#NF*c2v+evf8Akw~x7`F%<7&UOvOSG{T0#p$V+L*TWYZ+BT#&?hb}A`5SoD<&N|Q zMG(aHX2Ty1zhN+@-H7IW41XR*T$M|C;pU`z&$j7&J@jN0P#u_12R2TWnOMEr&gYJ@ ziq(TIQ3Uzs(eGFR=+TFaLA^Ycujcg4+A&F<9*8XK(NGA|X_Cr=G{;&F+vFn9ZJ}7Y zanRP(9S%ar#|MU3%Phe2Ba^xILoF&W?&f$$)FD}Y^Li^Cy*}m|UEo2P<5T9&m%WX0 zX*nqkqdhaLmw#GSiQ9RqMjvGQdgg{+q1;3iq6%r#yA6RLt(&bU^tfCjC6quQO=(0U z{VQ%2E`qE;gNOGZs>zMUa&un@ieU^mM5Exd8VVFeuJ3MjXrf!`VjV9u^Wl&*hvMADc)?kqej3e(Bz40=O%%QKkab!>vnsn7K(%q2(?Wi^u$c2mf4?+nQ zgqBFB*3O6ac@R4(S$BW1l{CcsrravKz24osDY6SYlqdbAE3=rZvF#CvWrH7xx8wUC z>()34B9GQ^lL|)rLXW+FtCv+e68f2*Wv{6;jaJX(`#IrNMJXtp_ZOXZOu?<#TJqp? zdx|~ie>#c9%vIf{?x`jj{*mP8D#5D#UcboRzb2=o$O%?3YCcr-2m%-{+byw+(@7uolz|tS? zIm|XuljAy`-oqq`_rr&pO3>un{sSj}(@}ye1Yd@Z!g%Xgf$7s5m7%dsvno%6=H;1F z@(>$02DQ-R+a^rum+@cdI;!NhbpXaUKTLR+=A2(%zx;ywb~Eh8oPqONVoOe??rRp; zBAbf4{AuVd*x^e|VHaBC;dEZQ2_`vy$urn#>T!YlSk+kGxPjPsJ>|Q-Piwlq#D{C$ zFo4$u2lV>ZLd7^QK!ur>H>Y|+p(jFKE&<;=X_XmFQo0f24tl-^#3zB?HsUTa3a%x{ zi&`S#EUKeY2SGYYT%Nip?w;T9S~hL%4sQ z5tmwi@y%$dn+X{%y%nK0j;3PqC5B*-D$DD$v- zkYmH}vlQbgRWvipDfQ-4ZJTqir&efoJY6ISUzOM(GjJyEYdfDr3`f`n$F{J1bJTzg z-kD}`Cw}e{+ir<(Y}|B-i$u-uJg#Kw^X{FXVU*fx6CD3_OgX$C4+ub>4oA(7u&v!i z&2kZXKkpLuoE}Mee2hUWup^J}wy98FuM0Gv6Lp$h<}g#$Ea91IfI+sQ=+BHn-`;Me zYu?Ox>=ZW5twzf%!fBMOn~M^a9#;?;WPq6e<6LwFIR^wWOtpxUn&-~BTkGcFfzD~( z|G|ZU4+m9?EZ?*Bxx*b#?>0Z3#t(RXcCf{PHF}ChvpH|y+tN${$3N_}ah!EJ-?g6P zxm?rxBQ)H+;nW>rVxA8_io-Ed2dl;pEdEQek71_xj}L%C|E*5#?pPqaBhcrqKL`z; z(W2^GLgu1^sWk%4_wWz)>qQ;U9s*;f%~7cxPa8=`;ZJtBS+02ozcew`_!5~W>f)Y2 zxVkMQz$B{#6$K*|Y_D50PN4guh*eEY8D|K;D0;O8Qw54RgQu?Kvu~D8X}2GJ=l6w6 z%zO)^IRs24Uf#7AUFs;m^jS{q`K`GeT9#r8l~JFKz6JA4TCl=VL{?3AFVoGEdp+o8-O?DoaUbE)U? zsZ$n|n)4DGzIsAfDsAFpR8I}INK%H+z4aX%Z%3TX2YD#JIC)@a^Ec2MI#jaDCw@A6 z6{aslgb2j@BXnqedd%B$5LUev$F>*#` zgw7MG(2!R9v;l0*SCc&|4rH4dUPKI7FauV3z2SkV4o3D%c2j~q0>n0zSHW!n=+n}X zDX4Gatpc5t<2bNrh6xkz;%A^t-~#eAX02|gXh!VtSJ*5b!4(FN>9|NsSd&|6q0#2$ zw4Qf`J}PV6nW0#y?N}btoTxuvrFZiX2$|9=u&dqy5v;D1Z1Co;Z|$t+n$}ROu6(Mi z`h<^&p?Zv?a{;KjFHY9{5(r~$oi^=SI|UbTG$}ZoAFk~-VL;02=vyj4_2hh%2QEK%iQnM1>Veo!$J!OhollK=Z((@7t+jW?^Rk2CNNnZ{ zjYR)AFXRFCE57yi^4f~*1ZW%MYc96NK3eHehIP>eoj!Cs4vOoa z+7PsD2dRdYyTq2TVr4UqUyTyc1jIk5;~h$taZ(dVDdqGtfv=GjQ>s0%gDu2wWE#jhmwruxC6{Q4R}kva6}o>nU4nHDz3IE<@F$Xl!fJ z>g@zppo_HqRbnZJXKeWX)PS+kV(aBuWoZam41g@q7(btuw?-&BWKQFGo0c?YxE+QJ zWrM?2T&3IDnPcYwJ@W9&(?zP`Qe{EPA5Pu_{}OZg_rgI7w6Bp*=@&5M@2;W64K(*W z9a{I#w!JQ7tdCDGtz~(kSf$w${DY z-*#UPi=s>OF_nNSwJz?`|0b|pTr5`Ztbw7i2;g}bQ6?3bFS}(?5dmt{%U0b$%Tl#p zsh7?3z@iVH)ICR0D?+vpKmqwcsaJlT@ZaC9hRAI^EJ+RD>NyuZ8Qo>bG>iBjnyMv! zpClUqr;P|P=<|s|D6ve8P9B>D$l3YuDt1~}Au9Idk0uax(mwf_9Q7lOc|Qpo4&?AB z?16F9jd>MIYbz~0b3@9e62U_qt=eJ#%6W7H9)=T#wUmd%`TUdDi*TNZ?T2AT>(DC_ z70(hquIAiRL|koU!c~^Qn9k^wY+DTNjUY+(xN|2w*Q^N-11=ELc`=iBj(>&OVFAC^ zswI#^dw=^Z4y4q`$13QVz-UxfK)&rOxlG5PC$7hnw=kc|`$J(~T z3~`N^M{N^c3ajQoPGxm(w0FcxY6ImpG?;_IrtGmo2T?XhxT z>f7fnnw^Nv%RA8Hj+c|a+MIT0vP>Abf!2F2TMacfg#~&Z41G~iC(juo zKQusI9Wb}3wx({OtfMru@vsc^2eifgQgM|#LbdCg**GrK+(Qhe1g6Xah93fj_BbiZ zI0g0M)YjFn3>a+W1R;ZW@`|}3hp}6RnS=R(si87{_G&z)T-c_z1k6<)g-OIsn-DPZk653VWWOk}AO zRyyA1>>f~A@ZvH~l3_cbh51iUIOlPE*<_BAoI-6aj9NYs{+#5%!rlV9cqRjA=8D-` zCB+L@Wyrl|pg%sd2$!#0oC@?C{!FoO@9M}0<6dym@YLZ_-!)JTov3H+(U znc~zxN&IlH*rPKH$VAnCsP zmrq%S+1*xvrq`Qz1-J4P)OPTdjmgOV=c~y^KZ2p58d?P{GL>&Bh|l-AIDt-97Moyy zuv0~uQ%g^43YkCm2PE99FNL9uvX7duzOS4_7$PkNX03D7hI50O$*AQ4)u!8{gD_t& zxhmGwj-!wcrG5(a;Kujssu7e|j{8M_UXSAm`jVOC{xVwOF}SM$e{9z1t8TZ*##Uet zY+lGpUw-N}{B5vQ`sBllLV_z!>pqz@P6fzdgil9X?-wAgTeyroDebSz!g1-9BUhHynw<7F%1(fQ!Tu!$M&Q{(Vhm4KHIMj{vX=YvvjjW{+E>BYQgE4f`n>``|q9`P(yCVc9&SbFt+BsjZ>jv}hVAkHzz&T@IuW3#1B!%u4-F#hbIpx;- zpl$Tt>S%8z(72tKe_{aS(p5MxYN9;470G8psj=$w~g}LZs zW5(Y@r)hI#77eOj5bSsvu!vli{?@!i78Bv95)^c73OyU-4;i|6^nJNisN@l_rvIqt z^<(Kl7U!E!o@sbF)}AMq+CHV++i{6AJi6nMk#_U!?~RN1xHiXM*!f=0oU-=fBS5lp zAgQ%U;ZmU)qfoza)weKv7d7}U(Y(T{v41-bPr#Z%e*xDd-+fg?-LCO?e5^D2g)BBq zgU`9n39JNjbpxD2t~6WkqWYdQ{gGn07~Bn-N)jZC*u`0&gsuLzc+SxXBfaLyc)*x& zA8~>2RY=OH6UO@rI2#m9t}9XX zS(TiJmxafOf;}|DxcN&d_sW{Nc&>3pf`1NAVq%+;)nH!9ub)e@fJPRoC3HY8uC1 z)O`4|*@59NpU&2m3|;wdT=pI{7*3QIsjcF@t#LYKdCeR?eDZC3_hFdZ_jd_S(PB54 zY>CDZGtP2aFfQPWg~3|4z>kzY$lMd4n|a@x^|HoTwazE$_e#u3$sIsteB7KnTdN_@ z^}F`|lH6D6H}Zx!+Uk%(%BKAvbXI7={@R-DSKGA&u4G_Oe%Mepv>YajF-fGeW>zGy z@cR7vLLG|+zvxs`Jms%L169{d&_n7zOyE4$0T06(h=1_j0i+cdcrD=zksapzw(hd z_nWJ8Hl0*!-TpNjBKH#N2X4j;+{g$k39-)FxxO^Wl*!4541oo0!veifPxw|$=mu`C zO}RR?`9`>1aH?}&4Va3Uh*ZL`OVsLIQ5=Phs@Kq+;Zqv?HYx zWXl4TwgD#Uw8`o>cOMqrIjH>_onyH0PwauafV%3-!?d2k*yf9HiSZoqKR!dTpOrw} z*=2{$Ni8U&&OM3w1ty&KY@R=NSo#!?`&a+R(c)WXCYEAasm?3RP3#@yaVZ0K1YEP? zqXW1hN33p(C8IChAAXltl6Z@{$0oUv#w%r?g3#ZSst9Hlqx=S%;3iOs1?jaQ#en-Y z6o>3`6)p&#>0NIn+UXgL7xM9tN?ztc{{{VTJNpsdk97G10mY4sVDxFTVo#+6AIiit z<5VLX^+ips4p1CGOLo%&n32>Qr_(>>E?3u*bnEk#JWq>wP9YHLBqLF-^=Xv@eO+@7 zVsmzkR>$Sz_0k5xrrLhEQvgXh9jg#HqjtW#{6v&=M9VDpP%vaofpie0ie!wgL|k{1 z?9#QcbXc5Qo3?JCeb4cEfxM4)hUMNktKY(egg?*q6C=cL&j%5aC>XYJwAHJiP30{&;A z?P4HGiI(jUg$c#pZQ3)abBWA`csQ4e{pXoJ(+QJL5ez>49U-~ajRbg z2lOtC0No)4KZqnZv0sH{Rk}N-YE=+96r5(0Uz3pSZ!}L}PEw<fkT5K5^gb+<9&Y-B{SVTTwfVMgQ zOAfv(_B_Ujfsu>J5dpv(b+$uW>|p2FaE0KXK(;Jy|Gx(oe#x7V0P!x-_x<|6NVDo# zacBlIOw+GxNRA~CsLITO3yO#_)$!z&5&5+(SWi0)+w+}_fET)lF(33mxlL-r+{y!x zlX|`GJDA%Mgz5d-c{erh)-XmOZ6v_`N`9uGn7OZD!C43BdMsEqGr!o#la{lk8quQX zk)l&Rf-tD{$j7xU8#K)BBh8x%K(xHX1NsV9kW?K!*rdRww4%mXyr!yAAh*kBKr16k z`Y6BGj=;RC2$iJZulCCT@{4!az)bYK9Vd+}?LylJ2Ye-xfHHve=zBcJCYr1>eq62M z#$^mC>I?S-eVDC}C1qf45Kuyr#cgL_mFx#}DHmNA_~bV!itah()1k;M&P{6|cvGEy7~c87Chx@`&DaxIvrcR&feH9yogJ{~@}urH1x zj|5ukthvmM1$@w4*#5f(e!Lffo3(+PDbeX7%{My0++kf1fDyQ}9v3PX72Znpc29jj z1^oSTQ?Gdf4^s6&XfB=_xPDEwNw`%J_1~4Y@-pKZ&_NK~m{^Je>C(1XX7 zV1}-H;!&eR|K)di_%zu9bGTv3U7xAA=Cu%H_yb_w-e_2?#>XW_er0lwqFoe(K+=F% z0c;;WtTdgNFL!T4+@UV z7qq0BkfsHx&hQCDOGf0G8B%CW7GWdSZEQ5YzJ~t{bdL_@j;E(%SD-=1vbg=T8Sx9z zP#?Ynl4jQ)kMPK=&~joNV%wdryhz$em9nVfD+Vy1HCv1~fM}iMExfdYn>(J%p6_o# z6k`Wv&y)D9f3Y%{#breUzzb>bx3_CqmK2OKAgEeL~P5hmkdei7yJ;oEf?rjD* z-err8g|T+_%S%S!G*#3tDxHVO#wUp6)XwRFl4eS4at{hrH~}AzV8bb3CJx!jBi${N^(>ohb+WLRU1l#ujjSZv3mlCGX zlYMVemQ5ahDqvo03_Q{G7)5TMn8QaM)qQmw@D>NPc2Psh0zAJUReXLF2KniB34e8o z$~Ooal2TEN169g18PU%bQuXjr0wj6>O_PI>da5jI3h1#OO*Vaz^{}X zG}H`M&+EH`_fk^^dKRB3)te?M`Y#y%KDG6B_bBR6j+ z5N7HS=YL%~?}uPi6L_L6^YI8MYMOYoFYx^fzITTRCSrATLfi3THA;Bn| z9b&=wkfdq#wY059zN0cU0O)2-mcS9Fw>;|wfy;J*sISbtW}=B2*wLLYq#ZJ8I#YsX zYT@@l3tx!2n2o~$CojPqF790Yw_454ApnNC!cN?Vx-ML$1sytT$BQ-q3=ql@maeM5 zl@NeZtEvzZ-(%QU>i^H_X|qykt`y_*;5{vnjRWxVYiPg53SWQZ(b<41Hby* zvbjK|>t$51imDO6k{co?Zx1o*Q)}P~&4Q^6hspD1BARQJInda>%}D70t) z{sf;q`^HC5Aze^ZS-|j}?>ueJyF>#8I9_~_VwV2^dfTA?yU;OF_n$0g4K0L0YWCC66v8stQL%Bs=g|!9y^V6=ROans&*ewxvMK zv2?u|=I}NKu;?YFQqtYv3UC=SC?O|gZhAx#Lz#aBwwecxfZxory;!6M^>^K)Q-}HH z;Qjkx#jC#U)333Zw~J>9CE1Jf#x~zK5!JE{PTWhgV464pnf@b@q9arw3V0PEtWk18 zZ)!&mU+sMkwULWL+bg{G(3u-BFe_lvT+qf$d~OSjAqK8>Hyu?ss=92G`V$s0VIrwj zwt=)~0N`^sbI!T-D(dv^Gtl?)17O@EO|!&uAe;qmx)ms0ym;r=zap$54d6C>cCfTt z%50$Le&KRz5+_Q~2mtT3HqBJ5IeEb(q_O-GNb55s)tsdxTzYQCM5*m~4V+^!O;VT3 zl$4d9W!zVO9ll0BrS1*vJCBYrXU3l|Gxk%ky?~9FK_Yge3(U4LHnR}|G%;rZ`C?HtT8d;zV+n$gtF@dv4(hN3j>DuHkZ z+Swj}JhZ_I7}Vy(NZ~cN8Bmg}AEqRNas672t{I=guUxsJS5&vns>4Regtu;n*wJ=W zDy;9Wf^K$ijvup;sJk?X{UUwgqoMseVlsNC(oVp5=B@j&G@4s;f7^)+(3;&3zslw5 zO>&w?xKAP2GV3$3e;~8t?wEk$OGc1yv50ZKi7(|R(8$e!`Srk#eJjqM$33Q!N8~S5 zoPHz<<6>DDjWSVKQ`N9!BNXWUp!BSxX9sfx(pw}-zEjm7%zHH>uH`%FcUKmYCCsHW zrd?JP?tXVk2Ev&7g;i)BhHd_-#RQ}$>9lLp(Xk2iXRrgNGu&uwkRK`^53)P~@4Xc+ zVwYLR)B`5#s1OD7$tmqiD?~lP+?Q_S6nI(NSDE#*On@1*1n$`H{|q%Q$~9f~9P}~Z zA@FG{VQabb=qkPoI4$NQyFCYeHDA^~ik255Ak#U}sD5puIsI6@Z)z7WLERmb;l1M! zbejdn-FG5fN+azfqpCg_*ms>8CqwAPrL5{Z_LF&R=uz~JX>EfwL^^XL#{N}pW-|Z0 zsN0kna8gD%ZcAse!14+JwR=}1vlvKsR=fm|S!n)f5z{l$phZb(-+c>Hd28kK>OF5W zo|gJi`c}`_pD!4~?@2)y`Wx9IVj$JvunOayiA`FC5t`(K{)|qk*WC!(ynd8I4^HKQ zU>GsB{;A4K#vC@v0|bDwB?4r@sdijKWnP(Ocrih$eb)?bMt4DZ-U!RW@?bj9T1{_# zJDk_G`TBgb(cwAeh^GHP8dDR$8|#8EFU1JONRBiu8kRe&B5&6##DkH4XH79_s-mYO zj)t>zMP#aAdkq2*FH{_#r8pPgGbs47LJwSK^fAAJ))iPczPW)$xUZtToDqB+@*R|H z^^P84y>;&v6-0$s>?WMUKmFjyixv^)tS_B0dt+QE_cU5BFf2xNU>A6@1Y4NKm`%O> z?vnEWIkBl+vmI*%9zL>5SZG{>z6GDFe$B?q;x@7qCLRTGen}tNdCAp7<%UN(MkVEO zIj=uZ>QADD#Lqga`hIoqQJ)I4CZ3#OYcbFo#jOm%haNo!bqOW$Ds``Z=^7sq_Myp% z47->6D3jh%)c_1a0vE{prH3kFiKSf_+crm|BAfIGle*KiaX=@dGoS?oO9@#SAd2)I zlV>7TBvwxsKqE!7%|g<1&w65^F|?&;h0+(VNrGL>j{aS!M%To0h-8V{52LBmI%>Z9 zkmH4@C2|iAxG@-zthi@7ZjM}&!d-ZK;U&R6PWu;t*=f4m6av65oj7~jew%>SV@*{r z8s1z{(7MvRuCj;T==fBd)|#KZ>vmp7_55`P^tXDEuYNuS@L6SnBRmf#&tWN#V1uP* zKep@>egHV|l9b2#CoSwn5B~(y{l$Fl?m@fh+EQxeL4g~1F9c+RecL1S(*Y{M@NL^T z_BK~R9q*Yco$ovcuVGYYzu+tQy#z@Z*~+J%V9lSfAf2-AwwezIqUm9WNdWG6e?+{AX>DOC|r9KRy(?1}!!{ zyyaI(1&D0i5osgMpy`bzF`-4%KVN$p8w;59FfG(g59D40!m0COJ;bfJN-8~8dv#T# zDtZ^`VG_lJ58{YTekgz?HOtS99*ymZ9c9et-~(e~`GMGkelM1>YK$!;%c2h-vCL*-3m)T$9y}em zNCRA??Q;lCuU07&ZJhx`wWCf1FN=^1ARdL*jaeezsbr8Z==21{-)Q;v+&+~NtPO7X zmGaORyW$#L#vnP{EWg)(E08Atvna&%B$Er%&S>_GRi8?M>sakxi%e)ttcfhzM%4kl zivyv)EW{tro#%py3rIos?lR#hmMkJU_~lhMqcgAN!q^=MfHSez$2%L9tzf

Gdzt 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�T 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\n\n# Pre-lecture materials\n\n### Read ahead\n\n::: callout-note\n## Read ahead\n\n**Before class, you can prepare by reading the following materials:**\n\n1. \n2. \n:::\n\n### Acknowledgements\n\nMaterial for this lecture was borrowed and adopted from\n\n- \n- \n\n# Learning objectives\n\n::: callout-note\n# Learning objectives\n\n**At the end of this lesson you will:**\n\n- Be able to use commonly used control structures including `if`, `while`, `repeat`, and `for`\n- Be able to skip an iteration of a loop using `next`\n- Be able to exit a loop immediately using `break`\n:::\n\n# Control Structures\n\n**Control structures** in R allow you to **control the flow of execution of a series of R expressions**.\n\nBasically, control structures allow you to put some \"logic\" into your R code, rather than just always executing the same R code every time.\n\nControl structures **allow you to respond to inputs or to features of the data** and execute different R expressions accordingly.\n\nCommonly used control structures are\n\n- `if` and `else`: testing a condition and acting on it\n\n- `for`: execute a loop a fixed number of times\n\n- `while`: execute a loop *while* a condition is true\n\n- `repeat`: execute an infinite loop (must `break` out of it to stop)\n\n- `break`: break the execution of a loop\n\n- `next`: skip an interation of a loop\n\n::: callout-tip\n### Pro-tip\n\nMost control structures are not used in interactive sessions, but rather when writing functions or longer expressions.\n\nHowever, these constructs do not have to be used in functions and it's a good idea to become familiar with them before we delve into functions.\n:::\n\n## `if`-`else`\n\nThe `if`-`else` combination is probably the most commonly used control structure in R (or perhaps any language). This structure allows you to test a condition and act on it depending on whether it's true or false.\n\nFor starters, you can just use the `if` statement.\n\n``` r\nif() {\n ## do something\n} \n## Continue with rest of code\n```\n\nThe above code does nothing if the condition is false. If you have an action you want to execute when the condition is false, then you need an `else` clause.\n\n``` r\nif() {\n ## do something\n} \nelse {\n ## do something else\n}\n```\n\nYou can have a series of tests by following the initial `if` with any number of `else if`s.\n\n``` r\nif() {\n ## do something\n} else if() {\n ## do something different\n} else {\n ## do something different\n}\n```\n\nHere is an example of a valid if/else structure.\n\nLet's use the `runif(n, min=0, max=1)` function which draws a random value between a min and max value with the default being between 0 and 1.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- runif(n=1, min=0, max=10) \nx\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 4.495949\n```\n:::\n:::\n\n\nThen, we can write and `if`-`else` statement that tests whethere `x` is greater than 3 or not.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx > 3\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] TRUE\n```\n:::\n:::\n\n\nIf `x` is greater than 3, then the first condition occurs. If `x` is not greater than 3, then the second condition occurs.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nif(x > 3) {\n y <- 10\n } else {\n y <- 0\n }\n```\n:::\n\n\nFinally, we can auto print `y` to see what the value is.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ny\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 10\n```\n:::\n:::\n\n\nThis expression can also be written a different (but equivalent!) way in R.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ny <- if(x > 3) {\n 10\n } else { \n 0\n }\n\ny\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 10\n```\n:::\n:::\n\n\n::: callout-tip\n### Note\n\nNeither way of writing this expression is more correct than the other.\n\nWhich one you use will **depend on your preference** and perhaps those of the team you may be working with.\n:::\n\nOf course, the `else` clause is not necessary. You could have a series of if clauses that always get executed if their respective conditions are true.\n\n``` r\nif() {\n\n}\n\nif() {\n\n}\n```\n\n::: callout-note\n### Question\n\nLet's use the `palmerpenguins` dataset and write a if-else statement that\n\n1. Randomly samples a value from a standard normal distribution (**Hint**: check out the `rnorm(n, mean = 0, sd = 1)` function in base R).\n2. If the value is larger than 0, use `dplyr` functions to keep only the `Chinstrap` penguins.\n3. Otherwise, keep only the `Gentoo` penguins.\n4. Re-run the code 10 times and look at output.\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# try it yourself\n\nlibrary(tidyverse)\nlibrary(palmerpenguins)\npenguins \n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 344 × 8\n species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g\n \n 1 Adelie Torgersen 39.1 18.7 181 3750\n 2 Adelie Torgersen 39.5 17.4 186 3800\n 3 Adelie Torgersen 40.3 18 195 3250\n 4 Adelie Torgersen NA NA NA NA\n 5 Adelie Torgersen 36.7 19.3 193 3450\n 6 Adelie Torgersen 39.3 20.6 190 3650\n 7 Adelie Torgersen 38.9 17.8 181 3625\n 8 Adelie Torgersen 39.2 19.6 195 4675\n 9 Adelie Torgersen 34.1 18.1 193 3475\n10 Adelie Torgersen 42 20.2 190 4250\n# ℹ 334 more rows\n# ℹ 2 more variables: sex , year \n```\n:::\n:::\n\n:::\n\n## `for` Loops\n\n**For loops** are pretty much the only looping construct that you will need in R. While you may occasionally find a need for other types of loops, in my experience doing data analysis, I've found very few situations where a for loop was not sufficient.\n\nIn R, for loops take an iterator variable and assign it successive values from a sequence or vector.\n\nFor loops are most commonly used for **iterating over the elements of an object** (list, vector, etc.)\n\n\n::: {.cell}\n\n```{.r .cell-code}\nfor(i in 1:10) {\n print(i)\n}\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 1\n[1] 2\n[1] 3\n[1] 4\n[1] 5\n[1] 6\n[1] 7\n[1] 8\n[1] 9\n[1] 10\n```\n:::\n:::\n\n\nThis **loop takes the `i` variable** and in **each iteration of the loop** gives it values 1, 2, 3, ..., 10, then **executes the code** within the curly braces, and then the loop exits.\n\nThe following three loops all have the same behavior.\n\n\n::: {.cell}\n\n```{.r .cell-code}\n## define the loop to iterate over\nx <- c(\"a\", \"b\", \"c\", \"d\")\n\n## create for loop\nfor(i in 1:4) {\n ## Print out each element of 'x'\n print(x[i]) \n}\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"a\"\n[1] \"b\"\n[1] \"c\"\n[1] \"d\"\n```\n:::\n:::\n\n\nWe can also print just the iteration value (`i`) itself\n\n\n::: {.cell}\n\n```{.r .cell-code}\n## define the loop to iterate over\nx <- c(\"a\", \"b\", \"c\", \"d\")\n\n## create for loop\nfor(i in 1:4) {\n ## Print out just 'i'\n print(i)\n}\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 1\n[1] 2\n[1] 3\n[1] 4\n```\n:::\n:::\n\n\n### `seq_along()`\n\nThe `seq_along()` function is **commonly used in conjunction with `for` loops** in order to generate an integer sequence based on the length of an object (or `ncol()` of an R object) (in this case, the object `x`).\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"a\" \"b\" \"c\" \"d\"\n```\n:::\n\n```{.r .cell-code}\nseq_along(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 1 2 3 4\n```\n:::\n:::\n\n\nThe `seq_along()` function takes in a vector and then **returns a sequence of integers** that is the same length as the input vector. It doesn't matter what class the vector is.\n\nLet's put `seq_along()` and `for` loops together.\n\n\n::: {.cell}\n\n```{.r .cell-code}\n## Generate a sequence based on length of 'x'\nfor(i in seq_along(x)) { \n print(x[i])\n}\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"a\"\n[1] \"b\"\n[1] \"c\"\n[1] \"d\"\n```\n:::\n:::\n\n\nIt is not necessary to use an index-type variable (i.e. `i`).\n\n\n::: {.cell}\n\n```{.r .cell-code}\nfor(babyshark in x) {\n print(babyshark)\n}\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"a\"\n[1] \"b\"\n[1] \"c\"\n[1] \"d\"\n```\n:::\n:::\n\n::: {.cell}\n\n```{.r .cell-code}\nfor(candyisgreat in x) {\n print(candyisgreat)\n}\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"a\"\n[1] \"b\"\n[1] \"c\"\n[1] \"d\"\n```\n:::\n:::\n\n::: {.cell}\n\n```{.r .cell-code}\nfor(RememberToVote in x) {\n print(RememberToVote)\n}\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"a\"\n[1] \"b\"\n[1] \"c\"\n[1] \"d\"\n```\n:::\n:::\n\n\nYou can use any character index you want (but not with symbols or numbers).\n\n\n::: {.cell}\n\n```{.r .cell-code}\nfor(1999 in x) {\n print(1999)\n}\n```\n\n::: {.cell-output .cell-output-error}\n```\nError: :1:5: unexpected numeric constant\n1: for(1999\n ^\n```\n:::\n:::\n\n\nFor one line loops, the curly braces are not strictly necessary.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nfor(i in 1:4) print(x[i])\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"a\"\n[1] \"b\"\n[1] \"c\"\n[1] \"d\"\n```\n:::\n:::\n\n\nHowever, I like to use curly braces even for one-line loops, because that way if you decide to expand the loop to multiple lines, you won't be burned because you forgot to add curly braces (and you **will** be burned by this).\n\n::: callout-note\n### Question\n\nLet's use the `palmerpenguins` dataset. Here are the tasks:\n\n1. Start a `for` loop\n2. Iterate over the columns of `penguins`\n3. For each column, extract the values of that column (**Hint**: check out the `pull()` function in `dplyr`).\n4. Using a `if`-`else` statement, test whether or not the values in the column are numeric or not (**Hint**: remember the `is.numeric()` function to test if a value is numeric).\n5. If they are numeric, compute the column mean. Otherwise, report a `NA`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# try it yourself\n```\n:::\n\n:::\n\n### Nested `for` loops\n\n`for` loops can be **nested** inside of each other.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- matrix(1:6, nrow = 2, ncol = 3)\nx\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n [,1] [,2] [,3]\n[1,] 1 3 5\n[2,] 2 4 6\n```\n:::\n:::\n\n::: {.cell}\n\n```{.r .cell-code}\nfor(i in seq_len(nrow(x))) {\n for(j in seq_len(ncol(x))) {\n print(x[i, j])\n } \n}\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 1\n[1] 3\n[1] 5\n[1] 2\n[1] 4\n[1] 6\n```\n:::\n:::\n\n\n::: callout-tip\n### Note\n\nThe `j` index goes across the columns. That's why we values 1, 3, etc.\n:::\n\nNested loops are commonly needed for **multidimensional or hierarchical data structures** (e.g. matrices, lists). Be careful with nesting though.\n\nNesting beyond 2 to 3 levels often makes it **difficult to read/understand the code**.\n\nIf you find yourself in need of a large number of nested loops, you may want to **break up the loops by using functions** (discussed later).\n\n## `while` Loops\n\n**`while` loops** begin by **testing a condition**.\n\nIf it is true, then they execute the loop body.\n\nOnce the loop body is executed, the condition is tested again, and so forth, until the condition is false, after which the loop exits.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncount <- 0\nwhile(count < 10) {\n print(count)\n count <- count + 1\n}\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0\n[1] 1\n[1] 2\n[1] 3\n[1] 4\n[1] 5\n[1] 6\n[1] 7\n[1] 8\n[1] 9\n```\n:::\n:::\n\n\n`while` loops can potentially result in infinite loops if not written properly. **Use with care!**\n\nSometimes there will be more than one condition in the test.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nz <- 5\nset.seed(1)\n\nwhile(z >= 3 && z <= 10) {\n coin <- rbinom(1, 1, 0.5)\n \n if(coin == 1) { ## random walk\n z <- z + 1\n } else {\n z <- z - 1\n } \n}\nprint(z)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 2\n```\n:::\n:::\n\n\n::: callout-tip\n### Pro-tip\n\nWhat's the difference between using one `&` or two `&&` ?\n\nIf you use only one `&`, these are vectorized operations, meaning they can **return a vector**, like this:\n\n\n::: {.cell}\n\n```{.r .cell-code}\n-2:2\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] -2 -1 0 1 2\n```\n:::\n\n```{.r .cell-code}\n((-2:2) >= 0) & ((-2:2) <= 0)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] FALSE FALSE TRUE FALSE FALSE\n```\n:::\n:::\n\n\nIf you use two `&&` (as above), then these **conditions are evaluated left to right**. For example, in the above code, if `z` were less than 3, the second test would not have been evaluated.\n\n\n::: {.cell}\n\n```{.r .cell-code}\n(2 >= 0) && (-2 <= 0)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] TRUE\n```\n:::\n\n```{.r .cell-code}\n(-2 >= 0) && (-2 <= 0)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] FALSE\n```\n:::\n:::\n\n:::\n\n## `repeat` Loops\n\n**`repeat` initiates an infinite loop** right from the start. These are **not commonly used** in statistical or data analysis applications, but they do have their uses.\n\n::: callout-tip\n### IMPORTANT (READ THIS AND DON'T FORGET... I'M SERIOUS... YOU WANT TO REMEMBER THIS.. FOR REALZ PLZ REMEMBER THIS)\n\nThe only way to exit a `repeat` loop is to call `break`.\n:::\n\nOne possible paradigm might be in an iterative algorithm where you may be searching for a solution and you do not want to stop until you are close enough to the solution.\n\nIn this kind of situation, you often don't know in advance how many iterations it's going to take to get \"close enough\" to the solution.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx0 <- 1\ntol <- 1e-8\n\nrepeat {\n x1 <- computeEstimate()\n \n if(abs(x1 - x0) < tol) { ## Close enough?\n break\n } else {\n x0 <- x1\n } \n}\n```\n:::\n\n\n::: callout-tip\n### Note\n\nThe above code will not run if the `computeEstimate()` function is not defined (I just made it up for the purposes of this demonstration).\n:::\n\n::: callout-tip\n### Pro-tip\n\nThe loop above is a bit **dangerous** because there is no guarantee it will stop.\n\nYou could get in a situation where the values of `x0` and `x1` oscillate back and forth and never converge.\n\nBetter to set a hard limit on the number of iterations by using a `for` loop and then report whether convergence was achieved or not.\n:::\n\n## `next`, `break`\n\n`next` is used to skip an iteration of a loop.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nfor(i in 1:100) {\n if(i <= 20) {\n ## Skip the first 20 iterations\n next \n }\n ## Do something here\n}\n```\n:::\n\n\n`break` is used to exit a loop immediately, regardless of what iteration the loop may be on.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nfor(i in 1:100) {\n print(i)\n\n if(i > 20) {\n ## Stop loop after 20 iterations\n break \n }\t\t\n}\n```\n:::\n\n\n# Summary\n\n- Control structures like `if`, `while`, and `for` allow you to control the flow of an R program\n- Infinite loops should generally be avoided, even if (you believe) they are theoretically correct.\n- Control structures mentioned here are primarily useful for writing programs; for command-line interactive work, the \"apply\" functions are more useful.\n\n# Post-lecture materials\n\n### Final Questions\n\nHere are some post-lecture questions to help you think about the material discussed.\n\n::: callout-note\n### Questions\n\n1. Write for loops to compute the mean of every column in `mtcars`.\n\n2. Imagine you have a directory full of CSV files that you want to read in. You have their paths in a vector, `files <- dir(\"data/\", pattern = \"\\\\.csv$\", full.names = TRUE)`, and now want to read each one with `read_csv()`. Write the for loop that will load them into a single data frame.\n\n3. What happens if you use `for (nm in names(x))` and `x` has no names? What if only some of the elements are named? What if the names are not unique?\n:::\n\n### Additional Resources\n\n::: callout-tip\n- \n- \n- \n:::\n\n# R session information\n\n\n::: {.cell}\n\n```{.r .cell-code}\noptions(width = 120)\nsessioninfo::session_info()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────\n setting value\n version R version 4.3.1 (2023-06-16)\n os macOS Ventura 13.5\n system aarch64, darwin20\n ui X11\n language (EN)\n collate en_US.UTF-8\n ctype en_US.UTF-8\n tz America/New_York\n date 2023-08-17\n pandoc 3.1.5 @ /opt/homebrew/bin/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────\n package * version date (UTC) lib source\n cli 3.6.1 2023-03-23 [1] CRAN (R 4.3.0)\n colorout 1.2-2 2023-05-06 [1] Github (jalvesaq/colorout@79931fd)\n colorspace 2.1-0 2023-01-23 [1] CRAN (R 4.3.0)\n digest 0.6.33 2023-07-07 [1] CRAN (R 4.3.0)\n dplyr * 1.1.2 2023-04-20 [1] CRAN (R 4.3.0)\n evaluate 0.21 2023-05-05 [1] CRAN (R 4.3.0)\n fansi 1.0.4 2023-01-22 [1] CRAN (R 4.3.0)\n fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.3.0)\n forcats * 1.0.0 2023-01-29 [1] CRAN (R 4.3.0)\n generics 0.1.3 2022-07-05 [1] CRAN (R 4.3.0)\n ggplot2 * 3.4.3 2023-08-14 [1] CRAN (R 4.3.1)\n glue 1.6.2 2022-02-24 [1] CRAN (R 4.3.0)\n gtable 0.3.3 2023-03-21 [1] CRAN (R 4.3.0)\n hms 1.1.3 2023-03-21 [1] CRAN (R 4.3.0)\n htmltools 0.5.6 2023-08-10 [1] CRAN (R 4.3.0)\n htmlwidgets 1.6.2 2023-03-17 [1] CRAN (R 4.3.0)\n jsonlite 1.8.7 2023-06-29 [1] CRAN (R 4.3.0)\n knitr 1.43 2023-05-25 [1] CRAN (R 4.3.0)\n lifecycle 1.0.3 2022-10-07 [1] CRAN (R 4.3.0)\n lubridate * 1.9.2 2023-02-10 [1] CRAN (R 4.3.0)\n magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.3.0)\n munsell 0.5.0 2018-06-12 [1] CRAN (R 4.3.0)\n palmerpenguins * 0.1.1 2022-08-15 [1] CRAN (R 4.3.0)\n pillar 1.9.0 2023-03-22 [1] CRAN (R 4.3.0)\n pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 4.3.0)\n purrr * 1.0.2 2023-08-10 [1] CRAN (R 4.3.0)\n R6 2.5.1 2021-08-19 [1] CRAN (R 4.3.0)\n readr * 2.1.4 2023-02-10 [1] CRAN (R 4.3.0)\n rlang 1.1.1 2023-04-28 [1] CRAN (R 4.3.0)\n rmarkdown 2.24 2023-08-14 [1] CRAN (R 4.3.1)\n rstudioapi 0.15.0 2023-07-07 [1] CRAN (R 4.3.0)\n scales 1.2.1 2022-08-20 [1] CRAN (R 4.3.0)\n sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.3.0)\n stringi 1.7.12 2023-01-11 [1] CRAN (R 4.3.0)\n stringr * 1.5.0 2022-12-02 [1] CRAN (R 4.3.0)\n tibble * 3.2.1 2023-03-20 [1] CRAN (R 4.3.0)\n tidyr * 1.3.0 2023-01-24 [1] CRAN (R 4.3.0)\n tidyselect 1.2.0 2022-10-10 [1] CRAN (R 4.3.0)\n tidyverse * 2.0.0 2023-02-22 [1] CRAN (R 4.3.0)\n timechange 0.2.0 2023-01-11 [1] CRAN (R 4.3.0)\n tzdb 0.4.0 2023-05-12 [1] CRAN (R 4.3.0)\n utf8 1.2.3 2023-01-31 [1] CRAN (R 4.3.0)\n vctrs 0.6.3 2023-06-14 [1] CRAN (R 4.3.0)\n withr 2.5.0 2022-03-03 [1] CRAN (R 4.3.0)\n xfun 0.40 2023-08-09 [1] CRAN (R 4.3.0)\n yaml 2.3.7 2023-01-23 [1] CRAN (R 4.3.0)\n\n [1] /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library\n\n──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n```\n:::\n:::\n", + "markdown": "---\ntitle: \"15 - Control Structures\"\nauthor:\n - name: Leonardo Collado Torres\n url: http://lcolladotor.github.io/\n affiliations:\n - id: libd\n name: Lieber Institute for Brain Development\n url: https://libd.org/\n - id: jhsph\n name: Johns Hopkins Bloomberg School of Public Health Department of Biostatistics\n url: https://publichealth.jhu.edu/departments/biostatistics\ndescription: \"Introduction to control the flow of execution of a series of R expressions\"\ncategories: [module 4, week 4, R, programming]\n---\n\n\n*This lecture, as the rest of the course, is adapted from the version [Stephanie C. Hicks](https://www.stephaniehicks.com/) designed and maintained in 2021 and 2022. Check the recent changes to this file through the [GitHub history](https://github.com/lcolladotor/jhustatcomputing2023/commits/main/posts/15-control-structures/index.qmd).*\n\n\n\n# Pre-lecture materials\n\n### Read ahead\n\n::: callout-note\n## Read ahead\n\n**Before class, you can prepare by reading the following materials:**\n\n1. \n2. \n:::\n\n### Acknowledgements\n\nMaterial for this lecture was borrowed and adopted from\n\n- \n- \n\n# Learning objectives\n\n::: callout-note\n# Learning objectives\n\n**At the end of this lesson you will:**\n\n- Be able to use commonly used control structures including `if`, `while`, `repeat`, and `for`\n- Be able to skip an iteration of a loop using `next`\n- Be able to exit a loop immediately using `break`\n:::\n\n# Control Structures\n\n**Control structures** in R allow you to **control the flow of execution of a series of R expressions**.\n\nBasically, control structures allow you to put some \"logic\" into your R code, rather than just always executing the same R code every time.\n\nControl structures **allow you to respond to inputs or to features of the data** and execute different R expressions accordingly.\n\nCommonly used control structures are\n\n- `if` and `else`: testing a condition and acting on it\n\n- `for`: execute a loop a fixed number of times\n\n- `while`: execute a loop *while* a condition is true\n\n- `repeat`: execute an infinite loop (must `break` out of it to stop)\n\n- `break`: break the execution of a loop\n\n- `next`: skip an interation of a loop\n\n::: callout-tip\n### Pro-tip\n\nMost control structures are not used in interactive sessions, but rather when writing functions or longer expressions.\n\nHowever, these constructs do not have to be used in functions and it's a good idea to become familiar with them before we delve into functions.\n:::\n\n## `if`-`else`\n\nThe `if`-`else` combination is probably the most commonly used control structure in R (or perhaps any language). This structure allows you to test a condition and act on it depending on whether it's true or false.\n\nFor starters, you can just use the `if` statement.\n\n``` r\nif() {\n ## do something\n} \n## Continue with rest of code\n```\n\nThe above code does nothing if the condition is false. If you have an action you want to execute when the condition is false, then you need an `else` clause.\n\n``` r\nif() {\n ## do something\n} \nelse {\n ## do something else\n}\n```\n\nYou can have a series of tests by following the initial `if` with any number of `else if`s.\n\n``` r\nif() {\n ## do something\n} else if() {\n ## do something different\n} else {\n ## do something different\n}\n```\n\nHere is an example of a valid if/else structure.\n\nLet's use the `runif(n, min=0, max=1)` function which draws a random value between a min and max value with the default being between 0 and 1.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- runif(n = 1, min = 0, max = 10)\nx\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 3.521267\n```\n:::\n:::\n\n\nThen, we can write and `if`-`else` statement that tests whethere `x` is greater than 3 or not.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx > 3\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] TRUE\n```\n:::\n:::\n\n\nIf `x` is greater than 3, then the first condition occurs. If `x` is not greater than 3, then the second condition occurs.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nif (x > 3) {\n y <- 10\n} else {\n y <- 0\n}\n```\n:::\n\n\nFinally, we can auto print `y` to see what the value is.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ny\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 10\n```\n:::\n:::\n\n\nThis expression can also be written a different (but equivalent!) way in R.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ny <- if (x > 3) {\n 10\n} else {\n 0\n}\n\ny\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 10\n```\n:::\n:::\n\n\n::: callout-tip\n### Note\n\nNeither way of writing this expression is more correct than the other.\n\nWhich one you use will **depend on your preference** and perhaps those of the team you may be working with.\n:::\n\nOf course, the `else` clause is not necessary. You could have a series of if clauses that always get executed if their respective conditions are true.\n\n``` r\nif() {\n\n}\n\nif() {\n\n}\n```\n\n::: callout-note\n### Question\n\nLet's use the `palmerpenguins` dataset and write a if-else statement that\n\n1. Randomly samples a value from a standard normal distribution (**Hint**: check out the `rnorm(n, mean = 0, sd = 1)` function in base R).\n2. If the value is larger than 0, use `dplyr` functions to keep only the `Chinstrap` penguins.\n3. Otherwise, keep only the `Gentoo` penguins.\n4. Re-run the code 10 times and look at output.\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# try it yourself\n\nlibrary(tidyverse)\nlibrary(palmerpenguins)\npenguins\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n# A tibble: 344 × 8\n species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g\n \n 1 Adelie Torgersen 39.1 18.7 181 3750\n 2 Adelie Torgersen 39.5 17.4 186 3800\n 3 Adelie Torgersen 40.3 18 195 3250\n 4 Adelie Torgersen NA NA NA NA\n 5 Adelie Torgersen 36.7 19.3 193 3450\n 6 Adelie Torgersen 39.3 20.6 190 3650\n 7 Adelie Torgersen 38.9 17.8 181 3625\n 8 Adelie Torgersen 39.2 19.6 195 4675\n 9 Adelie Torgersen 34.1 18.1 193 3475\n10 Adelie Torgersen 42 20.2 190 4250\n# ℹ 334 more rows\n# ℹ 2 more variables: sex , year \n```\n:::\n:::\n\n:::\n\n## `for` Loops\n\n**For loops** are pretty much the only looping construct that you will need in R. While you may occasionally find a need for other types of loops, in my experience doing data analysis, I've found very few situations where a for loop was not sufficient.\n\nIn R, for loops take an iterator variable and assign it successive values from a sequence or vector.\n\nFor loops are most commonly used for **iterating over the elements of an object** (list, vector, etc.)\n\n\n::: {.cell}\n\n```{.r .cell-code}\nfor (i in 1:10) {\n print(i)\n}\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 1\n[1] 2\n[1] 3\n[1] 4\n[1] 5\n[1] 6\n[1] 7\n[1] 8\n[1] 9\n[1] 10\n```\n:::\n:::\n\n\nThis **loop takes the `i` variable** and in **each iteration of the loop** gives it values 1, 2, 3, ..., 10, then **executes the code** within the curly braces, and then the loop exits.\n\nThe following three loops all have the same behavior.\n\n\n::: {.cell}\n\n```{.r .cell-code}\n## define the loop to iterate over\nx <- c(\"a\", \"b\", \"c\", \"d\")\n\n## create for loop\nfor (i in 1:4) {\n ## Print out each element of 'x'\n print(x[i])\n}\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"a\"\n[1] \"b\"\n[1] \"c\"\n[1] \"d\"\n```\n:::\n:::\n\n\nWe can also print just the iteration value (`i`) itself\n\n\n::: {.cell}\n\n```{.r .cell-code}\n## define the loop to iterate over\nx <- c(\"a\", \"b\", \"c\", \"d\")\n\n## create for loop\nfor (i in 1:4) {\n ## Print out just 'i'\n print(i)\n}\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 1\n[1] 2\n[1] 3\n[1] 4\n```\n:::\n:::\n\n\n### `seq_along()`\n\nThe `seq_along()` function is **commonly used in conjunction with `for` loops** in order to generate an integer sequence based on the length of an object (or `ncol()` of an R object) (in this case, the object `x`).\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"a\" \"b\" \"c\" \"d\"\n```\n:::\n\n```{.r .cell-code}\nseq_along(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 1 2 3 4\n```\n:::\n:::\n\n\nThe `seq_along()` function takes in a vector and then **returns a sequence of integers** that is the same length as the input vector. It doesn't matter what class the vector is.\n\nLet's put `seq_along()` and `for` loops together.\n\n\n::: {.cell}\n\n```{.r .cell-code}\n## Generate a sequence based on length of 'x'\nfor (i in seq_along(x)) {\n print(x[i])\n}\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"a\"\n[1] \"b\"\n[1] \"c\"\n[1] \"d\"\n```\n:::\n:::\n\n\nIt is not necessary to use an index-type variable (i.e. `i`).\n\n\n::: {.cell}\n\n```{.r .cell-code}\nfor (babyshark in x) {\n print(babyshark)\n}\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"a\"\n[1] \"b\"\n[1] \"c\"\n[1] \"d\"\n```\n:::\n:::\n\n::: {.cell}\n\n```{.r .cell-code}\nfor (candyisgreat in x) {\n print(candyisgreat)\n}\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"a\"\n[1] \"b\"\n[1] \"c\"\n[1] \"d\"\n```\n:::\n:::\n\n::: {.cell}\n\n```{.r .cell-code}\nfor (RememberToVote in x) {\n print(RememberToVote)\n}\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"a\"\n[1] \"b\"\n[1] \"c\"\n[1] \"d\"\n```\n:::\n:::\n\n\nYou can use any character index you want (but not with symbols or numbers).\n\n\n::: {.cell}\n\n```{.r .cell-code}\nfor (1999 in x) {\n print(1999)\n}\n```\n\n::: {.cell-output .cell-output-error}\n```\nError: :1:6: unexpected numeric constant\n1: for (1999\n ^\n```\n:::\n:::\n\n\nFor one line loops, the curly braces are not strictly necessary.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nfor (i in 1:4) print(x[i])\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"a\"\n[1] \"b\"\n[1] \"c\"\n[1] \"d\"\n```\n:::\n:::\n\n\nHowever, I like to use curly braces even for one-line loops, because that way if you decide to expand the loop to multiple lines, you won't be burned because you forgot to add curly braces (and you **will** be burned by this).\n\n::: callout-note\n### Question\n\nLet's use the `palmerpenguins` dataset. Here are the tasks:\n\n1. Start a `for` loop\n2. Iterate over the columns of `penguins`\n3. For each column, extract the values of that column (**Hint**: check out the `pull()` function in `dplyr`).\n4. Using a `if`-`else` statement, test whether or not the values in the column are numeric or not (**Hint**: remember the `is.numeric()` function to test if a value is numeric).\n5. If they are numeric, compute the column mean. Otherwise, report a `NA`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# try it yourself\n```\n:::\n\n:::\n\n### Nested `for` loops\n\n`for` loops can be **nested** inside of each other.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- matrix(1:6, nrow = 2, ncol = 3)\nx\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n [,1] [,2] [,3]\n[1,] 1 3 5\n[2,] 2 4 6\n```\n:::\n:::\n\n::: {.cell}\n\n```{.r .cell-code}\nfor (i in seq_len(nrow(x))) {\n for (j in seq_len(ncol(x))) {\n print(x[i, j])\n }\n}\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 1\n[1] 3\n[1] 5\n[1] 2\n[1] 4\n[1] 6\n```\n:::\n:::\n\n\n::: callout-tip\n### Note\n\nThe `j` index goes across the columns. That's why we values 1, 3, etc.\n:::\n\nNested loops are commonly needed for **multidimensional or hierarchical data structures** (e.g. matrices, lists). Be careful with nesting though.\n\nNesting beyond 2 to 3 levels often makes it **difficult to read/understand the code**.\n\nIf you find yourself in need of a large number of nested loops, you may want to **break up the loops by using functions** (discussed later).\n\n## `while` Loops\n\n**`while` loops** begin by **testing a condition**.\n\nIf it is true, then they execute the loop body.\n\nOnce the loop body is executed, the condition is tested again, and so forth, until the condition is false, after which the loop exits.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncount <- 0\nwhile (count < 10) {\n print(count)\n count <- count + 1\n}\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0\n[1] 1\n[1] 2\n[1] 3\n[1] 4\n[1] 5\n[1] 6\n[1] 7\n[1] 8\n[1] 9\n```\n:::\n:::\n\n\n`while` loops can potentially result in infinite loops if not written properly. **Use with care!**\n\nSometimes there will be more than one condition in the test.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nz <- 5\nset.seed(1)\n\nwhile (z >= 3 && z <= 10) {\n coin <- rbinom(1, 1, 0.5)\n\n if (coin == 1) { ## random walk\n z <- z + 1\n } else {\n z <- z - 1\n }\n}\nprint(z)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 2\n```\n:::\n:::\n\n\n::: callout-tip\n### Pro-tip\n\nWhat's the difference between using one `&` or two `&&` ?\n\nIf you use only one `&`, these are vectorized operations, meaning they can **return a vector**, like this:\n\n\n::: {.cell}\n\n```{.r .cell-code}\n-2:2\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] -2 -1 0 1 2\n```\n:::\n\n```{.r .cell-code}\n((-2:2) >= 0) & ((-2:2) <= 0)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] FALSE FALSE TRUE FALSE FALSE\n```\n:::\n:::\n\n\nIf you use two `&&` (as above), then these **conditions are evaluated left to right**. For example, in the above code, if `z` were less than 3, the second test would not have been evaluated.\n\n\n::: {.cell}\n\n```{.r .cell-code}\n(2 >= 0) && (-2 <= 0)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] TRUE\n```\n:::\n\n```{.r .cell-code}\n(-2 >= 0) && (-2 <= 0)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] FALSE\n```\n:::\n:::\n\n:::\n\n## `repeat` Loops\n\n**`repeat` initiates an infinite loop** right from the start. These are **not commonly used** in statistical or data analysis applications, but they do have their uses.\n\n::: callout-tip\n### IMPORTANT (READ THIS AND DON'T FORGET... I'M SERIOUS... YOU WANT TO REMEMBER THIS.. FOR REALZ PLZ REMEMBER THIS)\n\nThe only way to exit a `repeat` loop is to call `break`.\n:::\n\nOne possible paradigm might be in an iterative algorithm where you may be searching for a solution and you do not want to stop until you are close enough to the solution.\n\nIn this kind of situation, you often don't know in advance how many iterations it's going to take to get \"close enough\" to the solution.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx0 <- 1\ntol <- 1e-8\n\nrepeat {\n x1 <- computeEstimate()\n\n if (abs(x1 - x0) < tol) { ## Close enough?\n break\n } else {\n x0 <- x1\n }\n}\n```\n:::\n\n\n::: callout-tip\n### Note\n\nThe above code will not run if the `computeEstimate()` function is not defined (I just made it up for the purposes of this demonstration).\n:::\n\n::: callout-tip\n### Pro-tip\n\nThe loop above is a bit **dangerous** because there is no guarantee it will stop.\n\nYou could get in a situation where the values of `x0` and `x1` oscillate back and forth and never converge.\n\nBetter to set a hard limit on the number of iterations by using a `for` loop and then report whether convergence was achieved or not.\n:::\n\n## `next`, `break`\n\n`next` is used to skip an iteration of a loop.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nfor (i in 1:100) {\n if (i <= 20) {\n ## Skip the first 20 iterations\n next\n }\n ## Do something here\n}\n```\n:::\n\n\n`break` is used to exit a loop immediately, regardless of what iteration the loop may be on.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nfor (i in 1:100) {\n print(i)\n\n if (i > 20) {\n ## Stop loop after 20 iterations\n break\n }\n}\n```\n:::\n\n\n# Summary\n\n- Control structures like `if`, `while`, and `for` allow you to control the flow of an R program\n- Infinite loops should generally be avoided, even if (you believe) they are theoretically correct.\n- Control structures mentioned here are primarily useful for writing programs; for command-line interactive work, the \"apply\" functions are more useful.\n\n# Post-lecture materials\n\n### Final Questions\n\nHere are some post-lecture questions to help you think about the material discussed.\n\n::: callout-note\n### Questions\n\n1. Write for loops to compute the mean of every column in `mtcars`.\n\n2. Imagine you have a directory full of CSV files that you want to read in. You have their paths in a vector, `files <- dir(\"data/\", pattern = \"\\\\.csv$\", full.names = TRUE)`, and now want to read each one with `read_csv()`. Write the for loop that will load them into a single data frame.\n\n3. What happens if you use `for (nm in names(x))` and `x` has no names? What if only some of the elements are named? What if the names are not unique?\n:::\n\n### Additional Resources\n\n::: callout-tip\n- \n- \n- \n:::\n\n# R session information\n\n\n::: {.cell}\n\n```{.r .cell-code}\noptions(width = 120)\nsessioninfo::session_info()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────\n setting value\n version R version 4.3.1 (2023-06-16)\n os macOS Ventura 13.5\n system aarch64, darwin20\n ui X11\n language (EN)\n collate en_US.UTF-8\n ctype en_US.UTF-8\n tz America/New_York\n date 2023-08-17\n pandoc 3.1.5 @ /opt/homebrew/bin/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────\n package * version date (UTC) lib source\n cli 3.6.1 2023-03-23 [1] CRAN (R 4.3.0)\n colorout 1.2-2 2023-05-06 [1] Github (jalvesaq/colorout@79931fd)\n colorspace 2.1-0 2023-01-23 [1] CRAN (R 4.3.0)\n digest 0.6.33 2023-07-07 [1] CRAN (R 4.3.0)\n dplyr * 1.1.2 2023-04-20 [1] CRAN (R 4.3.0)\n evaluate 0.21 2023-05-05 [1] CRAN (R 4.3.0)\n fansi 1.0.4 2023-01-22 [1] CRAN (R 4.3.0)\n fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.3.0)\n forcats * 1.0.0 2023-01-29 [1] CRAN (R 4.3.0)\n generics 0.1.3 2022-07-05 [1] CRAN (R 4.3.0)\n ggplot2 * 3.4.3 2023-08-14 [1] CRAN (R 4.3.1)\n glue 1.6.2 2022-02-24 [1] CRAN (R 4.3.0)\n gtable 0.3.3 2023-03-21 [1] CRAN (R 4.3.0)\n hms 1.1.3 2023-03-21 [1] CRAN (R 4.3.0)\n htmltools 0.5.6 2023-08-10 [1] CRAN (R 4.3.0)\n htmlwidgets 1.6.2 2023-03-17 [1] CRAN (R 4.3.0)\n jsonlite 1.8.7 2023-06-29 [1] CRAN (R 4.3.0)\n knitr 1.43 2023-05-25 [1] CRAN (R 4.3.0)\n lifecycle 1.0.3 2022-10-07 [1] CRAN (R 4.3.0)\n lubridate * 1.9.2 2023-02-10 [1] CRAN (R 4.3.0)\n magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.3.0)\n munsell 0.5.0 2018-06-12 [1] CRAN (R 4.3.0)\n palmerpenguins * 0.1.1 2022-08-15 [1] CRAN (R 4.3.0)\n pillar 1.9.0 2023-03-22 [1] CRAN (R 4.3.0)\n pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 4.3.0)\n purrr * 1.0.2 2023-08-10 [1] CRAN (R 4.3.0)\n R6 2.5.1 2021-08-19 [1] CRAN (R 4.3.0)\n readr * 2.1.4 2023-02-10 [1] CRAN (R 4.3.0)\n rlang 1.1.1 2023-04-28 [1] CRAN (R 4.3.0)\n rmarkdown 2.24 2023-08-14 [1] CRAN (R 4.3.1)\n rstudioapi 0.15.0 2023-07-07 [1] CRAN (R 4.3.0)\n scales 1.2.1 2022-08-20 [1] CRAN (R 4.3.0)\n sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.3.0)\n stringi 1.7.12 2023-01-11 [1] CRAN (R 4.3.0)\n stringr * 1.5.0 2022-12-02 [1] CRAN (R 4.3.0)\n tibble * 3.2.1 2023-03-20 [1] CRAN (R 4.3.0)\n tidyr * 1.3.0 2023-01-24 [1] CRAN (R 4.3.0)\n tidyselect 1.2.0 2022-10-10 [1] CRAN (R 4.3.0)\n tidyverse * 2.0.0 2023-02-22 [1] CRAN (R 4.3.0)\n timechange 0.2.0 2023-01-11 [1] CRAN (R 4.3.0)\n tzdb 0.4.0 2023-05-12 [1] CRAN (R 4.3.0)\n utf8 1.2.3 2023-01-31 [1] CRAN (R 4.3.0)\n vctrs 0.6.3 2023-06-14 [1] CRAN (R 4.3.0)\n withr 2.5.0 2022-03-03 [1] CRAN (R 4.3.0)\n xfun 0.40 2023-08-09 [1] CRAN (R 4.3.0)\n yaml 2.3.7 2023-01-23 [1] CRAN (R 4.3.0)\n\n [1] /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library\n\n──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n```\n:::\n:::\n", "supporting": [], "filters": [ "rmarkdown/pagebreak.lua" diff --git a/_freeze/posts/16-functions/index/execute-results/html.json b/_freeze/posts/16-functions/index/execute-results/html.json index 21be540..d99d8f2 100644 --- a/_freeze/posts/16-functions/index/execute-results/html.json +++ b/_freeze/posts/16-functions/index/execute-results/html.json @@ -1,7 +1,7 @@ { - "hash": "2bcbe1b7adebc05021228f054529b187", + "hash": "4e89da80ee98fc8abb67c9e1b35b137b", "result": { - "markdown": "---\ntitle: \"16 - Functions\"\nauthor:\n - name: Leonardo Collado Torres\n url: http://lcolladotor.github.io/\n affiliations:\n - id: libd\n name: Lieber Institute for Brain Development\n url: https://libd.org/\n - id: jhsph\n name: Johns Hopkins Bloomberg School of Public Health Department of Biostatistics\n url: https://publichealth.jhu.edu/departments/biostatistics\ndescription: \"Introduction to writing functions in R\"\ncategories: [module 4, week 4, R, programming, functions]\n---\n\n\n*This lecture, as the rest of the course, is adapted from the version [Stephanie C. Hicks](https://www.stephaniehicks.com/) designed and maintained in 2021 and 2022. Check the recent changes to this file through the [GitHub history](https://github.com/lcolladotor/jhustatcomputing2023/commits/main/posts/16-functions/index.qmd).*\n\n\n\n# Pre-lecture materials\n\n### Read ahead\n\n::: callout-note\n## Read ahead\n\n**Before class, you can prepare by reading the following materials:**\n\n1. \n2. \n3. \n:::\n\n### Acknowledgements\n\nMaterial for this lecture was borrowed and adopted from\n\n- \n- \n- \n- \n\n# Learning objectives\n\n::: callout-note\n# Learning objectives\n\n**At the end of this lesson you will:**\n\n- Know how to create a **function** using `function()` in R\n- Know how to define **named arguments** inside a function with default values\n- Be able to use named matching or **positional matching** in the argument list\n- Understand what is **lazy evaluation**\n- Understand the the special `...` argument in a function definition\n:::\n\n# Introduction\n\nWriting functions is a **core activity** of an R programmer. It represents the key step of the transition from a mere \"user\" to a developer who creates new functionality for R.\n\n**Functions** are often used to **encapsulate a sequence of expressions that need to be executed numerous times**, perhaps under slightly different conditions.\n\nAlso, functions are also often written **when code must be shared with others or the public**.\n\nThe writing of a function allows a developer to create an interface to the code, that is explicitly specified with a set of **arguments** (or parameters).\n\nThis interface provides an **abstraction of the code** to potential users. This abstraction simplifies the users' lives because it relieves them from having to know every detail of how the code operates.\n\nIn addition, the creation of an interface allows the developer to **communicate to the user the aspects of the code that are important** or are most relevant.\n\n## Functions in R\n\nFunctions in R are \"first class objects\", which means that they can be treated much like any other R object.\n\n::: callout-tip\n### Important facts about R functions\n\n- Functions can be passed as arguments to other functions.\n - This is very handy for the various apply functions, like `lapply()` and `sapply()`.\n- Functions can be nested, so that you can define a function inside of another function.\n:::\n\nIf you are familiar with common language like C, these features might appear a bit strange. However, they are really important in R and can be useful for data analysis.\n\n## Your First Function\n\nFunctions are defined using the `function()` directive and are **stored as R objects** just like anything else.\n\n::: callout-tip\n### Important\n\nIn particular, functions are R objects of class `function`.\n\nHere's a simple function that takes no arguments and does nothing.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nf <- function() {\n ## This is an empty function\n}\n## Functions have their own class\nclass(f) \n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"function\"\n```\n:::\n\n```{.r .cell-code}\n## Execute this function\nf() \n```\n\n::: {.cell-output .cell-output-stdout}\n```\nNULL\n```\n:::\n:::\n\n:::\n\nNot very interesting, but it is a start!\n\nThe next thing we can do is **create a function** that actually has a non-trivial **function body**.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nf <- function() {\n # this is the function body\n hello <- \"Hello, world!\\n\"\n cat(hello) \n}\nf()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nHello, world!\n```\n:::\n:::\n\n\n::: callout-tip\n### Pro-tip\n\n`cat()` is useful and preferable to `print()` in several settings. One reason is that it doesn't output new lines (i.e. `\\n`).\n\n\n::: {.cell}\n\n```{.r .cell-code}\nhello <- \"Hello, world!\\n\"\n\nprint(hello)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"Hello, world!\\n\"\n```\n:::\n\n```{.r .cell-code}\ncat(hello)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nHello, world!\n```\n:::\n:::\n\n:::\n\nThe last aspect of a basic function is the **function arguments**.\n\nThese are **the options that you can specify to the user** that the user may explicitly set.\n\nFor this basic function, we can add an argument that determines how many times \"Hello, world!\" is printed to the console.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nf <- function(num) {\n for(i in seq_len(num)) {\n hello <- \"Hello, world!\\n\"\n cat(hello) \n }\n}\nf(3)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nHello, world!\nHello, world!\nHello, world!\n```\n:::\n:::\n\n\nObviously, we **could have just cut-and-pasted** the `cat(\"Hello, world!\\n\")` code three times to achieve the same effect, but then we wouldn't be programming, would we?\n\nAlso, it would be un-neighborly of you to give your code to someone else and force them to cut-and-paste the code however many times the need to see \"Hello, world!\".\n\n::: callout-tip\n### Pro-tip\n\nIf you find yourself doing a lot of cutting and pasting, that's usually a good sign that you might need to write a function.\n:::\n\nFinally, the function above doesn't **return** anything.\n\nIt just prints \"Hello, world!\" to the console `num` number of times and then exits.\n\nBut often it is useful **if a function returns something** that perhaps can be fed into another section of code.\n\nThis next function returns the total number of characters printed to the console.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nf <- function(num) {\n hello <- \"Hello, world!\\n\"\n for(i in seq_len(num)) {\n cat(hello)\n }\n chars <- nchar(hello) * num\n chars\n}\nmeaningoflife <- f(3)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nHello, world!\nHello, world!\nHello, world!\n```\n:::\n\n```{.r .cell-code}\nprint(meaningoflife)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 42\n```\n:::\n:::\n\n\nIn the above function, we did not have to indicate anything special in order for the function to return the number of characters.\n\nIn R, the **return value of a function** is always the very **last expression that is evaluated**.\n\nBecause the `chars` variable is the last expression that is evaluated in this function, that becomes the return value of the function.\n\n::: callout-tip\n### Note\n\nThere is a `return()` function that can be used to return an explicitly value from a function, but it is rarely used in R (we will discuss it a bit later in this lesson).\n:::\n\nFinally, in the above function, the user must specify the value of the argument `num`. If it is not specified by the user, R will throw an error.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nf()\n```\n\n::: {.cell-output .cell-output-error}\n```\nError in f(): argument \"num\" is missing, with no default\n```\n:::\n:::\n\n\nWe can modify this behavior by setting a **default value** for the argument `num`.\n\n**Any function argument can have a default value**, if you wish to specify it.\n\nSometimes, argument values are rarely modified (except in special cases) and it makes sense to set a default value for that argument. This relieves the user from having to specify the value of that argument every single time the function is called.\n\nHere, for example, we could set the default value for `num` to be 1, so that if the function is called without the `num` argument being explicitly specified, then it will print \"Hello, world!\" to the console once.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nf <- function(num = 1) {\n hello <- \"Hello, world!\\n\"\n for(i in seq_len(num)) {\n cat(hello)\n }\n chars <- nchar(hello) * num\n chars\n}\n\n\nf() ## Use default value for 'num'\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nHello, world!\n```\n:::\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 14\n```\n:::\n\n```{.r .cell-code}\nf(2) ## Use user-specified value\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nHello, world!\nHello, world!\n```\n:::\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 28\n```\n:::\n:::\n\n\nRemember that the function still returns the number of characters printed to the console.\n\n::: callout-tip\n### Pro-tip\n\nThe `formals()` function returns a list of all the formal arguments of a function\n\n\n::: {.cell}\n\n```{.r .cell-code}\nformals(f)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n$num\n[1] 1\n```\n:::\n:::\n\n:::\n\n## Summary\n\nWe have written a function that\n\n- has one *formal argument* named `num` with a *default value* of 1. The *formal arguments* are the arguments included in the function definition.\n\n- prints the message \"Hello, world!\" to the console a number of times indicated by the argument `num`\n\n- *returns* the number of characters printed to the console\n\n# Arguments\n\n## Named arguments\n\nAbove, we have learned that functions have **named arguments**, which can optionally have default values.\n\nBecause all function arguments have names, they can be specified using their name.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nf(num = 2)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nHello, world!\nHello, world!\n```\n:::\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 28\n```\n:::\n:::\n\n\nSpecifying an argument by its name is sometimes useful **if a function has many arguments** and it may not always be clear which argument is being specified.\n\nHere, our function only has one argument so there's no confusion.\n\n## Argument matching\n\nCalling an **R function with multiple arguments** can be done in a variety of ways.\n\nThis may be confusing at first, but it's really handy when doing interactive work at the command line. R functions arguments can be matched **positionally** or **by name**.\n\n- **Positional matching** just means that R assigns the first value to the first argument, the second value to second argument, etc.\n\nSo, in the following call to `rnorm()`\n\n\n::: {.cell}\n\n```{.r .cell-code}\nstr(rnorm)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nfunction (n, mean = 0, sd = 1) \n```\n:::\n\n```{.r .cell-code}\nmydata <- rnorm(100, 2, 1) ## Generate some data\n```\n:::\n\n\n100 is assigned to the `n` argument, 2 is assigned to the `mean` argument, and 1 is assigned to the `sd` argument, all by positional matching.\n\nThe following calls to the `sd()` function (which computes the empirical standard deviation of a vector of numbers) are all equivalent.\n\n::: callout-tip\n### Note\n\n`sd(x, na.rm = FALSE)` has two arguments:\n\n- `x` indicates the vector of numbers\n- `na.rm` is a logical indicating whether missing values should be removed or not (default is `FALSE`)\n\n\n::: {.cell}\n\n```{.r .cell-code}\n## Positional match first argument, default for 'na.rm'\nsd(mydata) \n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.9974986\n```\n:::\n\n```{.r .cell-code}\n## Specify 'x' argument by name, default for 'na.rm'\nsd(x = mydata) \n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.9974986\n```\n:::\n\n```{.r .cell-code}\n## Specify both arguments by name\nsd(x = mydata, na.rm = FALSE) \n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.9974986\n```\n:::\n:::\n\n:::\n\nWhen **specifying the function arguments by name**, it **doesn't matter in what order** you specify them.\n\nIn the example below, we specify the `na.rm` argument first, followed by `x`, even though `x` is the first argument defined in the function definition.\n\n\n::: {.cell}\n\n```{.r .cell-code}\n## Specify both arguments by name\nsd(na.rm = FALSE, x = mydata) \n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.9974986\n```\n:::\n:::\n\n\nYou **can mix positional matching with matching by name**.\n\nWhen an argument is matched by name, **it is \"taken out\" of the argument list** and the remaining unnamed arguments are matched in the order that they are listed in the function definition.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsd(na.rm = FALSE, mydata)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 0.9974986\n```\n:::\n:::\n\n\nHere, the `mydata` object is assigned to the `x` argument, because it's the only argument not yet specified.\n\n::: callout-tip\n### Pro-tip\n\nThe `args()` function displays the argument names and corresponding default values of a function\n\n\n::: {.cell}\n\n```{.r .cell-code}\nargs(f)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nfunction (num = 1) \nNULL\n```\n:::\n:::\n\n:::\n\nBelow is the argument list for the `lm()` function, which fits linear models to a dataset.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nargs(lm)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nfunction (formula, data, subset, weights, na.action, method = \"qr\", \n model = TRUE, x = FALSE, y = FALSE, qr = TRUE, singular.ok = TRUE, \n contrasts = NULL, offset, ...) \nNULL\n```\n:::\n:::\n\n\nThe following two calls are equivalent.\n\n``` r\nlm(data = mydata, y ~ x, model = FALSE, 1:100)\nlm(y ~ x, mydata, 1:100, model = FALSE)\n```\n\n::: callout-tip\n### Pro-tip\n\nEven though it's legal, I don't recommend messing around with the order of the arguments too much, since it can lead to some confusion.\n:::\n\nMost of the time, **named arguments are helpful**:\n\n- On the command line when you have a long argument list and you want to use the defaults for everything except for an argument near the end of the list\n- If you can remember the name of the argument and not its position on the argument list\n\nFor example, **plotting functions** often have a lot of options to allow for customization, but this makes it difficult to remember exactly the position of every argument on the argument list.\n\nFunction arguments can also be **partially matched**, which is useful for interactive work.\n\n::: callout-tip\n### Pro-tip\n\nThe order of operations when given an argument is\n\n1. Check for exact match for a named argument\n2. Check for a partial match\n3. Check for a positional match\n:::\n\n**Partial matching should be avoided when writing longer code or programs**, because it may lead to confusion if someone is reading the code. However, partial matching is very useful when calling functions interactively that have very long argument names.\n\n## Lazy Evaluation\n\nArguments to functions are **evaluated lazily**, so they are evaluated only as needed in the body of the function.\n\nIn this example, the function `f()` has two arguments: `a` and `b`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nf <- function(a, b) {\n a^2\n} \nf(2)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 4\n```\n:::\n:::\n\n\nThis **function never actually uses the argument `b`**, so calling `f(2)` will not produce an error because the 2 gets positionally matched to `a`.\n\nThis behavior can be good or bad. It's common to write a function that doesn't use an argument and not notice it simply because R never throws an error.\n\nThis example also shows lazy evaluation at work, but does eventually result in an error.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nf <- function(a, b) {\n print(a)\n print(b)\n}\nf(45)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 45\n```\n:::\n\n::: {.cell-output .cell-output-error}\n```\nError in f(45): argument \"b\" is missing, with no default\n```\n:::\n:::\n\n\nNotice that \"45\" got printed first before the error was triggered! This is because `b` did not have to be evaluated until after `print(a)`.\n\nOnce the function tried to evaluate `print(b)` the function had to throw an error.\n\n## The `...` Argument\n\nThere is a **special argument in R known as the `...` argument**, which indicates **a variable number of arguments** that are usually passed on to other functions.\n\nThe `...` argument is **often used when extending another function** and you do not want to copy the entire argument list of the original function\n\nFor example, a custom plotting function may want to make use of the default `plot()` function along with its entire argument list. The function below changes the default for the `type` argument to the value `type = \"l\"` (the original default was `type = \"p\"`).\n\n``` r\nmyplot <- function(x, y, type = \"l\", ...) {\n plot(x, y, type = type, ...) ## Pass '...' to 'plot' function\n}\n```\n\nGeneric functions use `...` so that extra arguments can be passed to methods.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nmean\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nfunction (x, ...) \nUseMethod(\"mean\")\n\n\n```\n:::\n:::\n\n\nThe `...` argument is necessary when the number of arguments passed to the function cannot be known in advance. This is clear in functions like `paste()` and `cat()`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\npaste(\"one\", \"two\", \"three\")\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"one two three\"\n```\n:::\n\n```{.r .cell-code}\npaste(\"one\", \"two\", \"three\", \"four\", \"five\", sep=\"_\")\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"one_two_three_four_five\"\n```\n:::\n:::\n\n::: {.cell}\n\n```{.r .cell-code}\nargs(paste)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nfunction (..., sep = \" \", collapse = NULL, recycle0 = FALSE) \nNULL\n```\n:::\n:::\n\n\nBecause `paste()` prints out text to the console by combining multiple character vectors together, it is impossible for this function to know in advance how many character vectors will be passed to the function by the user.\n\nSo the first argument in the function is `...`.\n\n## Arguments Coming After the `...` Argument\n\nOne catch with `...` is that any **arguments that appear after** `...` on the argument list **must be named explicitly and cannot be partially matched or matched positionally**.\n\nTake a look at the arguments to the `paste()` function.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nargs(paste)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nfunction (..., sep = \" \", collapse = NULL, recycle0 = FALSE) \nNULL\n```\n:::\n:::\n\n\nWith the `paste()` function, the arguments `sep` and `collapse` must be named explicitly and in full if the default values are not going to be used.\n\nHere, I specify that I want \"a\" and \"b\" to be pasted together and separated by a colon.\n\n\n::: {.cell}\n\n```{.r .cell-code}\npaste(\"a\", \"b\", sep = \":\")\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"a:b\"\n```\n:::\n:::\n\n\nIf I don't specify the `sep` argument in full and attempt to rely on partial matching, I don't get the expected result.\n\n\n::: {.cell}\n\n```{.r .cell-code}\npaste(\"a\", \"b\", se = \":\")\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"a b :\"\n```\n:::\n:::\n\n\n# Functions are for humans and computers\n\nAs you start to write your own functions, it's important to keep in mind that functions are not just for the computer, but are also for humans. Technically, R does not care what your function is called, or what comments it contains, but these are important for **human readers**.\n\nThis section discusses some things that you should bear in mind when writing functions that humans can understand.\n\n## The name of a function is important\n\nIn an ideal world, you want the name of your function to be short but clearly describe what the function does. This is not always easy, but here are some tips.\n\nThe **function names** should be **verbs**, and **arguments** should be **nouns**.\n\nThere are some exceptions:\n\n- nouns are ok if the function computes a very well known noun (i.e. `mean()` is better than `compute_mean()`).\n- A good sign that a noun might be a better choice is if you are using a very broad verb like \"get\", \"compute\", \"calculate\", or \"determine\". Use your best judgement and do not be afraid to rename a function if you figure out a better name later.\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# Too short\nf()\n\n# Not a verb, or descriptive\nmy_awesome_function()\n\n# Long, but clear\nimpute_missing()\ncollapse_years()\n```\n:::\n\n\n## snake_case vs camelCase\n\nIf your function name is composed of multiple words, **use \"snake_case\"**, where each lowercase word is separated by an underscore.\n\n\"camelCase\" is a popular alternative. It does not really matter which one you pick, the important thing is to be consistent: **pick one or the other and stick with it**.\n\nR itself is not very consistent, but there is nothing you can do about that. Make sure you do not fall into the same trap by making your code as consistent as possible.\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# Never do this!\ncol_mins <- function(x, y) {}\nrowMaxes <- function(x, y) {}\n```\n:::\n\n\n## Use a common prefix\n\nIf you have a family of functions that do similar things, make sure they have consistent names and arguments.\n\nIt's a good idea to indicate that they are connected. That is better than a common suffix because autocomplete allows you to type the prefix and see all the members of the family.\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# Good\ninput_select()\ninput_checkbox()\ninput_text()\n\n# Not so good\nselect_input()\ncheckbox_input()\ntext_input()\n```\n:::\n\n\n## Avoid overriding exisiting functions\n\nWhere possible, avoid overriding existing functions and variables.\n\nIt is impossible to do in general because so many good names are already taken by other packages, but avoiding the most common names from base R will avoid confusion.\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# Don't do this!\nT <- FALSE\nc <- 10\nmean <- function(x) sum(x)\n```\n:::\n\n\n## Use comments\n\nUse **comments** are lines starting with #. They can explain the \"why\" of your code.\n\nYou generally should avoid comments that explain the \"what\" or the \"how\". If you can't understand what the code does from reading it, you should think about how to rewrite it to be more clear.\n\n- Do you need to add some intermediate variables with useful names?\n- Do you need to break out a subcomponent of a large function so you can name it?\n\nHowever, your code can never capture the reasoning behind your decisions:\n\n- Why did you choose this approach instead of an alternative?\n- What else did you try that didn't work?\n\nIt's a great idea to capture that sort of thinking in a comment.\n\n# Environment\n\nThe last component of a function is its **environment**.\n\nThis is not something you need to understand deeply when you first start writing functions. However, it's important to know a little bit about environments because they are crucial to how functions work.\n\nThe **environment of a function** controls how R finds the value associated with a name.\n\nFor example, take this function:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nf <- function(x) {\n x + y\n} \n```\n:::\n\n\nIn many programming languages, this would be an error, because `y` is not defined inside the function.\n\nIn R, this is valid code because R uses rules called **lexical scoping** to find the value associated with a name.\n\nSince `y` is not defined inside the function, R will look in the environment where the function was defined:\n\n\n::: {.cell}\n\n```{.r .cell-code}\ny <- 100\nf(10)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 110\n```\n:::\n\n```{.r .cell-code}\ny <- 1000\nf(10)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 1010\n```\n:::\n:::\n\n\nThis behavior seems like a recipe for bugs, and indeed you should avoid creating functions like this deliberately, but by and large it does not cause too many problems (especially if you regularly restart R to get to a clean slate).\n\nThe **advantage of this behavior** is that from a language standpoint **it allows R to be very consistent**.\n\n- Every name is looked up using the same set of rules.\n\nFor `f()` that includes the behavior of two things that you might not expect: `{` and `+`. This allows you to do devious things like:\n\n\n::: {.cell}\n\n```{.r .cell-code}\n`+` <- function(x, y) {\n if (runif(1) < 0.1) {\n sum(x, y)\n } else {\n sum(x, y) * 1.1\n }\n}\ntable(replicate(1000, 1 + 2))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n\n 3 3.3 \n100 900 \n```\n:::\n:::\n\n::: {.cell}\n\n```{.r .cell-code}\nrm(`+`)\n```\n:::\n\n\nThis is a common phenomenon in R. R places few limits on your power. You can do many things that you can't do in other programming languages. You can do many things that 99% of the time are extremely ill-advised (like overriding how addition works!). But this power and flexibility is what makes tools like `ggplot2` and `dplyr` possible.\n\n::: callout-tip\n### More resources\n\nIf you are interested in learning more about scoping, check out\n\n- \n- \n:::\n\n# Summary\n\n- Functions can be defined using the `function()` directive and are assigned to R objects just like any other R object\n\n- Functions have can be defined with named arguments; these function arguments can have default values\n\n- Functions arguments can be specified by name or by position in the argument list\n\n- Functions always return the last expression evaluated in the function body\n\n- A variable number of arguments can be specified using the special `...` argument in a function definition.\n\n# Post-lecture materials\n\n### Final Questions\n\nHere are some post-lecture questions to help you think about the material discussed.\n\n::: callout-note\n### Questions\n\n1. Practice turning the following code snippets into functions. Think about what each function does. What would you call it? How many arguments does it need? Can you rewrite it to be more expressive or less duplicative?\n\n\n::: {.cell}\n\n```{.r .cell-code}\nmean(is.na(x))\n\nx / sum(x, na.rm = TRUE)\n```\n:::\n\n\n2. Read the [complete lyrics](https://en.wikipedia.org/wiki/Little_Bunny_Foo_Foo) to \"Little Bunny Foo Foo\". There is a lot of duplication in this song. Extend the initial piping example to recreate the complete song, and use functions to reduce the duplication.\n\n3. Take a function that you've written recently and spend 5 minutes brainstorming a better name for it and its arguments.\n\n4. What does the `trim` argument to `mean()` do? When might you use it?\n\n5. The default value for the method argument to `cor()` is `c(\"pearson\", \"kendall\", \"spearman\")`. What does that mean? What value is used by default?\n:::\n\n### Additional Resources\n\n::: callout-tip\n- \n- \n- \n- \n:::\n\n# R session information\n\n\n::: {.cell}\n\n```{.r .cell-code}\noptions(width = 120)\nsessioninfo::session_info()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────\n setting value\n version R version 4.3.1 (2023-06-16)\n os macOS Ventura 13.5\n system aarch64, darwin20\n ui X11\n language (EN)\n collate en_US.UTF-8\n ctype en_US.UTF-8\n tz America/New_York\n date 2023-08-17\n pandoc 3.1.5 @ /opt/homebrew/bin/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────\n package * version date (UTC) lib source\n cli 3.6.1 2023-03-23 [1] CRAN (R 4.3.0)\n colorout 1.2-2 2023-05-06 [1] Github (jalvesaq/colorout@79931fd)\n digest 0.6.33 2023-07-07 [1] CRAN (R 4.3.0)\n evaluate 0.21 2023-05-05 [1] CRAN (R 4.3.0)\n fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.3.0)\n htmltools 0.5.6 2023-08-10 [1] CRAN (R 4.3.0)\n htmlwidgets 1.6.2 2023-03-17 [1] CRAN (R 4.3.0)\n jsonlite 1.8.7 2023-06-29 [1] CRAN (R 4.3.0)\n knitr 1.43 2023-05-25 [1] CRAN (R 4.3.0)\n rlang 1.1.1 2023-04-28 [1] CRAN (R 4.3.0)\n rmarkdown 2.24 2023-08-14 [1] CRAN (R 4.3.1)\n rstudioapi 0.15.0 2023-07-07 [1] CRAN (R 4.3.0)\n sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.3.0)\n xfun 0.40 2023-08-09 [1] CRAN (R 4.3.0)\n yaml 2.3.7 2023-01-23 [1] CRAN (R 4.3.0)\n\n [1] /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library\n\n──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n```\n:::\n:::\n", + "markdown": "---\ntitle: \"16 - Functions\"\nauthor:\n - name: Leonardo Collado Torres\n url: http://lcolladotor.github.io/\n affiliations:\n - id: libd\n name: Lieber Institute for Brain Development\n url: https://libd.org/\n - id: jhsph\n name: Johns Hopkins Bloomberg School of Public Health Department of Biostatistics\n url: https://publichealth.jhu.edu/departments/biostatistics\ndescription: \"Introduction to writing functions in R\"\ncategories: [module 4, week 4, R, programming, functions]\n---\n\n\n*This lecture, as the rest of the course, is adapted from the version [Stephanie C. Hicks](https://www.stephaniehicks.com/) designed and maintained in 2021 and 2022. Check the recent changes to this file through the [GitHub history](https://github.com/lcolladotor/jhustatcomputing2023/commits/main/posts/16-functions/index.qmd).*\n\n\n\n# Pre-lecture materials\n\n### Read ahead\n\n::: callout-note\n## Read ahead\n\n**Before class, you can prepare by reading the following materials:**\n\n1. \n2. \n3. \n:::\n\n### Acknowledgements\n\nMaterial for this lecture was borrowed and adopted from\n\n- \n- \n- \n- \n\n# Learning objectives\n\n::: callout-note\n# Learning objectives\n\n**At the end of this lesson you will:**\n\n- Know how to create a **function** using `function()` in R\n- Know how to define **named arguments** inside a function with default values\n- Be able to use named matching or **positional matching** in the argument list\n- Understand what is **lazy evaluation**\n- Understand the the special `...` argument in a function definition\n:::\n\n# Introduction\n\nWriting functions is a **core activity** of an R programmer. It represents the key step of the transition from a mere \"user\" to a developer who creates new functionality for R.\n\n**Functions** are often used to **encapsulate a sequence of expressions that need to be executed numerous times**, perhaps under slightly different conditions.\n\nAlso, functions are also often written **when code must be shared with others or the public**.\n\nThe writing of a function allows a developer to create an interface to the code, that is explicitly specified with a set of **arguments** (or parameters).\n\nThis interface provides an **abstraction of the code** to potential users. This abstraction simplifies the users' lives because it relieves them from having to know every detail of how the code operates.\n\nIn addition, the creation of an interface allows the developer to **communicate to the user the aspects of the code that are important** or are most relevant.\n\n## Functions in R\n\nFunctions in R are \"first class objects\", which means that they can be treated much like any other R object.\n\n::: callout-tip\n### Important facts about R functions\n\n- Functions can be passed as arguments to other functions.\n - This is very handy for the various apply functions, like `lapply()` and `sapply()`.\n- Functions can be nested, so that you can define a function inside of another function.\n:::\n\nIf you are familiar with common language like C, these features might appear a bit strange. However, they are really important in R and can be useful for data analysis.\n\n## Your First Function\n\nFunctions are defined using the `function()` directive and are **stored as R objects** just like anything else.\n\n::: callout-tip\n### Important\n\nIn particular, functions are R objects of class `function`.\n\nHere's a simple function that takes no arguments and does nothing.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nf <- function() {\n ## This is an empty function\n}\n## Functions have their own class\nclass(f)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"function\"\n```\n:::\n\n```{.r .cell-code}\n## Execute this function\nf()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nNULL\n```\n:::\n:::\n\n:::\n\nNot very interesting, but it is a start!\n\nThe next thing we can do is **create a function** that actually has a non-trivial **function body**.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nf <- function() {\n # this is the function body\n hello <- \"Hello, world!\\n\"\n cat(hello)\n}\nf()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nHello, world!\n```\n:::\n:::\n\n\n::: callout-tip\n### Pro-tip\n\n`cat()` is useful and preferable to `print()` in several settings. One reason is that it doesn't output new lines (i.e. `\\n`).\n\n\n::: {.cell}\n\n```{.r .cell-code}\nhello <- \"Hello, world!\\n\"\n\nprint(hello)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"Hello, world!\\n\"\n```\n:::\n\n```{.r .cell-code}\ncat(hello)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nHello, world!\n```\n:::\n:::\n\n:::\n\nThe last aspect of a basic function is the **function arguments**.\n\nThese are **the options that you can specify to the user** that the user may explicitly set.\n\nFor this basic function, we can add an argument that determines how many times \"Hello, world!\" is printed to the console.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nf <- function(num) {\n for (i in seq_len(num)) {\n hello <- \"Hello, world!\\n\"\n cat(hello)\n }\n}\nf(3)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nHello, world!\nHello, world!\nHello, world!\n```\n:::\n:::\n\n\nObviously, we **could have just cut-and-pasted** the `cat(\"Hello, world!\\n\")` code three times to achieve the same effect, but then we wouldn't be programming, would we?\n\nAlso, it would be un-neighborly of you to give your code to someone else and force them to cut-and-paste the code however many times the need to see \"Hello, world!\".\n\n::: callout-tip\n### Pro-tip\n\nIf you find yourself doing a lot of cutting and pasting, that's usually a good sign that you might need to write a function.\n:::\n\nFinally, the function above doesn't **return** anything.\n\nIt just prints \"Hello, world!\" to the console `num` number of times and then exits.\n\nBut often it is useful **if a function returns something** that perhaps can be fed into another section of code.\n\nThis next function returns the total number of characters printed to the console.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nf <- function(num) {\n hello <- \"Hello, world!\\n\"\n for (i in seq_len(num)) {\n cat(hello)\n }\n chars <- nchar(hello) * num\n chars\n}\nmeaningoflife <- f(3)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nHello, world!\nHello, world!\nHello, world!\n```\n:::\n\n```{.r .cell-code}\nprint(meaningoflife)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 42\n```\n:::\n:::\n\n\nIn the above function, we did not have to indicate anything special in order for the function to return the number of characters.\n\nIn R, the **return value of a function** is always the very **last expression that is evaluated**.\n\nBecause the `chars` variable is the last expression that is evaluated in this function, that becomes the return value of the function.\n\n::: callout-tip\n### Note\n\nThere is a `return()` function that can be used to return an explicitly value from a function, but it is rarely used in R (we will discuss it a bit later in this lesson).\n:::\n\nFinally, in the above function, the user must specify the value of the argument `num`. If it is not specified by the user, R will throw an error.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nf()\n```\n\n::: {.cell-output .cell-output-error}\n```\nError in f(): argument \"num\" is missing, with no default\n```\n:::\n:::\n\n\nWe can modify this behavior by setting a **default value** for the argument `num`.\n\n**Any function argument can have a default value**, if you wish to specify it.\n\nSometimes, argument values are rarely modified (except in special cases) and it makes sense to set a default value for that argument. This relieves the user from having to specify the value of that argument every single time the function is called.\n\nHere, for example, we could set the default value for `num` to be 1, so that if the function is called without the `num` argument being explicitly specified, then it will print \"Hello, world!\" to the console once.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nf <- function(num = 1) {\n hello <- \"Hello, world!\\n\"\n for (i in seq_len(num)) {\n cat(hello)\n }\n chars <- nchar(hello) * num\n chars\n}\n\n\nf() ## Use default value for 'num'\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nHello, world!\n```\n:::\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 14\n```\n:::\n\n```{.r .cell-code}\nf(2) ## Use user-specified value\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nHello, world!\nHello, world!\n```\n:::\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 28\n```\n:::\n:::\n\n\nRemember that the function still returns the number of characters printed to the console.\n\n::: callout-tip\n### Pro-tip\n\nThe `formals()` function returns a list of all the formal arguments of a function\n\n\n::: {.cell}\n\n```{.r .cell-code}\nformals(f)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n$num\n[1] 1\n```\n:::\n:::\n\n:::\n\n## Summary\n\nWe have written a function that\n\n- has one *formal argument* named `num` with a *default value* of 1. The *formal arguments* are the arguments included in the function definition.\n\n- prints the message \"Hello, world!\" to the console a number of times indicated by the argument `num`\n\n- *returns* the number of characters printed to the console\n\n# Arguments\n\n## Named arguments\n\nAbove, we have learned that functions have **named arguments**, which can optionally have default values.\n\nBecause all function arguments have names, they can be specified using their name.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nf(num = 2)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nHello, world!\nHello, world!\n```\n:::\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 28\n```\n:::\n:::\n\n\nSpecifying an argument by its name is sometimes useful **if a function has many arguments** and it may not always be clear which argument is being specified.\n\nHere, our function only has one argument so there's no confusion.\n\n## Argument matching\n\nCalling an **R function with multiple arguments** can be done in a variety of ways.\n\nThis may be confusing at first, but it's really handy when doing interactive work at the command line. R functions arguments can be matched **positionally** or **by name**.\n\n- **Positional matching** just means that R assigns the first value to the first argument, the second value to second argument, etc.\n\nSo, in the following call to `rnorm()`\n\n\n::: {.cell}\n\n```{.r .cell-code}\nstr(rnorm)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nfunction (n, mean = 0, sd = 1) \n```\n:::\n\n```{.r .cell-code}\nmydata <- rnorm(100, 2, 1) ## Generate some data\n```\n:::\n\n\n100 is assigned to the `n` argument, 2 is assigned to the `mean` argument, and 1 is assigned to the `sd` argument, all by positional matching.\n\nThe following calls to the `sd()` function (which computes the empirical standard deviation of a vector of numbers) are all equivalent.\n\n::: callout-tip\n### Note\n\n`sd(x, na.rm = FALSE)` has two arguments:\n\n- `x` indicates the vector of numbers\n- `na.rm` is a logical indicating whether missing values should be removed or not (default is `FALSE`)\n\n\n::: {.cell}\n\n```{.r .cell-code}\n## Positional match first argument, default for 'na.rm'\nsd(mydata)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 1.014286\n```\n:::\n\n```{.r .cell-code}\n## Specify 'x' argument by name, default for 'na.rm'\nsd(x = mydata)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 1.014286\n```\n:::\n\n```{.r .cell-code}\n## Specify both arguments by name\nsd(x = mydata, na.rm = FALSE)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 1.014286\n```\n:::\n:::\n\n:::\n\nWhen **specifying the function arguments by name**, it **doesn't matter in what order** you specify them.\n\nIn the example below, we specify the `na.rm` argument first, followed by `x`, even though `x` is the first argument defined in the function definition.\n\n\n::: {.cell}\n\n```{.r .cell-code}\n## Specify both arguments by name\nsd(na.rm = FALSE, x = mydata)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 1.014286\n```\n:::\n:::\n\n\nYou **can mix positional matching with matching by name**.\n\nWhen an argument is matched by name, **it is \"taken out\" of the argument list** and the remaining unnamed arguments are matched in the order that they are listed in the function definition.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsd(na.rm = FALSE, mydata)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 1.014286\n```\n:::\n:::\n\n\nHere, the `mydata` object is assigned to the `x` argument, because it's the only argument not yet specified.\n\n::: callout-tip\n### Pro-tip\n\nThe `args()` function displays the argument names and corresponding default values of a function\n\n\n::: {.cell}\n\n```{.r .cell-code}\nargs(f)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nfunction (num = 1) \nNULL\n```\n:::\n:::\n\n:::\n\nBelow is the argument list for the `lm()` function, which fits linear models to a dataset.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nargs(lm)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nfunction (formula, data, subset, weights, na.action, method = \"qr\", \n model = TRUE, x = FALSE, y = FALSE, qr = TRUE, singular.ok = TRUE, \n contrasts = NULL, offset, ...) \nNULL\n```\n:::\n:::\n\n\nThe following two calls are equivalent.\n\n``` r\nlm(data = mydata, y ~ x, model = FALSE, 1:100)\nlm(y ~ x, mydata, 1:100, model = FALSE)\n```\n\n::: callout-tip\n### Pro-tip\n\nEven though it's legal, I don't recommend messing around with the order of the arguments too much, since it can lead to some confusion.\n:::\n\nMost of the time, **named arguments are helpful**:\n\n- On the command line when you have a long argument list and you want to use the defaults for everything except for an argument near the end of the list\n- If you can remember the name of the argument and not its position on the argument list\n\nFor example, **plotting functions** often have a lot of options to allow for customization, but this makes it difficult to remember exactly the position of every argument on the argument list.\n\nFunction arguments can also be **partially matched**, which is useful for interactive work.\n\n::: callout-tip\n### Pro-tip\n\nThe order of operations when given an argument is\n\n1. Check for exact match for a named argument\n2. Check for a partial match\n3. Check for a positional match\n:::\n\n**Partial matching should be avoided when writing longer code or programs**, because it may lead to confusion if someone is reading the code. However, partial matching is very useful when calling functions interactively that have very long argument names.\n\n## Lazy Evaluation\n\nArguments to functions are **evaluated lazily**, so they are evaluated only as needed in the body of the function.\n\nIn this example, the function `f()` has two arguments: `a` and `b`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nf <- function(a, b) {\n a^2\n}\nf(2)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 4\n```\n:::\n:::\n\n\nThis **function never actually uses the argument `b`**, so calling `f(2)` will not produce an error because the 2 gets positionally matched to `a`.\n\nThis behavior can be good or bad. It's common to write a function that doesn't use an argument and not notice it simply because R never throws an error.\n\nThis example also shows lazy evaluation at work, but does eventually result in an error.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nf <- function(a, b) {\n print(a)\n print(b)\n}\nf(45)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 45\n```\n:::\n\n::: {.cell-output .cell-output-error}\n```\nError in f(45): argument \"b\" is missing, with no default\n```\n:::\n:::\n\n\nNotice that \"45\" got printed first before the error was triggered! This is because `b` did not have to be evaluated until after `print(a)`.\n\nOnce the function tried to evaluate `print(b)` the function had to throw an error.\n\n## The `...` Argument\n\nThere is a **special argument in R known as the `...` argument**, which indicates **a variable number of arguments** that are usually passed on to other functions.\n\nThe `...` argument is **often used when extending another function** and you do not want to copy the entire argument list of the original function\n\nFor example, a custom plotting function may want to make use of the default `plot()` function along with its entire argument list. The function below changes the default for the `type` argument to the value `type = \"l\"` (the original default was `type = \"p\"`).\n\n``` r\nmyplot <- function(x, y, type = \"l\", ...) {\n plot(x, y, type = type, ...) ## Pass '...' to 'plot' function\n}\n```\n\nGeneric functions use `...` so that extra arguments can be passed to methods.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nmean\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nfunction (x, ...) \nUseMethod(\"mean\")\n\n\n```\n:::\n:::\n\n\nThe `...` argument is necessary when the number of arguments passed to the function cannot be known in advance. This is clear in functions like `paste()` and `cat()`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\npaste(\"one\", \"two\", \"three\")\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"one two three\"\n```\n:::\n\n```{.r .cell-code}\npaste(\"one\", \"two\", \"three\", \"four\", \"five\", sep = \"_\")\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"one_two_three_four_five\"\n```\n:::\n:::\n\n::: {.cell}\n\n```{.r .cell-code}\nargs(paste)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nfunction (..., sep = \" \", collapse = NULL, recycle0 = FALSE) \nNULL\n```\n:::\n:::\n\n\nBecause `paste()` prints out text to the console by combining multiple character vectors together, it is impossible for this function to know in advance how many character vectors will be passed to the function by the user.\n\nSo the first argument in the function is `...`.\n\n## Arguments Coming After the `...` Argument\n\nOne catch with `...` is that any **arguments that appear after** `...` on the argument list **must be named explicitly and cannot be partially matched or matched positionally**.\n\nTake a look at the arguments to the `paste()` function.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nargs(paste)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nfunction (..., sep = \" \", collapse = NULL, recycle0 = FALSE) \nNULL\n```\n:::\n:::\n\n\nWith the `paste()` function, the arguments `sep` and `collapse` must be named explicitly and in full if the default values are not going to be used.\n\nHere, I specify that I want \"a\" and \"b\" to be pasted together and separated by a colon.\n\n\n::: {.cell}\n\n```{.r .cell-code}\npaste(\"a\", \"b\", sep = \":\")\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"a:b\"\n```\n:::\n:::\n\n\nIf I don't specify the `sep` argument in full and attempt to rely on partial matching, I don't get the expected result.\n\n\n::: {.cell}\n\n```{.r .cell-code}\npaste(\"a\", \"b\", se = \":\")\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"a b :\"\n```\n:::\n:::\n\n\n# Functions are for humans and computers\n\nAs you start to write your own functions, it's important to keep in mind that functions are not just for the computer, but are also for humans. Technically, R does not care what your function is called, or what comments it contains, but these are important for **human readers**.\n\nThis section discusses some things that you should bear in mind when writing functions that humans can understand.\n\n## The name of a function is important\n\nIn an ideal world, you want the name of your function to be short but clearly describe what the function does. This is not always easy, but here are some tips.\n\nThe **function names** should be **verbs**, and **arguments** should be **nouns**.\n\nThere are some exceptions:\n\n- nouns are ok if the function computes a very well known noun (i.e. `mean()` is better than `compute_mean()`).\n- A good sign that a noun might be a better choice is if you are using a very broad verb like \"get\", \"compute\", \"calculate\", or \"determine\". Use your best judgement and do not be afraid to rename a function if you figure out a better name later.\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# Too short\nf()\n\n# Not a verb, or descriptive\nmy_awesome_function()\n\n# Long, but clear\nimpute_missing()\ncollapse_years()\n```\n:::\n\n\n## snake_case vs camelCase\n\nIf your function name is composed of multiple words, **use \"snake_case\"**, where each lowercase word is separated by an underscore.\n\n\"camelCase\" is a popular alternative. It does not really matter which one you pick, the important thing is to be consistent: **pick one or the other and stick with it**.\n\nR itself is not very consistent, but there is nothing you can do about that. Make sure you do not fall into the same trap by making your code as consistent as possible.\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# Never do this!\ncol_mins <- function(x, y) {}\nrowMaxes <- function(x, y) {}\n```\n:::\n\n\n## Use a common prefix\n\nIf you have a family of functions that do similar things, make sure they have consistent names and arguments.\n\nIt's a good idea to indicate that they are connected. That is better than a common suffix because autocomplete allows you to type the prefix and see all the members of the family.\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# Good\ninput_select()\ninput_checkbox()\ninput_text()\n\n# Not so good\nselect_input()\ncheckbox_input()\ntext_input()\n```\n:::\n\n\n## Avoid overriding exisiting functions\n\nWhere possible, avoid overriding existing functions and variables.\n\nIt is impossible to do in general because so many good names are already taken by other packages, but avoiding the most common names from base R will avoid confusion.\n\n\n::: {.cell}\n\n```{.r .cell-code}\n# Don't do this!\nT <- FALSE\nc <- 10\nmean <- function(x) sum(x)\n```\n:::\n\n\n## Use comments\n\nUse **comments** are lines starting with #. They can explain the \"why\" of your code.\n\nYou generally should avoid comments that explain the \"what\" or the \"how\". If you can't understand what the code does from reading it, you should think about how to rewrite it to be more clear.\n\n- Do you need to add some intermediate variables with useful names?\n- Do you need to break out a subcomponent of a large function so you can name it?\n\nHowever, your code can never capture the reasoning behind your decisions:\n\n- Why did you choose this approach instead of an alternative?\n- What else did you try that didn't work?\n\nIt's a great idea to capture that sort of thinking in a comment.\n\n# Environment\n\nThe last component of a function is its **environment**.\n\nThis is not something you need to understand deeply when you first start writing functions. However, it's important to know a little bit about environments because they are crucial to how functions work.\n\nThe **environment of a function** controls how R finds the value associated with a name.\n\nFor example, take this function:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nf <- function(x) {\n x + y\n}\n```\n:::\n\n\nIn many programming languages, this would be an error, because `y` is not defined inside the function.\n\nIn R, this is valid code because R uses rules called **lexical scoping** to find the value associated with a name.\n\nSince `y` is not defined inside the function, R will look in the environment where the function was defined:\n\n\n::: {.cell}\n\n```{.r .cell-code}\ny <- 100\nf(10)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 110\n```\n:::\n\n```{.r .cell-code}\ny <- 1000\nf(10)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 1010\n```\n:::\n:::\n\n\nThis behavior seems like a recipe for bugs, and indeed you should avoid creating functions like this deliberately, but by and large it does not cause too many problems (especially if you regularly restart R to get to a clean slate).\n\nThe **advantage of this behavior** is that from a language standpoint **it allows R to be very consistent**.\n\n- Every name is looked up using the same set of rules.\n\nFor `f()` that includes the behavior of two things that you might not expect: `{` and `+`. This allows you to do devious things like:\n\n\n::: {.cell}\n\n```{.r .cell-code}\n`+` <- function(x, y) {\n if (runif(1) < 0.1) {\n sum(x, y)\n } else {\n sum(x, y) * 1.1\n }\n}\ntable(replicate(1000, 1 + 2))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n\n 3 3.3 \n 82 918 \n```\n:::\n:::\n\n::: {.cell}\n\n```{.r .cell-code}\nrm(`+`)\n```\n:::\n\n\nThis is a common phenomenon in R. R places few limits on your power. You can do many things that you can't do in other programming languages. You can do many things that 99% of the time are extremely ill-advised (like overriding how addition works!). But this power and flexibility is what makes tools like `ggplot2` and `dplyr` possible.\n\n::: callout-tip\n### More resources\n\nIf you are interested in learning more about scoping, check out\n\n- \n- \n:::\n\n# Summary\n\n- Functions can be defined using the `function()` directive and are assigned to R objects just like any other R object\n\n- Functions have can be defined with named arguments; these function arguments can have default values\n\n- Functions arguments can be specified by name or by position in the argument list\n\n- Functions always return the last expression evaluated in the function body\n\n- A variable number of arguments can be specified using the special `...` argument in a function definition.\n\n# Post-lecture materials\n\n### Final Questions\n\nHere are some post-lecture questions to help you think about the material discussed.\n\n::: callout-note\n### Questions\n\n1. Practice turning the following code snippets into functions. Think about what each function does. What would you call it? How many arguments does it need? Can you rewrite it to be more expressive or less duplicative?\n\n\n::: {.cell}\n\n```{.r .cell-code}\nmean(is.na(x))\n\nx / sum(x, na.rm = TRUE)\n```\n:::\n\n\n2. Read the [complete lyrics](https://en.wikipedia.org/wiki/Little_Bunny_Foo_Foo) to \"Little Bunny Foo Foo\". There is a lot of duplication in this song. Extend the initial piping example to recreate the complete song, and use functions to reduce the duplication.\n\n3. Take a function that you've written recently and spend 5 minutes brainstorming a better name for it and its arguments.\n\n4. What does the `trim` argument to `mean()` do? When might you use it?\n\n5. The default value for the method argument to `cor()` is `c(\"pearson\", \"kendall\", \"spearman\")`. What does that mean? What value is used by default?\n:::\n\n### Additional Resources\n\n::: callout-tip\n- \n- \n- \n- \n:::\n\n# R session information\n\n\n::: {.cell}\n\n```{.r .cell-code}\noptions(width = 120)\nsessioninfo::session_info()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────\n setting value\n version R version 4.3.1 (2023-06-16)\n os macOS Ventura 13.5\n system aarch64, darwin20\n ui X11\n language (EN)\n collate en_US.UTF-8\n ctype en_US.UTF-8\n tz America/New_York\n date 2023-08-17\n pandoc 3.1.5 @ /opt/homebrew/bin/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────\n package * version date (UTC) lib source\n cli 3.6.1 2023-03-23 [1] CRAN (R 4.3.0)\n colorout 1.2-2 2023-05-06 [1] Github (jalvesaq/colorout@79931fd)\n digest 0.6.33 2023-07-07 [1] CRAN (R 4.3.0)\n evaluate 0.21 2023-05-05 [1] CRAN (R 4.3.0)\n fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.3.0)\n htmltools 0.5.6 2023-08-10 [1] CRAN (R 4.3.0)\n htmlwidgets 1.6.2 2023-03-17 [1] CRAN (R 4.3.0)\n jsonlite 1.8.7 2023-06-29 [1] CRAN (R 4.3.0)\n knitr 1.43 2023-05-25 [1] CRAN (R 4.3.0)\n rlang 1.1.1 2023-04-28 [1] CRAN (R 4.3.0)\n rmarkdown 2.24 2023-08-14 [1] CRAN (R 4.3.1)\n rstudioapi 0.15.0 2023-07-07 [1] CRAN (R 4.3.0)\n sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.3.0)\n xfun 0.40 2023-08-09 [1] CRAN (R 4.3.0)\n yaml 2.3.7 2023-01-23 [1] CRAN (R 4.3.0)\n\n [1] /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library\n\n──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n```\n:::\n:::\n", "supporting": [], "filters": [ "rmarkdown/pagebreak.lua" diff --git a/_freeze/posts/17-loop-functions/index/execute-results/html.json b/_freeze/posts/17-loop-functions/index/execute-results/html.json index 07a66d5..9941616 100644 --- a/_freeze/posts/17-loop-functions/index/execute-results/html.json +++ b/_freeze/posts/17-loop-functions/index/execute-results/html.json @@ -1,7 +1,7 @@ { - "hash": "d6faa0c6c51529d5dc808757f7036a0a", + "hash": "d7a61d6652db2a9bb07ed8e7a7941d8f", "result": { - "markdown": "---\ntitle: \"17 - Vectorization and loop functionals\"\nauthor:\n - name: Leonardo Collado Torres\n url: http://lcolladotor.github.io/\n affiliations:\n - id: libd\n name: Lieber Institute for Brain Development\n url: https://libd.org/\n - id: jhsph\n name: Johns Hopkins Bloomberg School of Public Health Department of Biostatistics\n url: https://publichealth.jhu.edu/departments/biostatistics\ndescription: \"Introduction to vectorization and loop functionals\"\ncategories: [module 4, week 5, R, programming, functions]\n---\n\n\n*This lecture, as the rest of the course, is adapted from the version [Stephanie C. Hicks](https://www.stephaniehicks.com/) designed and maintained in 2021 and 2022. Check the recent changes to this file through the [GitHub history](https://github.com/lcolladotor/jhustatcomputing2023/commits/main/posts/17-loop-functions/index.qmd).*\n\n\n\n# Pre-lecture materials\n\n### Read ahead\n\n::: callout-note\n## Read ahead\n\n**Before class, you can prepare by reading the following materials:**\n\n1. \n:::\n\n### Acknowledgements\n\nMaterial for this lecture was borrowed and adopted from\n\n- \n- \n\n# Learning objectives\n\n::: callout-note\n# Learning objectives\n\n**At the end of this lesson you will:**\n\n- Understand how to perform vector arithmetics in R\n- Implement the 5 functional loops in R (vs e.g. for loops) in R\n:::\n\n# Vectorization\n\nWriting `for` and `while` loops are useful and easy to understand, but in R we rarely use them.\n\nAs you learn more R, you will realize that **vectorization** is preferred over for-loops since it results in shorter and clearer code.\n\n## Vector arithmetics\n\n### Rescaling a vector\n\nIn R, arithmetic operations on **vectors occur element-wise**. For a quick example, suppose we have height in inches:\n\n\n::: {.cell}\n\n```{.r .cell-code}\ninches <- c(69, 62, 66, 70, 70, 73, 67, 73, 67, 70)\n```\n:::\n\n\nand want to convert to centimeters.\n\nNotice what happens when we multiply inches by 2.54:\n\n\n::: {.cell}\n\n```{.r .cell-code}\ninches * 2.54\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n [1] 175.26 157.48 167.64 177.80 177.80 185.42 170.18 185.42 170.18 177.80\n```\n:::\n:::\n\n\nIn the line above, we **multiplied each element** by 2.54.\n\nSimilarly, if for each entry we want to compute how many inches taller or shorter than 69 inches (the average height for males), we can subtract it from every entry like this:\n\n\n::: {.cell}\n\n```{.r .cell-code}\ninches - 69\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n [1] 0 -7 -3 1 1 4 -2 4 -2 1\n```\n:::\n:::\n\n\n### Two vectors\n\nIf we have **two vectors of the same length**, and we sum them in R, they will be **added entry by entry** as follows:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- 1:10\ny <- 1:10 \nx + y\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n [1] 2 4 6 8 10 12 14 16 18 20\n```\n:::\n:::\n\n\nThe same holds for other mathematical operations, such as `-`, `*` and `/`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- 1:10\nsqrt(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n [1] 1.000000 1.414214 1.732051 2.000000 2.236068 2.449490 2.645751 2.828427\n [9] 3.000000 3.162278\n```\n:::\n:::\n\n::: {.cell}\n\n```{.r .cell-code}\ny <- 1:10\nx*y\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n [1] 1 4 9 16 25 36 49 64 81 100\n```\n:::\n:::\n\n\n# Functional loops\n\nWhile `for` loops are perfectly valid, when you use vectorization in an element-wise fashion, there is no need for `for` loops because we can apply what are called functional loops.\n\n**Functional loops** are functions that help us apply the same function to each entry in a vector, matrix, data frame, or list. Here are a list of them:\n\n- `lapply()`: Loop over a list and evaluate a function on each element\n\n- `sapply()`: Same as `lapply` but try to simplify the result\n\n- `apply()`: Apply a function over the margins of an array\n\n- `tapply()`: Apply a function over subsets of a vector\n\n- `mapply()`: Multivariate version of `lapply` (won't cover)\n\nAn auxiliary function `split()` is also useful, particularly in conjunction with `lapply()`.\n\n## `lapply()`\n\nThe `lapply()` function does the following simple series of operations:\n\n1. it loops over a list, iterating over each element in that list\n2. it applies a *function* to each element of the list (a function that you specify)\n3. and returns a list (the `l` in `lapply()` is for \"list\").\n\nThis function takes three arguments: (1) a list `X`; (2) a function (or the name of a function) `FUN`; (3) other arguments via its `...` argument. If `X` is not a list, it will be coerced to a list using `as.list()`.\n\nThe body of the `lapply()` function can be seen here.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlapply\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nfunction (X, FUN, ...) \n{\n FUN <- match.fun(FUN)\n if (!is.vector(X) || is.object(X)) \n X <- as.list(X)\n .Internal(lapply(X, FUN))\n}\n\n\n```\n:::\n:::\n\n\n::: callout-tip\n### Note\n\nThe actual looping is done internally in C code for efficiency reasons.\n:::\n\nIt is important to remember that `lapply()` always returns a list, regardless of the class of the input.\n\n::: callout-tip\n### Example\n\nHere's an example of applying the `mean()` function to all elements of a list. If the original list has names, the the names will be preserved in the output.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- list(a = 1:5, b = rnorm(10))\nx\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n$a\n[1] 1 2 3 4 5\n\n$b\n [1] 1.2229485 0.1878172 -0.7560246 -0.8520380 1.7012165 -0.6487224\n [7] -0.6863177 0.2483112 -0.4892715 -1.3013705\n```\n:::\n\n```{.r .cell-code}\nlapply(x, mean)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n$a\n[1] 3\n\n$b\n[1] -0.1373451\n```\n:::\n:::\n\n\nNotice that here we are passing the `mean()` function as an argument to the `lapply()` function.\n:::\n\n**Functions in R can be** used this way and can be **passed back and forth as arguments** just like any other object inR.\n\nWhen you pass a function to another function, you do not need to include the open and closed parentheses `()` like you do when you are **calling** a function.\n\n::: callout-tip\n### Example\n\nHere is another example of using `lapply()`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- list(a = 1:4, b = rnorm(10), c = rnorm(20, 1), d = rnorm(100, 5))\nlapply(x, mean)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n$a\n[1] 2.5\n\n$b\n[1] 0.08347435\n\n$c\n[1] 0.7113253\n\n$d\n[1] 5.115736\n```\n:::\n:::\n\n:::\n\nYou can use `lapply()` to evaluate a function multiple times each with a different argument.\n\nNext is an example where I call the `runif()` function (to generate uniformly distributed random variables) four times, each time generating a different number of random numbers.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- 1:4\nlapply(x, runif)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[[1]]\n[1] 0.5243483\n\n[[2]]\n[1] 0.6741892 0.2195450\n\n[[3]]\n[1] 0.5812777 0.9505693 0.7417778\n\n[[4]]\n[1] 0.7255782 0.5353819 0.2978647 0.7711454\n```\n:::\n:::\n\n\n::: callout-tip\n### What happened?\n\nWhen you pass a function to `lapply()`, `lapply()` takes elements of the list and passes them as the *first argument* of the function you are applying.\n\nIn the above example, the first argument of `runif()` is `n`, and so the elements of the sequence `1:4` all got passed to the `n` argument of `runif()`.\n:::\n\nFunctions that you pass to `lapply()` may have other arguments. For example, the `runif()` function has a `min` and `max` argument too.\n\n::: callout-note\n### Question\n\nIn the example above I used the default values for `min` and `max`.\n\n- How would you be able to specify different values for that in the context of `lapply()`?\n:::\n\nHere is where the `...` argument to `lapply()` comes into play. Any arguments that you place in the `...` argument will get passed down to the function being applied to the elements of the list.\n\nHere, the `min = 0` and `max = 10` arguments are passed down to `runif()` every time it gets called.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- 1:4\nlapply(x, runif, min = 0, max = 10)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[[1]]\n[1] 3.788686\n\n[[2]]\n[1] 7.370226 2.895551\n\n[[3]]\n[1] 4.742728 5.781041 7.590877\n\n[[4]]\n[1] 9.5078106 4.9129254 0.9233773 1.9651523\n```\n:::\n:::\n\n\nSo now, instead of the random numbers being between 0 and 1 (the default), the are all between 0 and 10.\n\nThe `lapply()` function (and its friends) makes heavy use of *anonymous* functions. Anonymous functions are like members of [Project Mayhem](http://en.wikipedia.org/wiki/Fight_Club)---they have no names. These functions are generated \"on the fly\" as you are using `lapply()`. Once the call to `lapply()` is finished, the function disappears and does not appear in the workspace.\n\n::: callout-tip\n### Example\n\nHere I am creating a list that contains two matrices.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- list(a = matrix(1:4, 2, 2), b = matrix(1:6, 3, 2)) \nx\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n$a\n [,1] [,2]\n[1,] 1 3\n[2,] 2 4\n\n$b\n [,1] [,2]\n[1,] 1 4\n[2,] 2 5\n[3,] 3 6\n```\n:::\n:::\n\n\nSuppose I wanted to extract the first column of each matrix in the list. I could write an anonymous function for extracting the first column of each matrix.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlapply(x, function(elt) { elt[,1] })\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n$a\n[1] 1 2\n\n$b\n[1] 1 2 3\n```\n:::\n:::\n\n\nNotice that I put the `function()` definition right in the call to `lapply()`.\n:::\n\nThis is perfectly legal and acceptable. You can put an arbitrarily complicated function definition inside `lapply()`, but if it's going to be more complicated, it's probably a better idea to define the function separately.\n\nFor example, I could have done the following.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nf <- function(elt) {\n elt[, 1]\n}\nlapply(x, f)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n$a\n[1] 1 2\n\n$b\n[1] 1 2 3\n```\n:::\n:::\n\n\n::: callout-tip\n### Note\n\nNow the function is no longer anonymous; its name is `f`.\n:::\n\nWhether you use an anonymous function or you define a function first depends on your context. If you think the function `f` is something you are going to need a lot in other parts of your code, you might want to define it separately. But if you are just going to use it for this call to `lapply()`, then it is probably simpler to use an anonymous function.\n\n## `sapply()`\n\nThe `sapply()` function behaves similarly to `lapply()`; the only real difference is in the return value. `sapply()` will try to simplify the result of `lapply()` if possible. Essentially, `sapply()` calls `lapply()` on its input and then applies the following algorithm:\n\n- If the result is a list where every element is length 1, then a vector is returned\n\n- If the result is a list where every element is a vector of the same length (\\> 1), a matrix is returned.\n\n- If it can't figure things out, a list is returned\n\nHere's the result of calling `lapply()`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- list(a = 1:4, b = rnorm(10), c = rnorm(20, 1), d = rnorm(100, 5))\nlapply(x, mean)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n$a\n[1] 2.5\n\n$b\n[1] 0.1887374\n\n$c\n[1] 1.304012\n\n$d\n[1] 5.012149\n```\n:::\n:::\n\n\nNotice that `lapply()` returns a list (as usual), but that each element of the list has length 1.\n\nHere's the result of calling `sapply()` on the same list.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsapply(x, mean) \n```\n\n::: {.cell-output .cell-output-stdout}\n```\n a b c d \n2.5000000 0.1887374 1.3040116 5.0121492 \n```\n:::\n:::\n\n\nBecause the result of `lapply()` was a list where each element had length 1, `sapply()` collapsed the output into a numeric vector, which is often more useful than a list.\n\n## `split()`\n\nThe `split()` function takes a vector or other objects and splits it into groups determined by a factor or list of factors.\n\nThe arguments to `split()` are\n\n\n::: {.cell}\n\n```{.r .cell-code}\nstr(split)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nfunction (x, f, drop = FALSE, ...) \n```\n:::\n:::\n\n\nwhere\n\n- `x` is a vector (or list) or data frame\n- `f` is a factor (or coerced to one) or a list of factors\n- `drop` indicates whether empty factors levels should be dropped\n\nThe combination of `split()` and a function like `lapply()` or `sapply()` is a common paradigm in R. The basic idea is that you can take a data structure, split it into subsets defined by another variable, and apply a function over those subsets. The results of applying that function over the subsets are then collated and returned as an object. This sequence of operations is sometimes referred to as \"map-reduce\" in other contexts.\n\nHere we simulate some data and split it according to a factor variable. Note that we use the `gl()` function to \"generate levels\" in a factor variable.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- c(rnorm(10), runif(10), rnorm(10, 1))\nf <- gl(3, 10) # generate factor levels\nf\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n [1] 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3\nLevels: 1 2 3\n```\n:::\n:::\n\n::: {.cell}\n\n```{.r .cell-code}\nsplit(x, f)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n$`1`\n [1] 0.3894649 -0.9253587 1.4289026 -0.4602414 -0.6726225 3.0199478\n [7] 1.2191391 0.3484649 0.8080023 0.3774965\n\n$`2`\n [1] 0.8782538 0.4346257 0.5970352 0.1635630 0.3839225 0.8525622 0.4988508\n [8] 0.8624590 0.2599047 0.1006897\n\n$`3`\n [1] 0.20936028 -0.17011167 0.34303862 1.04290024 0.80930785 3.20756177\n [7] 0.55197354 0.49465007 0.06888936 -0.41865555\n```\n:::\n:::\n\n\nA common idiom is `split` followed by an `lapply`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlapply(split(x, f), mean)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n$`1`\n[1] 0.5533195\n\n$`2`\n[1] 0.5031867\n\n$`3`\n[1] 0.6138915\n```\n:::\n:::\n\n\n### Splitting a Data Frame\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(datasets)\nhead(airquality)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n Ozone Solar.R Wind Temp Month Day\n1 41 190 7.4 67 5 1\n2 36 118 8.0 72 5 2\n3 12 149 12.6 74 5 3\n4 18 313 11.5 62 5 4\n5 NA NA 14.3 56 5 5\n6 28 NA 14.9 66 5 6\n```\n:::\n:::\n\n\nWe can split the `airquality` data frame by the `Month` variable so that we have separate sub-data frames for each month.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ns <- split(airquality, airquality$Month)\nstr(s)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nList of 5\n $ 5:'data.frame':\t31 obs. of 6 variables:\n ..$ Ozone : int [1:31] 41 36 12 18 NA 28 23 19 8 NA ...\n ..$ Solar.R: int [1:31] 190 118 149 313 NA NA 299 99 19 194 ...\n ..$ Wind : num [1:31] 7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 ...\n ..$ Temp : int [1:31] 67 72 74 62 56 66 65 59 61 69 ...\n ..$ Month : int [1:31] 5 5 5 5 5 5 5 5 5 5 ...\n ..$ Day : int [1:31] 1 2 3 4 5 6 7 8 9 10 ...\n $ 6:'data.frame':\t30 obs. of 6 variables:\n ..$ Ozone : int [1:30] NA NA NA NA NA NA 29 NA 71 39 ...\n ..$ Solar.R: int [1:30] 286 287 242 186 220 264 127 273 291 323 ...\n ..$ Wind : num [1:30] 8.6 9.7 16.1 9.2 8.6 14.3 9.7 6.9 13.8 11.5 ...\n ..$ Temp : int [1:30] 78 74 67 84 85 79 82 87 90 87 ...\n ..$ Month : int [1:30] 6 6 6 6 6 6 6 6 6 6 ...\n ..$ Day : int [1:30] 1 2 3 4 5 6 7 8 9 10 ...\n $ 7:'data.frame':\t31 obs. of 6 variables:\n ..$ Ozone : int [1:31] 135 49 32 NA 64 40 77 97 97 85 ...\n ..$ Solar.R: int [1:31] 269 248 236 101 175 314 276 267 272 175 ...\n ..$ Wind : num [1:31] 4.1 9.2 9.2 10.9 4.6 10.9 5.1 6.3 5.7 7.4 ...\n ..$ Temp : int [1:31] 84 85 81 84 83 83 88 92 92 89 ...\n ..$ Month : int [1:31] 7 7 7 7 7 7 7 7 7 7 ...\n ..$ Day : int [1:31] 1 2 3 4 5 6 7 8 9 10 ...\n $ 8:'data.frame':\t31 obs. of 6 variables:\n ..$ Ozone : int [1:31] 39 9 16 78 35 66 122 89 110 NA ...\n ..$ Solar.R: int [1:31] 83 24 77 NA NA NA 255 229 207 222 ...\n ..$ Wind : num [1:31] 6.9 13.8 7.4 6.9 7.4 4.6 4 10.3 8 8.6 ...\n ..$ Temp : int [1:31] 81 81 82 86 85 87 89 90 90 92 ...\n ..$ Month : int [1:31] 8 8 8 8 8 8 8 8 8 8 ...\n ..$ Day : int [1:31] 1 2 3 4 5 6 7 8 9 10 ...\n $ 9:'data.frame':\t30 obs. of 6 variables:\n ..$ Ozone : int [1:30] 96 78 73 91 47 32 20 23 21 24 ...\n ..$ Solar.R: int [1:30] 167 197 183 189 95 92 252 220 230 259 ...\n ..$ Wind : num [1:30] 6.9 5.1 2.8 4.6 7.4 15.5 10.9 10.3 10.9 9.7 ...\n ..$ Temp : int [1:30] 91 92 93 93 87 84 80 78 75 73 ...\n ..$ Month : int [1:30] 9 9 9 9 9 9 9 9 9 9 ...\n ..$ Day : int [1:30] 1 2 3 4 5 6 7 8 9 10 ...\n```\n:::\n:::\n\n\nThen we can take the column means for `Ozone`, `Solar.R`, and `Wind` for each sub-data frame.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlapply(s, function(x) {\n colMeans(x[, c(\"Ozone\", \"Solar.R\", \"Wind\")])\n})\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n$`5`\n Ozone Solar.R Wind \n NA NA 11.62258 \n\n$`6`\n Ozone Solar.R Wind \n NA 190.16667 10.26667 \n\n$`7`\n Ozone Solar.R Wind \n NA 216.483871 8.941935 \n\n$`8`\n Ozone Solar.R Wind \n NA NA 8.793548 \n\n$`9`\n Ozone Solar.R Wind \n NA 167.4333 10.1800 \n```\n:::\n:::\n\n\nUsing `sapply()` might be better here for a more readable output.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsapply(s, function(x) {\n colMeans(x[, c(\"Ozone\", \"Solar.R\", \"Wind\")])\n})\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n 5 6 7 8 9\nOzone NA NA NA NA NA\nSolar.R NA 190.16667 216.483871 NA 167.4333\nWind 11.62258 10.26667 8.941935 8.793548 10.1800\n```\n:::\n:::\n\n\nUnfortunately, there are `NA`s in the data so we cannot simply take the means of those variables. However, we can tell the `colMeans` function to remove the `NA`s before computing the mean.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsapply(s, function(x) {\n colMeans(x[, c(\"Ozone\", \"Solar.R\", \"Wind\")], \n na.rm = TRUE)\n})\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n 5 6 7 8 9\nOzone 23.61538 29.44444 59.115385 59.961538 31.44828\nSolar.R 181.29630 190.16667 216.483871 171.857143 167.43333\nWind 11.62258 10.26667 8.941935 8.793548 10.18000\n```\n:::\n:::\n\n\n## tapply\n\n`tapply()` is used to apply a function over subsets of a vector. It can be thought of as a combination of `split()` and `sapply()` for vectors only. I've been told that the \"t\" in `tapply()` refers to \"table\", but that is unconfirmed.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nstr(tapply)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nfunction (X, INDEX, FUN = NULL, ..., default = NA, simplify = TRUE) \n```\n:::\n:::\n\n\nThe arguments to `tapply()` are as follows:\n\n- `X` is a vector\n- `INDEX` is a factor or a list of factors (or else they are coerced to factors)\n- `FUN` is a function to be applied\n- ... contains other arguments to be passed `FUN`\n- `simplify`, should we simplify the result?\n\n::: callout-tip\n### Example\n\nGiven a vector of numbers, one simple operation is to take group means.\n\n\n::: {.cell}\n\n```{.r .cell-code}\n## Simulate some data\nx <- c(rnorm(10), runif(10), rnorm(10, 1))\n## Define some groups with a factor variable\nf <- gl(3, 10) \nf\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n [1] 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3\nLevels: 1 2 3\n```\n:::\n\n```{.r .cell-code}\ntapply(x, f, mean)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n 1 2 3 \n0.1087117 0.5112950 1.2957052 \n```\n:::\n:::\n\n:::\n\nWe can also apply functions that return more than a single value. In this case, `tapply()` will not simplify the result and will return a list. Here's an example of finding the `range()` (min and max) of each sub-group.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ntapply(x, f, range)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n$`1`\n[1] -0.8435817 1.0096577\n\n$`2`\n[1] 0.05537228 0.83863420\n\n$`3`\n[1] -0.8717398 2.0814386\n```\n:::\n:::\n\n\n## `apply()`\n\nThe `apply()` function is used to a evaluate a function (often an anonymous one) over the margins of an array. It is most often used to apply a function to the rows or columns of a matrix (which is just a 2-dimensional array). However, it can be used with general arrays, for example, to take the average of an array of matrices. Using `apply()` is not really faster than writing a loop, but it works in one line and is highly compact.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nstr(apply)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nfunction (X, MARGIN, FUN, ..., simplify = TRUE) \n```\n:::\n:::\n\n\nThe arguments to `apply()` are\n\n- `X` is an array\n- `MARGIN` is an integer vector indicating which margins should be \"retained\".\n- `FUN` is a function to be applied\n- `...` is for other arguments to be passed to `FUN`\n\n::: callout-tip\n### Example\n\nHere I create a 20 by 10 matrix of Normal random numbers. I then compute the mean of each column.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- matrix(rnorm(200), 20, 10)\nhead(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n [,1] [,2] [,3] [,4] [,5] [,6]\n[1,] 0.84236865 -0.1124551 -0.7392402 -0.1509353 0.9928648 0.6976390\n[2,] 0.02815865 1.6436612 -1.1889939 -0.4767309 -1.1571802 0.6857492\n[3,] 0.01051357 -0.2242306 0.6610240 0.4123025 -0.2424516 1.3800597\n[4,] 0.72109478 0.2949731 0.9722644 0.7911567 0.5616605 -0.6849934\n[5,] 1.15863939 -0.8584817 0.5789411 1.2627121 -0.5413249 -0.4740383\n[6,] 1.32952051 0.4994495 -0.2406128 -1.2990888 1.1405130 -0.4864257\n [,7] [,8] [,9] [,10]\n[1,] 0.9033576 -0.29090608 0.54385628 -1.5146458\n[2,] 0.6788826 0.92735898 -0.16479486 -2.7966950\n[3,] -2.0091145 -0.01351013 0.60310429 1.4103354\n[4,] 0.2323455 0.83083908 -1.08912322 0.6458769\n[5,] -1.5478440 0.05488507 0.03434319 0.1834132\n[6,] -0.1445403 -0.62788083 0.44295763 -0.2051684\n```\n:::\n\n```{.r .cell-code}\napply(x, 2, mean) ## Take the mean of each column\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n [1] 0.15369716 0.23398541 -0.18962509 -0.05729131 0.01771256 -0.16540884\n [7] -0.16674585 0.40803348 -0.13061682 -0.09736721\n```\n:::\n:::\n\n:::\n\n::: callout-tip\n### Example\n\nI can also compute the sum of each row.\n\n\n::: {.cell}\n\n```{.r .cell-code}\napply(x, 1, sum) ## Take the mean of each row\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n [1] 1.1719039 -1.8205843 1.9880325 3.2760942 -0.1487549 0.4087238\n [7] -4.0732499 2.1231502 0.4270388 -0.9871043 -0.9797849 -3.0278088\n[13] 0.6285069 2.3373183 1.6973524 -3.8844200 4.2352140 -0.3202212\n[19] -1.7755148 -1.1484223\n```\n:::\n:::\n\n:::\n\n::: callout-tip\n### Note\n\nIn both calls to `apply()`, the return value was a vector of numbers.\n:::\n\nYou've probably noticed that the second argument is either a 1 or a 2, depending on whether we want row statistics or column statistics. What exactly *is* the second argument to `apply()`?\n\nThe `MARGIN` argument essentially indicates to `apply()` which dimension of the array you want to preserve or retain.\n\nSo when taking the mean of each column, I specify\n\n\n::: {.cell}\n\n```{.r .cell-code}\napply(x, 2, mean)\n```\n:::\n\n\nbecause I want to collapse the first dimension (the rows) by taking the mean and I want to preserve the number of columns. Similarly, when I want the row sums, I run\n\n\n::: {.cell}\n\n```{.r .cell-code}\napply(x, 1, mean)\n```\n:::\n\n\nbecause I want to collapse the columns (the second dimension) and preserve the number of rows (the first dimension).\n\n### Col/Row Sums and Means\n\n::: callout-tip\n### Pro-tip\n\nFor the special case of column/row sums and column/row means of matrices, we have some useful shortcuts.\n\n- `rowSums` = `apply(x, 1, sum)`\n- `rowMeans` = `apply(x, 1, mean)`\n- `colSums` = `apply(x, 2, sum)`\n- `colMeans` = `apply(x, 2, mean)`\n:::\n\nThe shortcut functions are heavily optimized and hence are **much** faster, but you probably won't notice unless you're using a large matrix.\n\nAnother nice aspect of these functions is that they are a bit more descriptive. It's arguably more clear to write `colMeans(x)` in your code than `apply(x, 2, mean)`.\n\n### Other Ways to Apply\n\nYou can do more than take sums and means with the `apply()` function.\n\n::: callout-tip\n### Example\n\nFor example, you can compute quantiles of the rows of a matrix using the `quantile()` function.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- matrix(rnorm(200), 20, 10)\nhead(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n [,1] [,2] [,3] [,4] [,5] [,6]\n[1,] -0.8222286 -0.06264826 0.4138949 -1.4608268 0.67442318 -0.24230780\n[2,] -0.1836086 -0.35550379 1.0199434 -0.2441630 -0.46562697 0.09719075\n[3,] 1.6292807 -1.49980763 -2.3034693 -0.6154384 -0.04040846 0.21809278\n[4,] -0.5413514 0.58643377 0.8135796 1.7305934 0.69119103 0.33314754\n[5,] -0.9640885 0.38238569 0.2424066 -0.4919602 0.90386972 1.13194597\n[6,] -0.1440487 1.68226290 2.2330038 -0.4490778 0.08801544 -1.29481321\n [,7] [,8] [,9] [,10]\n[1,] -0.38935245 -0.77293702 0.07677024 0.12423212\n[2,] 0.06646333 0.28363323 -0.11256258 1.18545766\n[3,] 0.22432215 -0.09068388 0.71109748 -0.09385239\n[4,] 0.89742043 -0.70635739 1.58637686 -1.89408900\n[5,] 1.28360089 0.08283728 -0.43722835 -0.60018278\n[6,] -1.15045126 -2.19382879 -0.20375594 -0.32560297\n```\n:::\n\n```{.r .cell-code}\n## Get row quantiles\napply(x, 1, quantile, probs = c(0.25, 0.75)) \n```\n\n::: {.cell-output .cell-output-stdout}\n```\n [,1] [,2] [,3] [,4] [,5] [,6]\n25% -0.6770409 -0.2290244 -0.4850419 -0.3227267 -0.4782773 -0.97510790\n75% 0.1123667 0.2370226 0.2227648 0.8764602 0.7734987 0.02999941\n [,7] [,8] [,9] [,10] [,11] [,12]\n25% -0.64819251 -0.05986007 -1.2978967 -1.11450694 -0.4172096 -1.2630159\n75% 0.04747862 0.38562818 0.2370868 -0.08617673 0.7178610 0.9225057\n [,13] [,14] [,15] [,16] [,17] [,18]\n25% -0.4066897 -0.7840147 -0.9955023 -0.4760713 -0.9869851 -1.36026776\n75% 0.7307004 0.3125165 0.9180706 0.8888653 0.8109465 0.04670028\n [,19] [,20]\n25% -0.5785061 -0.4817867\n75% 0.3695974 0.5743219\n```\n:::\n:::\n\n\nNotice that I had to pass the `probs = c(0.25, 0.75)` argument to `quantile()` via the `...` argument to `apply()`.\n:::\n\n## Vectorizing a Function\n\nLet's talk about how we can **\"vectorize\" a function**.\n\nWhat this means is that we can write function that typically only takes single arguments and create a new function that can take vector arguments.\n\nThis is often needed when you want to plot functions.\n\n::: callout-tip\n### Example\n\nHere's an example of a function that computes the sum of squares given some data, a mean parameter and a standard deviation. The formula is $\\sum_{i=1}^n(x_i-\\mu)^2/\\sigma^2$.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsumsq <- function(mu, sigma, x) {\n sum(((x - mu) / sigma)^2)\n}\n```\n:::\n\n\nThis function takes a mean `mu`, a standard deviation `sigma`, and some data in a vector `x`.\n\nIn many statistical applications, we want to minimize the sum of squares to find the optimal `mu` and `sigma`. Before we do that, we may want to evaluate or plot the function for many different values of `mu` or `sigma`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- rnorm(100) ## Generate some data\nsumsq(mu=1, sigma=1, x) ## This works (returns one value)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 167.2459\n```\n:::\n:::\n\n\nHowever, passing a vector of `mu`s or `sigma`s won't work with this function because it's not vectorized.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsumsq(1:10, 1:10, x) ## This is not what we want\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 107.6407\n```\n:::\n:::\n\n:::\n\nThere's even a function in R called `Vectorize()` that **automatically can create a vectorized version of your function**.\n\nSo we could create a `vsumsq()` function that is fully vectorized as follows.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nvsumsq <- Vectorize(sumsq, c(\"mu\", \"sigma\"))\nvsumsq(1:10, 1:10, x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n [1] 167.24586 113.22134 104.28054 101.51027 100.39215 99.87343 99.61394\n [8] 99.48004 99.41187 99.38001\n```\n:::\n:::\n\n\nPretty cool, right?\n\n# Summary\n\n- The loop functions in R are very powerful because they allow you to conduct a series of operations on data using a compact form\n\n- The operation of a loop function involves iterating over an R object (e.g. a list or vector or matrix), applying a function to each element of the object, and the collating the results and returning the collated results.\n\n- Loop functions make heavy use of anonymous functions, which exist for the life of the loop function but are not stored anywhere\n\n- The `split()` function can be used to divide an R object in to subsets determined by another variable which can subsequently be looped over using loop functions.\n\n# Post-lecture materials\n\n### Final Questions\n\nHere are some post-lecture questions to help you think about the material discussed.\n\n::: callout-note\n### Questions\n\n1. Write a function `compute_s_n()` that for any given `n` computes the sum\n\n$$\nS_n = 1^2 + 2^2 + 3^2 + \\ldots + n^2\n$$\n\nReport the value of the sum when $n$ = 10.\n\n2. Define an empty numerical vector `s_n` of size 25 using `s_n <- vector(\"numeric\", 25)` and store in the results of $S_1, S_2, \\ldots, S_n$ using a for-loop.\n\n3. Repeat Q3, but this time use `sapply()`.\n\n4. Plot `s_n` versus `n`. Use points defined by $n= 1, \\ldots, 25$\n:::\n\n### Additional Resources\n\n::: callout-tip\n- \n- \n:::\n\n# R session information\n\n\n::: {.cell}\n\n```{.r .cell-code}\noptions(width = 120)\nsessioninfo::session_info()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────\n setting value\n version R version 4.3.1 (2023-06-16)\n os macOS Ventura 13.5\n system aarch64, darwin20\n ui X11\n language (EN)\n collate en_US.UTF-8\n ctype en_US.UTF-8\n tz America/New_York\n date 2023-08-17\n pandoc 3.1.5 @ /opt/homebrew/bin/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────\n package * version date (UTC) lib source\n cli 3.6.1 2023-03-23 [1] CRAN (R 4.3.0)\n colorout 1.2-2 2023-05-06 [1] Github (jalvesaq/colorout@79931fd)\n digest 0.6.33 2023-07-07 [1] CRAN (R 4.3.0)\n evaluate 0.21 2023-05-05 [1] CRAN (R 4.3.0)\n fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.3.0)\n htmltools 0.5.6 2023-08-10 [1] CRAN (R 4.3.0)\n htmlwidgets 1.6.2 2023-03-17 [1] CRAN (R 4.3.0)\n jsonlite 1.8.7 2023-06-29 [1] CRAN (R 4.3.0)\n knitr 1.43 2023-05-25 [1] CRAN (R 4.3.0)\n rlang 1.1.1 2023-04-28 [1] CRAN (R 4.3.0)\n rmarkdown 2.24 2023-08-14 [1] CRAN (R 4.3.1)\n rstudioapi 0.15.0 2023-07-07 [1] CRAN (R 4.3.0)\n sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.3.0)\n xfun 0.40 2023-08-09 [1] CRAN (R 4.3.0)\n yaml 2.3.7 2023-01-23 [1] CRAN (R 4.3.0)\n\n [1] /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library\n\n──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n```\n:::\n:::\n", + "markdown": "---\ntitle: \"17 - Vectorization and loop functionals\"\nauthor:\n - name: Leonardo Collado Torres\n url: http://lcolladotor.github.io/\n affiliations:\n - id: libd\n name: Lieber Institute for Brain Development\n url: https://libd.org/\n - id: jhsph\n name: Johns Hopkins Bloomberg School of Public Health Department of Biostatistics\n url: https://publichealth.jhu.edu/departments/biostatistics\ndescription: \"Introduction to vectorization and loop functionals\"\ncategories: [module 4, week 5, R, programming, functions]\n---\n\n\n*This lecture, as the rest of the course, is adapted from the version [Stephanie C. Hicks](https://www.stephaniehicks.com/) designed and maintained in 2021 and 2022. Check the recent changes to this file through the [GitHub history](https://github.com/lcolladotor/jhustatcomputing2023/commits/main/posts/17-loop-functions/index.qmd).*\n\n\n\n# Pre-lecture materials\n\n### Read ahead\n\n::: callout-note\n## Read ahead\n\n**Before class, you can prepare by reading the following materials:**\n\n1. \n:::\n\n### Acknowledgements\n\nMaterial for this lecture was borrowed and adopted from\n\n- \n- \n\n# Learning objectives\n\n::: callout-note\n# Learning objectives\n\n**At the end of this lesson you will:**\n\n- Understand how to perform vector arithmetics in R\n- Implement the 5 functional loops in R (vs e.g. for loops) in R\n:::\n\n# Vectorization\n\nWriting `for` and `while` loops are useful and easy to understand, but in R we rarely use them.\n\nAs you learn more R, you will realize that **vectorization** is preferred over for-loops since it results in shorter and clearer code.\n\n## Vector arithmetics\n\n### Rescaling a vector\n\nIn R, arithmetic operations on **vectors occur element-wise**. For a quick example, suppose we have height in inches:\n\n\n::: {.cell}\n\n```{.r .cell-code}\ninches <- c(69, 62, 66, 70, 70, 73, 67, 73, 67, 70)\n```\n:::\n\n\nand want to convert to centimeters.\n\nNotice what happens when we multiply inches by 2.54:\n\n\n::: {.cell}\n\n```{.r .cell-code}\ninches * 2.54\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n [1] 175.26 157.48 167.64 177.80 177.80 185.42 170.18 185.42 170.18 177.80\n```\n:::\n:::\n\n\nIn the line above, we **multiplied each element** by 2.54.\n\nSimilarly, if for each entry we want to compute how many inches taller or shorter than 69 inches (the average height for males), we can subtract it from every entry like this:\n\n\n::: {.cell}\n\n```{.r .cell-code}\ninches - 69\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n [1] 0 -7 -3 1 1 4 -2 4 -2 1\n```\n:::\n:::\n\n\n### Two vectors\n\nIf we have **two vectors of the same length**, and we sum them in R, they will be **added entry by entry** as follows:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- 1:10\ny <- 1:10\nx + y\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n [1] 2 4 6 8 10 12 14 16 18 20\n```\n:::\n:::\n\n\nThe same holds for other mathematical operations, such as `-`, `*` and `/`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- 1:10\nsqrt(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n [1] 1.000000 1.414214 1.732051 2.000000 2.236068 2.449490 2.645751 2.828427\n [9] 3.000000 3.162278\n```\n:::\n:::\n\n::: {.cell}\n\n```{.r .cell-code}\ny <- 1:10\nx * y\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n [1] 1 4 9 16 25 36 49 64 81 100\n```\n:::\n:::\n\n\n# Functional loops\n\nWhile `for` loops are perfectly valid, when you use vectorization in an element-wise fashion, there is no need for `for` loops because we can apply what are called functional loops.\n\n**Functional loops** are functions that help us apply the same function to each entry in a vector, matrix, data frame, or list. Here are a list of them:\n\n- `lapply()`: Loop over a list and evaluate a function on each element\n\n- `sapply()`: Same as `lapply` but try to simplify the result\n\n- `apply()`: Apply a function over the margins of an array\n\n- `tapply()`: Apply a function over subsets of a vector\n\n- `mapply()`: Multivariate version of `lapply` (won't cover)\n\nAn auxiliary function `split()` is also useful, particularly in conjunction with `lapply()`.\n\n## `lapply()`\n\nThe `lapply()` function does the following simple series of operations:\n\n1. it loops over a list, iterating over each element in that list\n2. it applies a *function* to each element of the list (a function that you specify)\n3. and returns a list (the `l` in `lapply()` is for \"list\").\n\nThis function takes three arguments: (1) a list `X`; (2) a function (or the name of a function) `FUN`; (3) other arguments via its `...` argument. If `X` is not a list, it will be coerced to a list using `as.list()`.\n\nThe body of the `lapply()` function can be seen here.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlapply\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nfunction (X, FUN, ...) \n{\n FUN <- match.fun(FUN)\n if (!is.vector(X) || is.object(X)) \n X <- as.list(X)\n .Internal(lapply(X, FUN))\n}\n\n\n```\n:::\n:::\n\n\n::: callout-tip\n### Note\n\nThe actual looping is done internally in C code for efficiency reasons.\n:::\n\nIt is important to remember that `lapply()` always returns a list, regardless of the class of the input.\n\n::: callout-tip\n### Example\n\nHere's an example of applying the `mean()` function to all elements of a list. If the original list has names, the the names will be preserved in the output.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- list(a = 1:5, b = rnorm(10))\nx\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n$a\n[1] 1 2 3 4 5\n\n$b\n [1] -0.6113707 0.5950531 0.6319343 0.5595441 0.3188799 -0.4400711\n [7] 1.6687028 0.4501791 1.4356856 -0.3858270\n```\n:::\n\n```{.r .cell-code}\nlapply(x, mean)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n$a\n[1] 3\n\n$b\n[1] 0.422271\n```\n:::\n:::\n\n\nNotice that here we are passing the `mean()` function as an argument to the `lapply()` function.\n:::\n\n**Functions in R can be** used this way and can be **passed back and forth as arguments** just like any other object inR.\n\nWhen you pass a function to another function, you do not need to include the open and closed parentheses `()` like you do when you are **calling** a function.\n\n::: callout-tip\n### Example\n\nHere is another example of using `lapply()`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- list(a = 1:4, b = rnorm(10), c = rnorm(20, 1), d = rnorm(100, 5))\nlapply(x, mean)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n$a\n[1] 2.5\n\n$b\n[1] 0.1655327\n\n$c\n[1] 0.9767504\n\n$d\n[1] 4.951283\n```\n:::\n:::\n\n:::\n\nYou can use `lapply()` to evaluate a function multiple times each with a different argument.\n\nNext is an example where I call the `runif()` function (to generate uniformly distributed random variables) four times, each time generating a different number of random numbers.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- 1:4\nlapply(x, runif)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[[1]]\n[1] 0.5924944\n\n[[2]]\n[1] 0.8660588 0.3277243\n\n[[3]]\n[1] 0.5009080 0.2951163 0.6264905\n\n[[4]]\n[1] 0.04282267 0.14951908 0.82034538 0.64614463\n```\n:::\n:::\n\n\n::: callout-tip\n### What happened?\n\nWhen you pass a function to `lapply()`, `lapply()` takes elements of the list and passes them as the *first argument* of the function you are applying.\n\nIn the above example, the first argument of `runif()` is `n`, and so the elements of the sequence `1:4` all got passed to the `n` argument of `runif()`.\n:::\n\nFunctions that you pass to `lapply()` may have other arguments. For example, the `runif()` function has a `min` and `max` argument too.\n\n::: callout-note\n### Question\n\nIn the example above I used the default values for `min` and `max`.\n\n- How would you be able to specify different values for that in the context of `lapply()`?\n:::\n\nHere is where the `...` argument to `lapply()` comes into play. Any arguments that you place in the `...` argument will get passed down to the function being applied to the elements of the list.\n\nHere, the `min = 0` and `max = 10` arguments are passed down to `runif()` every time it gets called.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- 1:4\nlapply(x, runif, min = 0, max = 10)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[[1]]\n[1] 5.653385\n\n[[2]]\n[1] 8.325503 7.234466\n\n[[3]]\n[1] 5.968981 9.174316 7.920678\n\n[[4]]\n[1] 9.491500 3.023649 2.990945 8.757496\n```\n:::\n:::\n\n\nSo now, instead of the random numbers being between 0 and 1 (the default), the are all between 0 and 10.\n\nThe `lapply()` function (and its friends) makes heavy use of *anonymous* functions. Anonymous functions are like members of [Project Mayhem](http://en.wikipedia.org/wiki/Fight_Club)---they have no names. These functions are generated \"on the fly\" as you are using `lapply()`. Once the call to `lapply()` is finished, the function disappears and does not appear in the workspace.\n\n::: callout-tip\n### Example\n\nHere I am creating a list that contains two matrices.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- list(a = matrix(1:4, 2, 2), b = matrix(1:6, 3, 2))\nx\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n$a\n [,1] [,2]\n[1,] 1 3\n[2,] 2 4\n\n$b\n [,1] [,2]\n[1,] 1 4\n[2,] 2 5\n[3,] 3 6\n```\n:::\n:::\n\n\nSuppose I wanted to extract the first column of each matrix in the list. I could write an anonymous function for extracting the first column of each matrix.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlapply(x, function(elt) {\n elt[, 1]\n})\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n$a\n[1] 1 2\n\n$b\n[1] 1 2 3\n```\n:::\n:::\n\n\nNotice that I put the `function()` definition right in the call to `lapply()`.\n:::\n\nThis is perfectly legal and acceptable. You can put an arbitrarily complicated function definition inside `lapply()`, but if it's going to be more complicated, it's probably a better idea to define the function separately.\n\nFor example, I could have done the following.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nf <- function(elt) {\n elt[, 1]\n}\nlapply(x, f)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n$a\n[1] 1 2\n\n$b\n[1] 1 2 3\n```\n:::\n:::\n\n\n::: callout-tip\n### Note\n\nNow the function is no longer anonymous; its name is `f`.\n:::\n\nWhether you use an anonymous function or you define a function first depends on your context. If you think the function `f` is something you are going to need a lot in other parts of your code, you might want to define it separately. But if you are just going to use it for this call to `lapply()`, then it is probably simpler to use an anonymous function.\n\n## `sapply()`\n\nThe `sapply()` function behaves similarly to `lapply()`; the only real difference is in the return value. `sapply()` will try to simplify the result of `lapply()` if possible. Essentially, `sapply()` calls `lapply()` on its input and then applies the following algorithm:\n\n- If the result is a list where every element is length 1, then a vector is returned\n\n- If the result is a list where every element is a vector of the same length (\\> 1), a matrix is returned.\n\n- If it can't figure things out, a list is returned\n\nHere's the result of calling `lapply()`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- list(a = 1:4, b = rnorm(10), c = rnorm(20, 1), d = rnorm(100, 5))\nlapply(x, mean)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n$a\n[1] 2.5\n\n$b\n[1] -0.1478465\n\n$c\n[1] 0.819794\n\n$d\n[1] 4.954484\n```\n:::\n:::\n\n\nNotice that `lapply()` returns a list (as usual), but that each element of the list has length 1.\n\nHere's the result of calling `sapply()` on the same list.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsapply(x, mean)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n a b c d \n 2.5000000 -0.1478465 0.8197940 4.9544836 \n```\n:::\n:::\n\n\nBecause the result of `lapply()` was a list where each element had length 1, `sapply()` collapsed the output into a numeric vector, which is often more useful than a list.\n\n## `split()`\n\nThe `split()` function takes a vector or other objects and splits it into groups determined by a factor or list of factors.\n\nThe arguments to `split()` are\n\n\n::: {.cell}\n\n```{.r .cell-code}\nstr(split)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nfunction (x, f, drop = FALSE, ...) \n```\n:::\n:::\n\n\nwhere\n\n- `x` is a vector (or list) or data frame\n- `f` is a factor (or coerced to one) or a list of factors\n- `drop` indicates whether empty factors levels should be dropped\n\nThe combination of `split()` and a function like `lapply()` or `sapply()` is a common paradigm in R. The basic idea is that you can take a data structure, split it into subsets defined by another variable, and apply a function over those subsets. The results of applying that function over the subsets are then collated and returned as an object. This sequence of operations is sometimes referred to as \"map-reduce\" in other contexts.\n\nHere we simulate some data and split it according to a factor variable. Note that we use the `gl()` function to \"generate levels\" in a factor variable.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- c(rnorm(10), runif(10), rnorm(10, 1))\nf <- gl(3, 10) # generate factor levels\nf\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n [1] 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3\nLevels: 1 2 3\n```\n:::\n:::\n\n::: {.cell}\n\n```{.r .cell-code}\nsplit(x, f)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n$`1`\n [1] 0.78541247 -0.06267966 -0.89713180 0.11796725 0.66689447 -0.02523006\n [7] -0.19081948 0.44974528 -0.51005146 -0.08103298\n\n$`2`\n [1] 0.29977033 0.31873253 0.53182993 0.85507540 0.21585775 0.89867742\n [7] 0.78109747 0.06887742 0.79661568 0.60022565\n\n$`3`\n [1] -0.38262045 0.06294368 0.41768485 1.57972821 1.17555228 1.47374130\n [7] 1.79199913 2.25569283 1.55226509 -1.51811384\n```\n:::\n:::\n\n\nA common idiom is `split` followed by an `lapply`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlapply(split(x, f), mean)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n$`1`\n[1] 0.0253074\n\n$`2`\n[1] 0.536676\n\n$`3`\n[1] 0.8408873\n```\n:::\n:::\n\n\n### Splitting a Data Frame\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(datasets)\nhead(airquality)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n Ozone Solar.R Wind Temp Month Day\n1 41 190 7.4 67 5 1\n2 36 118 8.0 72 5 2\n3 12 149 12.6 74 5 3\n4 18 313 11.5 62 5 4\n5 NA NA 14.3 56 5 5\n6 28 NA 14.9 66 5 6\n```\n:::\n:::\n\n\nWe can split the `airquality` data frame by the `Month` variable so that we have separate sub-data frames for each month.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ns <- split(airquality, airquality$Month)\nstr(s)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nList of 5\n $ 5:'data.frame':\t31 obs. of 6 variables:\n ..$ Ozone : int [1:31] 41 36 12 18 NA 28 23 19 8 NA ...\n ..$ Solar.R: int [1:31] 190 118 149 313 NA NA 299 99 19 194 ...\n ..$ Wind : num [1:31] 7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 ...\n ..$ Temp : int [1:31] 67 72 74 62 56 66 65 59 61 69 ...\n ..$ Month : int [1:31] 5 5 5 5 5 5 5 5 5 5 ...\n ..$ Day : int [1:31] 1 2 3 4 5 6 7 8 9 10 ...\n $ 6:'data.frame':\t30 obs. of 6 variables:\n ..$ Ozone : int [1:30] NA NA NA NA NA NA 29 NA 71 39 ...\n ..$ Solar.R: int [1:30] 286 287 242 186 220 264 127 273 291 323 ...\n ..$ Wind : num [1:30] 8.6 9.7 16.1 9.2 8.6 14.3 9.7 6.9 13.8 11.5 ...\n ..$ Temp : int [1:30] 78 74 67 84 85 79 82 87 90 87 ...\n ..$ Month : int [1:30] 6 6 6 6 6 6 6 6 6 6 ...\n ..$ Day : int [1:30] 1 2 3 4 5 6 7 8 9 10 ...\n $ 7:'data.frame':\t31 obs. of 6 variables:\n ..$ Ozone : int [1:31] 135 49 32 NA 64 40 77 97 97 85 ...\n ..$ Solar.R: int [1:31] 269 248 236 101 175 314 276 267 272 175 ...\n ..$ Wind : num [1:31] 4.1 9.2 9.2 10.9 4.6 10.9 5.1 6.3 5.7 7.4 ...\n ..$ Temp : int [1:31] 84 85 81 84 83 83 88 92 92 89 ...\n ..$ Month : int [1:31] 7 7 7 7 7 7 7 7 7 7 ...\n ..$ Day : int [1:31] 1 2 3 4 5 6 7 8 9 10 ...\n $ 8:'data.frame':\t31 obs. of 6 variables:\n ..$ Ozone : int [1:31] 39 9 16 78 35 66 122 89 110 NA ...\n ..$ Solar.R: int [1:31] 83 24 77 NA NA NA 255 229 207 222 ...\n ..$ Wind : num [1:31] 6.9 13.8 7.4 6.9 7.4 4.6 4 10.3 8 8.6 ...\n ..$ Temp : int [1:31] 81 81 82 86 85 87 89 90 90 92 ...\n ..$ Month : int [1:31] 8 8 8 8 8 8 8 8 8 8 ...\n ..$ Day : int [1:31] 1 2 3 4 5 6 7 8 9 10 ...\n $ 9:'data.frame':\t30 obs. of 6 variables:\n ..$ Ozone : int [1:30] 96 78 73 91 47 32 20 23 21 24 ...\n ..$ Solar.R: int [1:30] 167 197 183 189 95 92 252 220 230 259 ...\n ..$ Wind : num [1:30] 6.9 5.1 2.8 4.6 7.4 15.5 10.9 10.3 10.9 9.7 ...\n ..$ Temp : int [1:30] 91 92 93 93 87 84 80 78 75 73 ...\n ..$ Month : int [1:30] 9 9 9 9 9 9 9 9 9 9 ...\n ..$ Day : int [1:30] 1 2 3 4 5 6 7 8 9 10 ...\n```\n:::\n:::\n\n\nThen we can take the column means for `Ozone`, `Solar.R`, and `Wind` for each sub-data frame.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlapply(s, function(x) {\n colMeans(x[, c(\"Ozone\", \"Solar.R\", \"Wind\")])\n})\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n$`5`\n Ozone Solar.R Wind \n NA NA 11.62258 \n\n$`6`\n Ozone Solar.R Wind \n NA 190.16667 10.26667 \n\n$`7`\n Ozone Solar.R Wind \n NA 216.483871 8.941935 \n\n$`8`\n Ozone Solar.R Wind \n NA NA 8.793548 \n\n$`9`\n Ozone Solar.R Wind \n NA 167.4333 10.1800 \n```\n:::\n:::\n\n\nUsing `sapply()` might be better here for a more readable output.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsapply(s, function(x) {\n colMeans(x[, c(\"Ozone\", \"Solar.R\", \"Wind\")])\n})\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n 5 6 7 8 9\nOzone NA NA NA NA NA\nSolar.R NA 190.16667 216.483871 NA 167.4333\nWind 11.62258 10.26667 8.941935 8.793548 10.1800\n```\n:::\n:::\n\n\nUnfortunately, there are `NA`s in the data so we cannot simply take the means of those variables. However, we can tell the `colMeans` function to remove the `NA`s before computing the mean.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsapply(s, function(x) {\n colMeans(x[, c(\"Ozone\", \"Solar.R\", \"Wind\")],\n na.rm = TRUE\n )\n})\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n 5 6 7 8 9\nOzone 23.61538 29.44444 59.115385 59.961538 31.44828\nSolar.R 181.29630 190.16667 216.483871 171.857143 167.43333\nWind 11.62258 10.26667 8.941935 8.793548 10.18000\n```\n:::\n:::\n\n\n## tapply\n\n`tapply()` is used to apply a function over subsets of a vector. It can be thought of as a combination of `split()` and `sapply()` for vectors only. I've been told that the \"t\" in `tapply()` refers to \"table\", but that is unconfirmed.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nstr(tapply)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nfunction (X, INDEX, FUN = NULL, ..., default = NA, simplify = TRUE) \n```\n:::\n:::\n\n\nThe arguments to `tapply()` are as follows:\n\n- `X` is a vector\n- `INDEX` is a factor or a list of factors (or else they are coerced to factors)\n- `FUN` is a function to be applied\n- ... contains other arguments to be passed `FUN`\n- `simplify`, should we simplify the result?\n\n::: callout-tip\n### Example\n\nGiven a vector of numbers, one simple operation is to take group means.\n\n\n::: {.cell}\n\n```{.r .cell-code}\n## Simulate some data\nx <- c(rnorm(10), runif(10), rnorm(10, 1))\n## Define some groups with a factor variable\nf <- gl(3, 10)\nf\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n [1] 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3\nLevels: 1 2 3\n```\n:::\n\n```{.r .cell-code}\ntapply(x, f, mean)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n 1 2 3 \n0.3554738 0.5195466 0.6764006 \n```\n:::\n:::\n\n:::\n\nWe can also apply functions that return more than a single value. In this case, `tapply()` will not simplify the result and will return a list. Here's an example of finding the `range()` (min and max) of each sub-group.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ntapply(x, f, range)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n$`1`\n[1] -1.431912 2.695089\n\n$`2`\n[1] 0.1263379 0.8959040\n\n$`3`\n[1] -1.207741 1.696309\n```\n:::\n:::\n\n\n## `apply()`\n\nThe `apply()` function is used to a evaluate a function (often an anonymous one) over the margins of an array. It is most often used to apply a function to the rows or columns of a matrix (which is just a 2-dimensional array). However, it can be used with general arrays, for example, to take the average of an array of matrices. Using `apply()` is not really faster than writing a loop, but it works in one line and is highly compact.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nstr(apply)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nfunction (X, MARGIN, FUN, ..., simplify = TRUE) \n```\n:::\n:::\n\n\nThe arguments to `apply()` are\n\n- `X` is an array\n- `MARGIN` is an integer vector indicating which margins should be \"retained\".\n- `FUN` is a function to be applied\n- `...` is for other arguments to be passed to `FUN`\n\n::: callout-tip\n### Example\n\nHere I create a 20 by 10 matrix of Normal random numbers. I then compute the mean of each column.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- matrix(rnorm(200), 20, 10)\nhead(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n [,1] [,2] [,3] [,4] [,5] [,6]\n[1,] 1.589728 0.7733454 -1.3311072 -0.77084025 -0.1947478 0.1748546\n[2,] 2.395088 0.3243910 -1.5133366 0.09199955 0.3850993 0.1851718\n[3,] 1.039643 -2.1721402 -0.9933217 -1.89261272 0.1748050 1.0563987\n[4,] -1.580978 -0.9884235 -1.4976744 -0.51011200 -2.7512079 0.5547477\n[5,] 1.264799 -2.0551874 0.4483417 -3.08561764 -0.1549359 -0.8384706\n[6,] 1.756973 0.9244522 0.2740854 -0.61441465 -1.0661350 1.4497808\n [,7] [,8] [,9] [,10]\n[1,] 0.7163086 -0.01817166 0.2193225 -0.3346788\n[2,] 0.7606851 0.42082416 0.1099027 0.2834439\n[3,] -1.1218204 -1.17000278 0.4302792 -0.5684986\n[4,] 0.6082452 0.46763465 -0.3481830 -0.1765517\n[5,] -0.7460224 -0.01123782 1.8116342 -0.1033175\n[6,] 1.0160202 -0.82361401 -0.1616471 -0.1628032\n```\n:::\n\n```{.r .cell-code}\napply(x, 2, mean) ## Take the mean of each column\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n [1] 0.083759441 -0.134507982 -0.246473461 -0.371270102 -0.078433882\n [6] -0.101665531 -0.007126106 -0.003193726 0.114767264 0.070612124\n```\n:::\n:::\n\n:::\n\n::: callout-tip\n### Example\n\nI can also compute the sum of each row.\n\n\n::: {.cell}\n\n```{.r .cell-code}\napply(x, 1, sum) ## Take the mean of each row\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n [1] 0.82401382 3.44326903 -5.21727094 -6.22250299 -3.47001414 2.59269751\n [7] -1.76049948 -0.54534465 1.26993157 -0.05660623 1.89101638 2.60154094\n[13] -0.80804188 1.96321614 -2.68869045 0.56525640 0.44214056 -4.25890694\n[19] -3.02509115 -1.01075274\n```\n:::\n:::\n\n:::\n\n::: callout-tip\n### Note\n\nIn both calls to `apply()`, the return value was a vector of numbers.\n:::\n\nYou've probably noticed that the second argument is either a 1 or a 2, depending on whether we want row statistics or column statistics. What exactly *is* the second argument to `apply()`?\n\nThe `MARGIN` argument essentially indicates to `apply()` which dimension of the array you want to preserve or retain.\n\nSo when taking the mean of each column, I specify\n\n\n::: {.cell}\n\n```{.r .cell-code}\napply(x, 2, mean)\n```\n:::\n\n\nbecause I want to collapse the first dimension (the rows) by taking the mean and I want to preserve the number of columns. Similarly, when I want the row sums, I run\n\n\n::: {.cell}\n\n```{.r .cell-code}\napply(x, 1, mean)\n```\n:::\n\n\nbecause I want to collapse the columns (the second dimension) and preserve the number of rows (the first dimension).\n\n### Col/Row Sums and Means\n\n::: callout-tip\n### Pro-tip\n\nFor the special case of column/row sums and column/row means of matrices, we have some useful shortcuts.\n\n- `rowSums` = `apply(x, 1, sum)`\n- `rowMeans` = `apply(x, 1, mean)`\n- `colSums` = `apply(x, 2, sum)`\n- `colMeans` = `apply(x, 2, mean)`\n:::\n\nThe shortcut functions are heavily optimized and hence are **much** faster, but you probably won't notice unless you're using a large matrix.\n\nAnother nice aspect of these functions is that they are a bit more descriptive. It's arguably more clear to write `colMeans(x)` in your code than `apply(x, 2, mean)`.\n\n### Other Ways to Apply\n\nYou can do more than take sums and means with the `apply()` function.\n\n::: callout-tip\n### Example\n\nFor example, you can compute quantiles of the rows of a matrix using the `quantile()` function.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- matrix(rnorm(200), 20, 10)\nhead(x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n [,1] [,2] [,3] [,4] [,5] [,6]\n[1,] 0.58654399 -0.502546440 1.1493478 0.6257709 -0.02866237 1.490139530\n[2,] -0.14969248 0.327632870 0.0202589 0.2889600 -0.16552218 -0.829703298\n[3,] 1.12561766 0.707836011 0.6038607 -0.6722613 0.85092968 0.550785886\n[4,] -1.71719604 0.554424755 0.4229181 0.1484968 0.22134369 0.258853355\n[5,] 0.31827641 1.555568589 0.8971850 -0.7742244 0.45459793 -0.043814576\n[6,] -0.08429415 0.001737282 0.1906608 1.1145869 0.54156791 -0.004889302\n [,7] [,8] [,9] [,10]\n[1,] -0.7879713 1.02206400 -1.0420765 -1.2779945\n[2,] 1.7217146 0.06728039 0.6408182 -0.3551929\n[3,] -0.2439192 -0.71553120 -0.8273868 0.2559954\n[4,] -0.1085818 -0.28763268 1.9010457 1.7950971\n[5,] -1.4082747 -1.07621679 0.5428189 0.4538626\n[6,] -1.0644006 -0.04186614 -0.8150566 1.0490749\n```\n:::\n\n```{.r .cell-code}\n## Get row quantiles\napply(x, 1, quantile, probs = c(0.25, 0.75))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n [,1] [,2] [,3] [,4] [,5] [,6]\n25% -0.7166151 -0.1615648 -0.5651758 -0.04431213 -0.5916219 -0.07368714\n75% 0.9229907 0.3179646 0.6818422 0.52154809 0.5207637 0.45384114\n [,7] [,8] [,9] [,10] [,11] [,12]\n25% -0.4355993 -0.1313015 -0.8149658 -0.9260982 0.02077709 -0.1343613\n75% 1.5985929 0.8889319 0.2213238 0.3661333 0.82424899 0.4156328\n [,13] [,14] [,15] [,16] [,17] [,18]\n25% -0.1281593 -0.6691927 -0.2824997 -0.6574923 0.06421797 -0.7905708\n75% 1.3073689 1.2450340 0.5072401 0.5023885 1.08294108 0.4653062\n [,19] [,20]\n25% -0.5826196 -0.6965163\n75% 0.1313324 0.6849689\n```\n:::\n:::\n\n\nNotice that I had to pass the `probs = c(0.25, 0.75)` argument to `quantile()` via the `...` argument to `apply()`.\n:::\n\n## Vectorizing a Function\n\nLet's talk about how we can **\"vectorize\" a function**.\n\nWhat this means is that we can write function that typically only takes single arguments and create a new function that can take vector arguments.\n\nThis is often needed when you want to plot functions.\n\n::: callout-tip\n### Example\n\nHere's an example of a function that computes the sum of squares given some data, a mean parameter and a standard deviation. The formula is $\\sum_{i=1}^n(x_i-\\mu)^2/\\sigma^2$.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsumsq <- function(mu, sigma, x) {\n sum(((x - mu) / sigma)^2)\n}\n```\n:::\n\n\nThis function takes a mean `mu`, a standard deviation `sigma`, and some data in a vector `x`.\n\nIn many statistical applications, we want to minimize the sum of squares to find the optimal `mu` and `sigma`. Before we do that, we may want to evaluate or plot the function for many different values of `mu` or `sigma`.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- rnorm(100) ## Generate some data\nsumsq(mu = 1, sigma = 1, x) ## This works (returns one value)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 248.8765\n```\n:::\n:::\n\n\nHowever, passing a vector of `mu`s or `sigma`s won't work with this function because it's not vectorized.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nsumsq(1:10, 1:10, x) ## This is not what we want\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 119.3071\n```\n:::\n:::\n\n:::\n\nThere's even a function in R called `Vectorize()` that **automatically can create a vectorized version of your function**.\n\nSo we could create a `vsumsq()` function that is fully vectorized as follows.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nvsumsq <- Vectorize(sumsq, c(\"mu\", \"sigma\"))\nvsumsq(1:10, 1:10, x)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n [1] 248.8765 146.5055 124.7964 116.2695 111.8983 109.2945 107.5867 106.3890\n [9] 105.5067 104.8318\n```\n:::\n:::\n\n\nPretty cool, right?\n\n# Summary\n\n- The loop functions in R are very powerful because they allow you to conduct a series of operations on data using a compact form\n\n- The operation of a loop function involves iterating over an R object (e.g. a list or vector or matrix), applying a function to each element of the object, and the collating the results and returning the collated results.\n\n- Loop functions make heavy use of anonymous functions, which exist for the life of the loop function but are not stored anywhere\n\n- The `split()` function can be used to divide an R object in to subsets determined by another variable which can subsequently be looped over using loop functions.\n\n# Post-lecture materials\n\n### Final Questions\n\nHere are some post-lecture questions to help you think about the material discussed.\n\n::: callout-note\n### Questions\n\n1. Write a function `compute_s_n()` that for any given `n` computes the sum\n\n$$\nS_n = 1^2 + 2^2 + 3^2 + \\ldots + n^2\n$$\n\nReport the value of the sum when $n$ = 10.\n\n2. Define an empty numerical vector `s_n` of size 25 using `s_n <- vector(\"numeric\", 25)` and store in the results of $S_1, S_2, \\ldots, S_n$ using a for-loop.\n\n3. Repeat Q3, but this time use `sapply()`.\n\n4. Plot `s_n` versus `n`. Use points defined by $n= 1, \\ldots, 25$\n:::\n\n### Additional Resources\n\n::: callout-tip\n- \n- \n:::\n\n# R session information\n\n\n::: {.cell}\n\n```{.r .cell-code}\noptions(width = 120)\nsessioninfo::session_info()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────\n setting value\n version R version 4.3.1 (2023-06-16)\n os macOS Ventura 13.5\n system aarch64, darwin20\n ui X11\n language (EN)\n collate en_US.UTF-8\n ctype en_US.UTF-8\n tz America/New_York\n date 2023-08-17\n pandoc 3.1.5 @ /opt/homebrew/bin/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────\n package * version date (UTC) lib source\n cli 3.6.1 2023-03-23 [1] CRAN (R 4.3.0)\n colorout 1.2-2 2023-05-06 [1] Github (jalvesaq/colorout@79931fd)\n digest 0.6.33 2023-07-07 [1] CRAN (R 4.3.0)\n evaluate 0.21 2023-05-05 [1] CRAN (R 4.3.0)\n fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.3.0)\n htmltools 0.5.6 2023-08-10 [1] CRAN (R 4.3.0)\n htmlwidgets 1.6.2 2023-03-17 [1] CRAN (R 4.3.0)\n jsonlite 1.8.7 2023-06-29 [1] CRAN (R 4.3.0)\n knitr 1.43 2023-05-25 [1] CRAN (R 4.3.0)\n rlang 1.1.1 2023-04-28 [1] CRAN (R 4.3.0)\n rmarkdown 2.24 2023-08-14 [1] CRAN (R 4.3.1)\n rstudioapi 0.15.0 2023-07-07 [1] CRAN (R 4.3.0)\n sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.3.0)\n xfun 0.40 2023-08-09 [1] CRAN (R 4.3.0)\n yaml 2.3.7 2023-01-23 [1] CRAN (R 4.3.0)\n\n [1] /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library\n\n──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n```\n:::\n:::\n", "supporting": [], "filters": [ "rmarkdown/pagebreak.lua" diff --git a/_freeze/posts/18-debugging-r-code/index/execute-results/html.json b/_freeze/posts/18-debugging-r-code/index/execute-results/html.json index eee8e21..7537551 100644 --- a/_freeze/posts/18-debugging-r-code/index/execute-results/html.json +++ b/_freeze/posts/18-debugging-r-code/index/execute-results/html.json @@ -1,7 +1,7 @@ { - "hash": "7466f680cc707a58b3cb6baa83e2368a", + "hash": "8ab23c4f0460ca2e98ce61454db02a6d", "result": { - "markdown": "---\ntitle: \"18 - Debugging R Code\"\nauthor:\n - name: Leonardo Collado Torres\n url: http://lcolladotor.github.io/\n affiliations:\n - id: libd\n name: Lieber Institute for Brain Development\n url: https://libd.org/\n - id: jhsph\n name: Johns Hopkins Bloomberg School of Public Health Department of Biostatistics\n url: https://publichealth.jhu.edu/departments/biostatistics\ndescription: \"Help! What's wrong with my code???\"\ncategories: [module 4, week 5, programming, debugging]\n---\n\n\n*This lecture, as the rest of the course, is adapted from the version [Stephanie C. Hicks](https://www.stephaniehicks.com/) designed and maintained in 2021 and 2022. Check the recent changes to this file through the [GitHub history](https://github.com/lcolladotor/jhustatcomputing2023/commits/main/posts/18-debugging-r-code/index.qmd).*\n\n\n\n# Pre-lecture materials\n\n### Read ahead\n\n::: callout-note\n## Read ahead\n\n**Before class, you can prepare by reading the following materials:**\n\n1. \n2. \n:::\n\n### Acknowledgements\n\nMaterial for this lecture was borrowed and adopted from\n\n- \n- \n\n# Learning objectives\n\n::: callout-note\n# Learning objectives\n\n**At the end of this lesson you will:**\n\n- Discuss an overall approach to debugging code in R\n- Recognize the three main indications of a problem/condition (`message`, `warning`, `error`) and a fatal problem (`error`)\n- Understand the importance of reproducing the problem when debugging a function or piece of code\n- Learn how to use interactive debugging tools `traceback`, `debug`, `recover`, `browser`, and `trace` can be used to find problematic code in functions\n:::\n\n# Debugging R Code\n\n## Overall approach\n\nFinding the **root cause of a problem is always challenging**.\n\nMost bugs are subtle and hard to find because if they were obvious, you would have avoided them in the first place.\n\nA good strategy helps. Below I outline a four step process that I have found useful:\n\n### 1. Google!\n\nWhenever you see an error message, **start by googling it**.\n\nIf you are lucky, you will discover that it's a common error with a known solution.\n\n::: callout-tip\n### Pro-tip\n\nWhen googling, improve your chances of a good match by removing any variable names or values that are specific to your problem.\n:::\n\n### 2. Make it repeatable\n\nTo find the root cause of an error, you are going to need to execute the code many times as you consider and reject hypotheses.\n\n**To make that iteration as quick possible**, it's worth some upfront investment to **make the problem both easy and fast to reproduce**.\n\nStart by creating a **rep**roducible **ex**ample (reprex).\n\n- This will help others help you, and **often leads to a solution without asking others**, because in the course of making the problem reproducible you often figure out the root cause.\n\nMake the **example minimal by removing code and simplifying data**.\n\n- As you do this, you may discover inputs that do not trigger the error. - Make note of them: they will be helpful when diagnosing the root cause.\n\n::: callout-tip\n### Example\n\nLet's try making a **reprex** [using the `reprex` package](https://www.tidyverse.org/help) (installed with the `tidyverse`)\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(reprex)\n```\n:::\n\n\nWrite a bit of code and copy it to the clipboard:\n\n\n::: {.cell}\n\n```{.r .cell-code}\n(y <- 1:4)\nmean(y)\n```\n:::\n\n\nEnter `reprex()` in the R Console. In RStudio, you'll see a preview of your rendered reprex.\n\nIt is now ready and waiting on your clipboard, so you can paste it into, say, a GitHub issue.\n\nOne last step. Let's go here and open up an issue on the course website:\n\n- \n\nWe will paste in the code from our reprex.\n:::\n\nIn RStudio, you can access reprex from the addins menu, which makes it even easier to point out your code and select the output format.\n\n### 3. Figure out where it is\n\nIt's a great idea to adopt the scientific method here.\n\n- Generate hypotheses\n- Design experiments to test them\n- Record your results\n\nThis may seem like a lot of work, but **a systematic approach** will end up saving you time.\n\nOften **a lot of time can be wasted relying on my intuition to solve a bug** (\"oh, it must be an off-by-one error, so I'll just subtract 1 here\"), when I would have been better off taking a systematic approach.\n\nIf this fails, you **might need to ask help from someone else**.\n\nIf you have followed the previous step, you will have a small example that is easy to share with others. That makes it much easier for other people to look at the problem, and more likely to help you find a solution.\n\n### 4. Fix it and test it\n\nOnce you have found the bug, you need to **figure out how to fix it** and to **check that the fix actually worked**.\n\nAgain, it is very useful to have automated tests in place.\n\n- Not only does this help to ensure that you **have actually fixed the bug**, it also **helps to ensure you have not introduced any new bugs** in the process.\n- In the absence of automated tests, make sure to **carefully record the correct output**, and check against the inputs that previously failed.\n\n## Something's Wrong!\n\nOnce you have made the error repeatable, the next step is to figure out where it comes from.\n\nR has a number of **ways to indicate to you that something is not right**.\n\nThere are **different levels of indication** that can be used, ranging from mere notification to fatal error. Executing any function in R may result in the following **conditions**.\n\n- `message`: A **generic notification/diagnostic message** produced by the `message()` function; execution of the function continues\n- `warning`: An indication that **something is wrong but not necessarily fatal**; execution of the function continues. Warnings are generated by the `warning()` function\n- `error`: An indication that **a fatal problem has occurred** and execution of the function stops. Errors are produced by the `stop()` function.\n- `condition`: A generic concept for indicating that **something unexpected has occurred**; programmers can create their own custom conditions if they want.\n\n::: callout-tip\n### Example\n\nHere is an example of a warning that you might receive in the course of using R.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlog(-1)\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nWarning in log(-1): NaNs produced\n```\n:::\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] NaN\n```\n:::\n:::\n\n\nThis warning lets you know that taking the log of a negative number results in a `NaN` value because you **can't take the log of negative numbers**.\n:::\n\nNevertheless, R doesn't give an error, because it has a useful value that it can return, the **`NaN` value**.\n\nThe **warning is just there** to let you know that **something unexpected happen**.\n\nDepending on what you are programming, you may have intentionally taken the log of a negative number in order to move on to another section of code.\n\n::: callout-tip\n### Example\n\nHere is another function that is designed to print a message to the console depending on the nature of its input.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nprint_message <- function(x) {\n if(x > 0) {\n print(\"x is greater than zero\")\n } else {\n print(\"x is less than or equal to zero\")\n } \n invisible(x) \n}\n```\n:::\n\n\nThis function is simple:\n\n- It **prints a message** telling you whether `x` is greater than zero or less than or equal to zero.\n- It also returns its input **invisibly**, which is a common practice with \"print\" functions.\n\n**Returning an object invisibly** means that the **return value does not get auto-printed** when the function is called.\n\nTake a hard look at the function above and see if you can identify any bugs or problems.\n\nWe can execute the function as follows.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nprint_message(1)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"x is greater than zero\"\n```\n:::\n:::\n\n\nThe function seems to work fine at this point. No errors, warnings, or messages.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nprint_message(NA)\n```\n\n::: {.cell-output .cell-output-error}\n```\nError in if (x > 0) {: missing value where TRUE/FALSE needed\n```\n:::\n:::\n\n:::\n\nWhat happened?\n\n- Well, the first thing the function does is test if `x > 0`.\n- But you can't do that test if `x` is a `NA` or `NaN` value.\n- R **doesn't know what to do in this case** so it **stops with a fatal error**.\n\nWe can **fix this problem** by anticipating the possibility of `NA` values and checking to see if the input is `NA` with the `is.na()` function.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nprint_message2 <- function(x) {\n if(is.na(x))\n print(\"x is a missing value!\")\n else if(x > 0)\n print(\"x is greater than zero\")\n else\n print(\"x is less than or equal to zero\")\n invisible(x)\n}\n```\n:::\n\n\nNow we can run the following.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nprint_message2(NA)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"x is a missing value!\"\n```\n:::\n:::\n\n\nAnd all is fine.\n\nNow what about the following situation.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- log(c(-1, 2))\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nWarning in log(c(-1, 2)): NaNs produced\n```\n:::\n\n```{.r .cell-code}\nprint_message2(x)\n```\n\n::: {.cell-output .cell-output-error}\n```\nError in if (is.na(x)) print(\"x is a missing value!\") else if (x > 0) print(\"x is greater than zero\") else print(\"x is less than or equal to zero\"): the condition has length > 1\n```\n:::\n:::\n\n\nNow what?? Why are we getting this warning?\n\nThe **warning** says \"the condition has length \\> 1 and only the first element will be used\".\n\nThe **problem here** is that I passed `print_message2()` a vector `x` that was of length 2 rather then length 1.\n\nInside the body of `print_message2()` the expression `is.na(x)` returns a vector that is tested in the `if` statement.\n\nHowever, `if` cannot take vector arguments, so you get a warning.\n\nThe fundamental problem here is that `print_message2()` is not **vectorized**.\n\nWe can **solve this problem** two ways.\n\n1. Simply **not allow vector arguments**.\n2. The other way is to **vectorize** the `print_message2()` function to allow it to take vector arguments.\n\nFor the **first way**, we simply need to check the length of the input.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nprint_message3 <- function(x) {\n if(length(x) > 1L)\n stop(\"'x' has length > 1\")\n if(is.na(x))\n print(\"x is a missing value!\")\n else if(x > 0)\n print(\"x is greater than zero\")\n else\n print(\"x is less than or equal to zero\")\n invisible(x)\n}\n```\n:::\n\n\nNow when we pass `print_message3()` a vector, we should get an **error**.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nprint_message3(1:2)\n```\n\n::: {.cell-output .cell-output-error}\n```\nError in print_message3(1:2): 'x' has length > 1\n```\n:::\n:::\n\n\nVectorizing the function can be accomplished easily with the `Vectorize()` function.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nprint_message4 <- Vectorize(print_message2)\nout <- print_message4(c(-1, 2))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"x is less than or equal to zero\"\n[1] \"x is greater than zero\"\n```\n:::\n:::\n\n\nYou can see now that the **correct messages are printed without any warning or error**.\n\n::: callout-tip\n### Note\n\nI stored the return value of `print_message4()` in a separate R object called `out`.\n\nThis is because when I use the `Vectorize()` function it no longer preserves the invisibility of the return value.\n:::\n\n::: callout-tip\n### Helpful tips\n\nThe **primary task of debugging** any R code is **correctly diagnosing what the problem is**.\n\nWhen diagnosing a problem with your code (or somebody else's), it's important **first understand what you were expecting to occur**.\n\nThen you need to **idenfity what did occur** and **how did it deviate from your expectations**.\n\nSome basic questions you need to ask are\n\n- What was your input? How did you call the function?\n- What were you expecting? Output, messages, other results?\n- What did you get?\n- How does what you get differ from what you were expecting?\n- Were your expectations correct in the first place?\n- Can you reproduce the problem (exactly)?\n:::\n\nBeing able to answer these questions is important not just for your own sake, but in situations where you may need to ask someone else for help with debugging the problem.\n\nSeasoned programmers will be asking you these exact questions.\n\n# Debugging Tools in R\n\nR provides a number of tools to help you with debugging your code. The primary tools for debugging functions in R are\n\n- `traceback()`: **prints out the function call stack** after an error occurs; does nothing if there's no error\n- `debug()`: **flags a function for \"debug\" mode** which allows you to step through execution of a function one line at a time\n- `browser()`: **suspends the execution of a function** wherever it is called and puts the function in debug mode\n- `trace()`: allows you to **insert debugging code into a function** at specific places\n- `recover()`: allows you to **modify the error behavior** so that you can browse the function call stack\n\nThese functions are interactive tools specifically designed to allow you to pick through a function. There is also the more blunt technique of inserting `print()` or `cat()` statements in the function.\n\n## Using `traceback()`\n\nThe `traceback()` function **prints out the function call stack** after an error has occurred.\n\nThe **function call stack** is the **sequence of functions that was called before the error occurred**.\n\nFor example, you may have a function `a()` which subsequently calls function `b()` which calls `c()` and then `d()`.\n\nIf an error occurs, it may not be immediately clear in which function the error occurred.\n\nThe `traceback()` function **shows you how many levels deep** you were when the error occurred.\n\n::: callout-tip\n### Example\n\nLet's use the `mean()` function on a vector `z` that does not exist in our R environment\n\n``` r\n> mean(z)\nError in mean(z) : object 'z' not found\n> traceback()\n1: mean(z)\n```\n\nHere, it's **clear that the error occurred** inside the `mean()` function because the object `z` does not exist.\n:::\n\nThe `traceback()` function **must be called immediately after an error** occurs. Once another function is called, you lose the traceback.\n\n::: callout-tip\n### Example\n\nHere is a slightly more complicated example using the `lm()` function for linear modeling.\n\n``` r\n> lm(y ~ x)\nError in eval(expr, envir, enclos) : object ’y’ not found\n> traceback()\n7: eval(expr, envir, enclos)\n6: eval(predvars, data, env)\n5: model.frame.default(formula = y ~ x, drop.unused.levels = TRUE)\n4: model.frame(formula = y ~ x, drop.unused.levels = TRUE)\n3: eval(expr, envir, enclos)\n2: eval(mf, parent.frame())\n1: lm(y ~ x)\n```\n\nYou can see now that the **error did not get thrown until the 7th level of the function call stack**, in which case the `eval()` function tried to evaluate the formula `y ~ x` and **realized the object `y` did not exist**.\n:::\n\nLooking at the traceback is useful for figuring out roughly where an error occurred but it's not useful for more detailed debugging. For that you might turn to the `debug()` function.\n\n## Using `debug()`\n\n

\n\nClick here for how to use `debug()` with an interactive browser.\n\nThe `debug()` function initiates an interactive debugger (also known as the \"browser\" in R) for a function. With the debugger, you can step through an R function one expression at a time to pinpoint exactly where an error occurs.\n\nThe `debug()` function takes a function as its first argument. Here is an example of debugging the `lm()` function.\n\n``` r\n> debug(lm) ## Flag the 'lm()' function for interactive debugging\n> lm(y ~ x)\ndebugging in: lm(y ~ x)\ndebug: {\n ret.x <- x\n ret.y <- y\n cl <- match.call()\n ...\n if (!qr)\n z$qr <- NULL \n z\n} \nBrowse[2]>\n```\n\nNow, every time you call the `lm()` function it will launch the interactive debugger. To turn this behavior off you need to call the `undebug()` function.\n\nThe debugger calls the browser at the very top level of the function body. From there you can step through each expression in the body. There are a few special commands you can call in the browser:\n\n- `n` executes the current expression and moves to the next expression\n- `c` continues execution of the function and does not stop until either an error or the function exits\n- `Q` quits the browser\n\nHere's an example of a browser session with the `lm()` function.\n\n``` r\nBrowse[2]> n ## Evalute this expression and move to the next one\ndebug: ret.x <- x\nBrowse[2]> n\ndebug: ret.y <- y\nBrowse[2]> n\ndebug: cl <- match.call()\nBrowse[2]> n\ndebug: mf <- match.call(expand.dots = FALSE)\nBrowse[2]> n\ndebug: m <- match(c(\"formula\", \"data\", \"subset\", \"weights\", \"na.action\",\n \"offset\"), names(mf), 0L)\n```\n\nWhile you are in the browser you can execute any other R function that might be available to you in a regular session. In particular, you can use `ls()` to see what is in your current environment (the function environment) and `print()` to print out the values of R objects in the function environment.\n\nYou can turn off interactive debugging with the `undebug()` function.\n\n``` r\nundebug(lm) ## Unflag the 'lm()' function for debugging\n```\n\n
\n\n## Using `recover()`\n\n
\n\nClick here for how to use `recover()` with an interactive browser.\n\nThe `recover()` function can be used to modify the error behavior of R when an error occurs. Normally, when an error occurs in a function, R will print out an error message, exit out of the function, and return you to your workspace to await further commands.\n\nWith `recover()` you can tell R that when an error occurs, it should halt execution at the exact point at which the error occurred. That can give you the opportunity to poke around in the environment in which the error occurred. This can be useful to see if there are any R objects or data that have been corrupted or mistakenly modified.\n\n``` r\n> options(error = recover) ## Change default R error behavior\n> read.csv(\"nosuchfile\") ## This code doesn't work\nError in file(file, \"rt\") : cannot open the connection\nIn addition: Warning message:\nIn file(file, \"rt\") :\n cannot open file ’nosuchfile’: No such file or directory\n \nEnter a frame number, or 0 to exit\n\n1: read.csv(\"nosuchfile\")\n2: read.table(file = file, header = header, sep = sep, quote = quote, dec =\n3: file(file, \"rt\")\n\nSelection:\n```\n\nThe `recover()` function will first print out the function call stack when an error occurrs. Then, you can choose to jump around the call stack and investigate the problem. When you choose a frame number, you will be put in the browser (just like the interactive debugger triggered with `debug()`) and will have the ability to poke around.\n\n
\n\n# Summary\n\n- There are three main indications of a problem/condition: `message`, `warning`, `error`; only an `error` is fatal\n- When analyzing a function with a problem, make sure you can reproduce the problem, clearly state your expectations and how the output differs from your expectation\n- Interactive debugging tools `traceback`, `debug`, `recover`, `browser`, and `trace` can be used to find problematic code in functions\n- Debugging tools are not a substitute for thinking!\n\n# Post-lecture materials\n\n### Final Questions\n\nHere are some post-lecture questions to help you think about the material discussed.\n\n::: callout-note\n### Questions\n\n1. Try using `traceback()` to debug this piece of code:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nf <- function(a) g(a)\ng <- function(b) h(b)\nh <- function(c) i(c)\ni <- function(d) {\n if (!is.numeric(d)) {\n stop(\"`d` must be numeric\", call. = FALSE)\n }\n d + 10\n}\nf(\"a\")\n```\n\n::: {.cell-output .cell-output-error}\n```\nError: `d` must be numeric\n```\n:::\n:::\n\n\nDescribe in words what is happening above?\n:::\n\n### Additional Resources\n\n::: callout-tip\n- \n- \n- \n:::\n\n# R session information\n\n\n::: {.cell}\n\n```{.r .cell-code}\noptions(width = 120)\nsessioninfo::session_info()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────\n setting value\n version R version 4.3.1 (2023-06-16)\n os macOS Ventura 13.5\n system aarch64, darwin20\n ui X11\n language (EN)\n collate en_US.UTF-8\n ctype en_US.UTF-8\n tz America/New_York\n date 2023-08-17\n pandoc 3.1.5 @ /opt/homebrew/bin/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────\n package * version date (UTC) lib source\n cli 3.6.1 2023-03-23 [1] CRAN (R 4.3.0)\n colorout 1.2-2 2023-05-06 [1] Github (jalvesaq/colorout@79931fd)\n digest 0.6.33 2023-07-07 [1] CRAN (R 4.3.0)\n evaluate 0.21 2023-05-05 [1] CRAN (R 4.3.0)\n fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.3.0)\n fs 1.6.3 2023-07-20 [1] CRAN (R 4.3.0)\n glue 1.6.2 2022-02-24 [1] CRAN (R 4.3.0)\n htmltools 0.5.6 2023-08-10 [1] CRAN (R 4.3.0)\n htmlwidgets 1.6.2 2023-03-17 [1] CRAN (R 4.3.0)\n jsonlite 1.8.7 2023-06-29 [1] CRAN (R 4.3.0)\n knitr 1.43 2023-05-25 [1] CRAN (R 4.3.0)\n lifecycle 1.0.3 2022-10-07 [1] CRAN (R 4.3.0)\n reprex * 2.0.2 2022-08-17 [1] CRAN (R 4.3.0)\n rlang 1.1.1 2023-04-28 [1] CRAN (R 4.3.0)\n rmarkdown 2.24 2023-08-14 [1] CRAN (R 4.3.1)\n rstudioapi 0.15.0 2023-07-07 [1] CRAN (R 4.3.0)\n sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.3.0)\n withr 2.5.0 2022-03-03 [1] CRAN (R 4.3.0)\n xfun 0.40 2023-08-09 [1] CRAN (R 4.3.0)\n yaml 2.3.7 2023-01-23 [1] CRAN (R 4.3.0)\n\n [1] /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library\n\n──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n```\n:::\n:::\n", + "markdown": "---\ntitle: \"18 - Debugging R Code\"\nauthor:\n - name: Leonardo Collado Torres\n url: http://lcolladotor.github.io/\n affiliations:\n - id: libd\n name: Lieber Institute for Brain Development\n url: https://libd.org/\n - id: jhsph\n name: Johns Hopkins Bloomberg School of Public Health Department of Biostatistics\n url: https://publichealth.jhu.edu/departments/biostatistics\ndescription: \"Help! What's wrong with my code???\"\ncategories: [module 4, week 5, programming, debugging]\n---\n\n\n*This lecture, as the rest of the course, is adapted from the version [Stephanie C. Hicks](https://www.stephaniehicks.com/) designed and maintained in 2021 and 2022. Check the recent changes to this file through the [GitHub history](https://github.com/lcolladotor/jhustatcomputing2023/commits/main/posts/18-debugging-r-code/index.qmd).*\n\n\n\n# Pre-lecture materials\n\n### Read ahead\n\n::: callout-note\n## Read ahead\n\n**Before class, you can prepare by reading the following materials:**\n\n1. \n2. \n:::\n\n### Acknowledgements\n\nMaterial for this lecture was borrowed and adopted from\n\n- \n- \n\n# Learning objectives\n\n::: callout-note\n# Learning objectives\n\n**At the end of this lesson you will:**\n\n- Discuss an overall approach to debugging code in R\n- Recognize the three main indications of a problem/condition (`message`, `warning`, `error`) and a fatal problem (`error`)\n- Understand the importance of reproducing the problem when debugging a function or piece of code\n- Learn how to use interactive debugging tools `traceback`, `debug`, `recover`, `browser`, and `trace` can be used to find problematic code in functions\n:::\n\n# Debugging R Code\n\n## Overall approach\n\nFinding the **root cause of a problem is always challenging**.\n\nMost bugs are subtle and hard to find because if they were obvious, you would have avoided them in the first place.\n\nA good strategy helps. Below I outline a four step process that I have found useful:\n\n### 1. Google!\n\nWhenever you see an error message, **start by googling it**.\n\nIf you are lucky, you will discover that it's a common error with a known solution.\n\n::: callout-tip\n### Pro-tip\n\nWhen googling, improve your chances of a good match by removing any variable names or values that are specific to your problem.\n:::\n\n### 2. Make it repeatable\n\nTo find the root cause of an error, you are going to need to execute the code many times as you consider and reject hypotheses.\n\n**To make that iteration as quick possible**, it's worth some upfront investment to **make the problem both easy and fast to reproduce**.\n\nStart by creating a **rep**roducible **ex**ample (reprex).\n\n- This will help others help you, and **often leads to a solution without asking others**, because in the course of making the problem reproducible you often figure out the root cause.\n\nMake the **example minimal by removing code and simplifying data**.\n\n- As you do this, you may discover inputs that do not trigger the error. - Make note of them: they will be helpful when diagnosing the root cause.\n\n::: callout-tip\n### Example\n\nLet's try making a **reprex** [using the `reprex` package](https://www.tidyverse.org/help) (installed with the `tidyverse`)\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(reprex)\n```\n:::\n\n\nWrite a bit of code and copy it to the clipboard:\n\n\n::: {.cell}\n\n```{.r .cell-code}\n(y <- 1:4)\nmean(y)\n```\n:::\n\n\nEnter `reprex()` in the R Console. In RStudio, you'll see a preview of your rendered reprex.\n\nIt is now ready and waiting on your clipboard, so you can paste it into, say, a GitHub issue.\n\nOne last step. Let's go here and open up an issue on the course website:\n\n- \n\nWe will paste in the code from our reprex.\n:::\n\nIn RStudio, you can access reprex from the addins menu, which makes it even easier to point out your code and select the output format.\n\n### 3. Figure out where it is\n\nIt's a great idea to adopt the scientific method here.\n\n- Generate hypotheses\n- Design experiments to test them\n- Record your results\n\nThis may seem like a lot of work, but **a systematic approach** will end up saving you time.\n\nOften **a lot of time can be wasted relying on my intuition to solve a bug** (\"oh, it must be an off-by-one error, so I'll just subtract 1 here\"), when I would have been better off taking a systematic approach.\n\nIf this fails, you **might need to ask help from someone else**.\n\nIf you have followed the previous step, you will have a small example that is easy to share with others. That makes it much easier for other people to look at the problem, and more likely to help you find a solution.\n\n### 4. Fix it and test it\n\nOnce you have found the bug, you need to **figure out how to fix it** and to **check that the fix actually worked**.\n\nAgain, it is very useful to have automated tests in place.\n\n- Not only does this help to ensure that you **have actually fixed the bug**, it also **helps to ensure you have not introduced any new bugs** in the process.\n- In the absence of automated tests, make sure to **carefully record the correct output**, and check against the inputs that previously failed.\n\n## Something's Wrong!\n\nOnce you have made the error repeatable, the next step is to figure out where it comes from.\n\nR has a number of **ways to indicate to you that something is not right**.\n\nThere are **different levels of indication** that can be used, ranging from mere notification to fatal error. Executing any function in R may result in the following **conditions**.\n\n- `message`: A **generic notification/diagnostic message** produced by the `message()` function; execution of the function continues\n- `warning`: An indication that **something is wrong but not necessarily fatal**; execution of the function continues. Warnings are generated by the `warning()` function\n- `error`: An indication that **a fatal problem has occurred** and execution of the function stops. Errors are produced by the `stop()` function.\n- `condition`: A generic concept for indicating that **something unexpected has occurred**; programmers can create their own custom conditions if they want.\n\n::: callout-tip\n### Example\n\nHere is an example of a warning that you might receive in the course of using R.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlog(-1)\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nWarning in log(-1): NaNs produced\n```\n:::\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] NaN\n```\n:::\n:::\n\n\nThis warning lets you know that taking the log of a negative number results in a `NaN` value because you **can't take the log of negative numbers**.\n:::\n\nNevertheless, R doesn't give an error, because it has a useful value that it can return, the **`NaN` value**.\n\nThe **warning is just there** to let you know that **something unexpected happen**.\n\nDepending on what you are programming, you may have intentionally taken the log of a negative number in order to move on to another section of code.\n\n::: callout-tip\n### Example\n\nHere is another function that is designed to print a message to the console depending on the nature of its input.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nprint_message <- function(x) {\n if (x > 0) {\n print(\"x is greater than zero\")\n } else {\n print(\"x is less than or equal to zero\")\n }\n invisible(x)\n}\n```\n:::\n\n\nThis function is simple:\n\n- It **prints a message** telling you whether `x` is greater than zero or less than or equal to zero.\n- It also returns its input **invisibly**, which is a common practice with \"print\" functions.\n\n**Returning an object invisibly** means that the **return value does not get auto-printed** when the function is called.\n\nTake a hard look at the function above and see if you can identify any bugs or problems.\n\nWe can execute the function as follows.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nprint_message(1)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"x is greater than zero\"\n```\n:::\n:::\n\n\nThe function seems to work fine at this point. No errors, warnings, or messages.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nprint_message(NA)\n```\n\n::: {.cell-output .cell-output-error}\n```\nError in if (x > 0) {: missing value where TRUE/FALSE needed\n```\n:::\n:::\n\n:::\n\nWhat happened?\n\n- Well, the first thing the function does is test if `x > 0`.\n- But you can't do that test if `x` is a `NA` or `NaN` value.\n- R **doesn't know what to do in this case** so it **stops with a fatal error**.\n\nWe can **fix this problem** by anticipating the possibility of `NA` values and checking to see if the input is `NA` with the `is.na()` function.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nprint_message2 <- function(x) {\n if (is.na(x)) {\n print(\"x is a missing value!\")\n } else if (x > 0) {\n print(\"x is greater than zero\")\n } else {\n print(\"x is less than or equal to zero\")\n }\n invisible(x)\n}\n```\n:::\n\n\nNow we can run the following.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nprint_message2(NA)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"x is a missing value!\"\n```\n:::\n:::\n\n\nAnd all is fine.\n\nNow what about the following situation.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nx <- log(c(-1, 2))\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nWarning in log(c(-1, 2)): NaNs produced\n```\n:::\n\n```{.r .cell-code}\nprint_message2(x)\n```\n\n::: {.cell-output .cell-output-error}\n```\nError in if (is.na(x)) {: the condition has length > 1\n```\n:::\n:::\n\n\nNow what?? Why are we getting this warning?\n\nThe **warning** says \"the condition has length \\> 1 and only the first element will be used\".\n\nThe **problem here** is that I passed `print_message2()` a vector `x` that was of length 2 rather then length 1.\n\nInside the body of `print_message2()` the expression `is.na(x)` returns a vector that is tested in the `if` statement.\n\nHowever, `if` cannot take vector arguments, so you get a warning.\n\nThe fundamental problem here is that `print_message2()` is not **vectorized**.\n\nWe can **solve this problem** two ways.\n\n1. Simply **not allow vector arguments**.\n2. The other way is to **vectorize** the `print_message2()` function to allow it to take vector arguments.\n\nFor the **first way**, we simply need to check the length of the input.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nprint_message3 <- function(x) {\n if (length(x) > 1L) {\n stop(\"'x' has length > 1\")\n }\n if (is.na(x)) {\n print(\"x is a missing value!\")\n } else if (x > 0) {\n print(\"x is greater than zero\")\n } else {\n print(\"x is less than or equal to zero\")\n }\n invisible(x)\n}\n```\n:::\n\n\nNow when we pass `print_message3()` a vector, we should get an **error**.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nprint_message3(1:2)\n```\n\n::: {.cell-output .cell-output-error}\n```\nError in print_message3(1:2): 'x' has length > 1\n```\n:::\n:::\n\n\nVectorizing the function can be accomplished easily with the `Vectorize()` function.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nprint_message4 <- Vectorize(print_message2)\nout <- print_message4(c(-1, 2))\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] \"x is less than or equal to zero\"\n[1] \"x is greater than zero\"\n```\n:::\n:::\n\n\nYou can see now that the **correct messages are printed without any warning or error**.\n\n::: callout-tip\n### Note\n\nI stored the return value of `print_message4()` in a separate R object called `out`.\n\nThis is because when I use the `Vectorize()` function it no longer preserves the invisibility of the return value.\n:::\n\n::: callout-tip\n### Helpful tips\n\nThe **primary task of debugging** any R code is **correctly diagnosing what the problem is**.\n\nWhen diagnosing a problem with your code (or somebody else's), it's important **first understand what you were expecting to occur**.\n\nThen you need to **idenfity what did occur** and **how did it deviate from your expectations**.\n\nSome basic questions you need to ask are\n\n- What was your input? How did you call the function?\n- What were you expecting? Output, messages, other results?\n- What did you get?\n- How does what you get differ from what you were expecting?\n- Were your expectations correct in the first place?\n- Can you reproduce the problem (exactly)?\n:::\n\nBeing able to answer these questions is important not just for your own sake, but in situations where you may need to ask someone else for help with debugging the problem.\n\nSeasoned programmers will be asking you these exact questions.\n\n# Debugging Tools in R\n\nR provides a number of tools to help you with debugging your code. The primary tools for debugging functions in R are\n\n- `traceback()`: **prints out the function call stack** after an error occurs; does nothing if there's no error\n- `debug()`: **flags a function for \"debug\" mode** which allows you to step through execution of a function one line at a time\n- `browser()`: **suspends the execution of a function** wherever it is called and puts the function in debug mode\n- `trace()`: allows you to **insert debugging code into a function** at specific places\n- `recover()`: allows you to **modify the error behavior** so that you can browse the function call stack\n\nThese functions are interactive tools specifically designed to allow you to pick through a function. There is also the more blunt technique of inserting `print()` or `cat()` statements in the function.\n\n## Using `traceback()`\n\nThe `traceback()` function **prints out the function call stack** after an error has occurred.\n\nThe **function call stack** is the **sequence of functions that was called before the error occurred**.\n\nFor example, you may have a function `a()` which subsequently calls function `b()` which calls `c()` and then `d()`.\n\nIf an error occurs, it may not be immediately clear in which function the error occurred.\n\nThe `traceback()` function **shows you how many levels deep** you were when the error occurred.\n\n::: callout-tip\n### Example\n\nLet's use the `mean()` function on a vector `z` that does not exist in our R environment\n\n``` r\n> mean(z)\nError in mean(z) : object 'z' not found\n> traceback()\n1: mean(z)\n```\n\nHere, it's **clear that the error occurred** inside the `mean()` function because the object `z` does not exist.\n:::\n\nThe `traceback()` function **must be called immediately after an error** occurs. Once another function is called, you lose the traceback.\n\n::: callout-tip\n### Example\n\nHere is a slightly more complicated example using the `lm()` function for linear modeling.\n\n``` r\n> lm(y ~ x)\nError in eval(expr, envir, enclos) : object ’y’ not found\n> traceback()\n7: eval(expr, envir, enclos)\n6: eval(predvars, data, env)\n5: model.frame.default(formula = y ~ x, drop.unused.levels = TRUE)\n4: model.frame(formula = y ~ x, drop.unused.levels = TRUE)\n3: eval(expr, envir, enclos)\n2: eval(mf, parent.frame())\n1: lm(y ~ x)\n```\n\nYou can see now that the **error did not get thrown until the 7th level of the function call stack**, in which case the `eval()` function tried to evaluate the formula `y ~ x` and **realized the object `y` did not exist**.\n:::\n\nLooking at the traceback is useful for figuring out roughly where an error occurred but it's not useful for more detailed debugging. For that you might turn to the `debug()` function.\n\n## Using `debug()`\n\n
\n\nClick here for how to use `debug()` with an interactive browser.\n\nThe `debug()` function initiates an interactive debugger (also known as the \"browser\" in R) for a function. With the debugger, you can step through an R function one expression at a time to pinpoint exactly where an error occurs.\n\nThe `debug()` function takes a function as its first argument. Here is an example of debugging the `lm()` function.\n\n``` r\n> debug(lm) ## Flag the 'lm()' function for interactive debugging\n> lm(y ~ x)\ndebugging in: lm(y ~ x)\ndebug: {\n ret.x <- x\n ret.y <- y\n cl <- match.call()\n ...\n if (!qr)\n z$qr <- NULL \n z\n} \nBrowse[2]>\n```\n\nNow, every time you call the `lm()` function it will launch the interactive debugger. To turn this behavior off you need to call the `undebug()` function.\n\nThe debugger calls the browser at the very top level of the function body. From there you can step through each expression in the body. There are a few special commands you can call in the browser:\n\n- `n` executes the current expression and moves to the next expression\n- `c` continues execution of the function and does not stop until either an error or the function exits\n- `Q` quits the browser\n\nHere's an example of a browser session with the `lm()` function.\n\n``` r\nBrowse[2]> n ## Evalute this expression and move to the next one\ndebug: ret.x <- x\nBrowse[2]> n\ndebug: ret.y <- y\nBrowse[2]> n\ndebug: cl <- match.call()\nBrowse[2]> n\ndebug: mf <- match.call(expand.dots = FALSE)\nBrowse[2]> n\ndebug: m <- match(c(\"formula\", \"data\", \"subset\", \"weights\", \"na.action\",\n \"offset\"), names(mf), 0L)\n```\n\nWhile you are in the browser you can execute any other R function that might be available to you in a regular session. In particular, you can use `ls()` to see what is in your current environment (the function environment) and `print()` to print out the values of R objects in the function environment.\n\nYou can turn off interactive debugging with the `undebug()` function.\n\n``` r\nundebug(lm) ## Unflag the 'lm()' function for debugging\n```\n\n
\n\n## Using `recover()`\n\n
\n\nClick here for how to use `recover()` with an interactive browser.\n\nThe `recover()` function can be used to modify the error behavior of R when an error occurs. Normally, when an error occurs in a function, R will print out an error message, exit out of the function, and return you to your workspace to await further commands.\n\nWith `recover()` you can tell R that when an error occurs, it should halt execution at the exact point at which the error occurred. That can give you the opportunity to poke around in the environment in which the error occurred. This can be useful to see if there are any R objects or data that have been corrupted or mistakenly modified.\n\n``` r\n> options(error = recover) ## Change default R error behavior\n> read.csv(\"nosuchfile\") ## This code doesn't work\nError in file(file, \"rt\") : cannot open the connection\nIn addition: Warning message:\nIn file(file, \"rt\") :\n cannot open file ’nosuchfile’: No such file or directory\n \nEnter a frame number, or 0 to exit\n\n1: read.csv(\"nosuchfile\")\n2: read.table(file = file, header = header, sep = sep, quote = quote, dec =\n3: file(file, \"rt\")\n\nSelection:\n```\n\nThe `recover()` function will first print out the function call stack when an error occurrs. Then, you can choose to jump around the call stack and investigate the problem. When you choose a frame number, you will be put in the browser (just like the interactive debugger triggered with `debug()`) and will have the ability to poke around.\n\n
\n\n# Summary\n\n- There are three main indications of a problem/condition: `message`, `warning`, `error`; only an `error` is fatal\n- When analyzing a function with a problem, make sure you can reproduce the problem, clearly state your expectations and how the output differs from your expectation\n- Interactive debugging tools `traceback`, `debug`, `recover`, `browser`, and `trace` can be used to find problematic code in functions\n- Debugging tools are not a substitute for thinking!\n\n# Post-lecture materials\n\n### Final Questions\n\nHere are some post-lecture questions to help you think about the material discussed.\n\n::: callout-note\n### Questions\n\n1. Try using `traceback()` to debug this piece of code:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nf <- function(a) g(a)\ng <- function(b) h(b)\nh <- function(c) i(c)\ni <- function(d) {\n if (!is.numeric(d)) {\n stop(\"`d` must be numeric\", call. = FALSE)\n }\n d + 10\n}\nf(\"a\")\n```\n\n::: {.cell-output .cell-output-error}\n```\nError: `d` must be numeric\n```\n:::\n:::\n\n\nDescribe in words what is happening above?\n:::\n\n### Additional Resources\n\n::: callout-tip\n- \n- \n- \n:::\n\n# R session information\n\n\n::: {.cell}\n\n```{.r .cell-code}\noptions(width = 120)\nsessioninfo::session_info()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────\n setting value\n version R version 4.3.1 (2023-06-16)\n os macOS Ventura 13.5\n system aarch64, darwin20\n ui X11\n language (EN)\n collate en_US.UTF-8\n ctype en_US.UTF-8\n tz America/New_York\n date 2023-08-17\n pandoc 3.1.5 @ /opt/homebrew/bin/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────\n package * version date (UTC) lib source\n cli 3.6.1 2023-03-23 [1] CRAN (R 4.3.0)\n colorout 1.2-2 2023-05-06 [1] Github (jalvesaq/colorout@79931fd)\n digest 0.6.33 2023-07-07 [1] CRAN (R 4.3.0)\n evaluate 0.21 2023-05-05 [1] CRAN (R 4.3.0)\n fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.3.0)\n fs 1.6.3 2023-07-20 [1] CRAN (R 4.3.0)\n glue 1.6.2 2022-02-24 [1] CRAN (R 4.3.0)\n htmltools 0.5.6 2023-08-10 [1] CRAN (R 4.3.0)\n htmlwidgets 1.6.2 2023-03-17 [1] CRAN (R 4.3.0)\n jsonlite 1.8.7 2023-06-29 [1] CRAN (R 4.3.0)\n knitr 1.43 2023-05-25 [1] CRAN (R 4.3.0)\n lifecycle 1.0.3 2022-10-07 [1] CRAN (R 4.3.0)\n reprex * 2.0.2 2022-08-17 [1] CRAN (R 4.3.0)\n rlang 1.1.1 2023-04-28 [1] CRAN (R 4.3.0)\n rmarkdown 2.24 2023-08-14 [1] CRAN (R 4.3.1)\n rstudioapi 0.15.0 2023-07-07 [1] CRAN (R 4.3.0)\n sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.3.0)\n withr 2.5.0 2022-03-03 [1] CRAN (R 4.3.0)\n xfun 0.40 2023-08-09 [1] CRAN (R 4.3.0)\n yaml 2.3.7 2023-01-23 [1] CRAN (R 4.3.0)\n\n [1] /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library\n\n──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n```\n:::\n:::\n", "supporting": [], "filters": [ "rmarkdown/pagebreak.lua" diff --git a/_freeze/posts/19-error-handling-and-generation/index/execute-results/html.json b/_freeze/posts/19-error-handling-and-generation/index/execute-results/html.json index bc1a96c..3bd7d55 100644 --- a/_freeze/posts/19-error-handling-and-generation/index/execute-results/html.json +++ b/_freeze/posts/19-error-handling-and-generation/index/execute-results/html.json @@ -1,7 +1,7 @@ { - "hash": "0526af525b38b7e0548e2c7611c85749", + "hash": "09a27c1c17c10264f75e75c5203f76e9", "result": { - "markdown": "---\ntitle: \"19 - Error Handling and Generation\"\nauthor:\n - name: Leonardo Collado Torres\n url: http://lcolladotor.github.io/\n affiliations:\n - id: libd\n name: Lieber Institute for Brain Development\n url: https://libd.org/\n - id: jhsph\n name: Johns Hopkins Bloomberg School of Public Health Department of Biostatistics\n url: https://publichealth.jhu.edu/departments/biostatistics\ndescription: \"Implement exception handling routines in R functions\"\ncategories: [module 4, week 5, programming, debugging]\n---\n\n\n*This lecture, as the rest of the course, is adapted from the version [Stephanie C. Hicks](https://www.stephaniehicks.com/) designed and maintained in 2021 and 2022. Check the recent changes to this file through the [GitHub history](https://github.com/lcolladotor/jhustatcomputing2023/commits/main/posts/19-error-handling-and-generation/index.qmd).*\n\n# Pre-lecture materials\n\n### Read ahead\n\n::: callout-note\n## Read ahead\n\n**Before class, you can prepare by reading the following materials:**\n\n1. \n:::\n\n### Acknowledgements\n\nMaterial for this lecture was borrowed and adopted from\n\n- \n- \n\n# Learning objectives\n\n::: callout-note\n# Learning objectives\n\n**At the end of this lesson you will:**\n\n- Create errors, warnings, and messages in R functions using the functions `stop`, `stopifnot`, `warning`, and `message`.\n- Understand the importance of providing useful error messaging to improve user experience with functions. However, these can also slow down code substantially.\n:::\n\n# Error Handling and Generation\n\n## What is an error?\n\n**Errors most often occur** when code is used in a way that **it is not intended to be used**.\n\n::: callout-tip\n### Example\n\nFor example adding two strings together produces the following error:\n\n\n::: {.cell}\n\n```{.r .cell-code}\n\"hello\" + \"world\"\n```\n\n::: {.cell-output .cell-output-error}\n```\nError in \"hello\" + \"world\": non-numeric argument to binary operator\n```\n:::\n:::\n\n:::\n\nThe `+` operator is essentially a **function** that takes two numbers as arguments and finds their sum.\n\nSince neither `\"hello\"` nor `\"world\"` are numbers, the R interpreter produces an error.\n\n**Errors will stop the execution of your program**, and they will (hopefully) print an error message to the R console.\n\nIn R there are two other constructs which are related to errors:\n\n1. Warnings\n2. Messages\n\n**Warnings** are meant to indicate that **something seems to have gone wrong** in your program that should be inspected.\n\n::: callout-tip\n### Example\n\nHere's a simple example of a warning being generated:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nas.numeric(c(\"5\", \"6\", \"seven\"))\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nWarning: NAs introduced by coercion\n```\n:::\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 5 6 NA\n```\n:::\n:::\n\n\nThe `as.numeric()` function attempts to **convert each string** in `c(\"5\", \"6\", \"seven\")` into a number, however it is impossible to convert `\"seven\"`, so a warning is generated.\n\nExecution of the code is not halted, and an `NA` is produced for `\"seven\"` instead of a number.\n:::\n\n**Messages** simply **print to the R console**, though they are generated by an underlying mechanism that is similar to how errors and warning are generated.\n\n::: callout-tip\n### Example\n\nHere's a small function that will generate a message:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nf <- function(){\n message(\"This is a message.\")\n}\n\nf()\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nThis is a message.\n```\n:::\n:::\n\n:::\n\n## Generating Errors\n\nThere are a few essential functions for **generating** errors, warnings, and messages in R.\n\nThe `stop()` function will generate an error.\n\n::: callout-tip\n### Example\n\nLet's generate an error:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nstop(\"Something erroneous has occurred!\")\n```\n:::\n\n\n``` r\nError: Something erroneous has occurred!\n```\n:::\n\nIf an error occurs inside of a function, then the **name of that function will appear in the error message**:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nname_of_function <- function(){\n stop(\"Something bad happened.\")\n}\n\nname_of_function()\n```\n\n::: {.cell-output .cell-output-error}\n```\nError in name_of_function(): Something bad happened.\n```\n:::\n:::\n\n\nThe `stopifnot()` function takes a series of logical expressions as arguments and if any of them are false an error is generated specifying which expression is false.\n\n::: callout-tip\n### Example\n\nLet's take a look at an example:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nerror_if_n_is_greater_than_zero <- function(n){\n stopifnot(n <= 0)\n n\n}\n\nerror_if_n_is_greater_than_zero(5)\n```\n\n::: {.cell-output .cell-output-error}\n```\nError in error_if_n_is_greater_than_zero(5): n <= 0 is not TRUE\n```\n:::\n:::\n\n:::\n\nThe `warning()` function creates a warning, and the function itself is very similar to the `stop()` function. Remember that a warning does not stop the execution of a program (unlike an error.)\n\n::: callout-tip\n### Example\n\n\n::: {.cell}\n\n```{.r .cell-code}\nwarning(\"Consider yourself warned!\")\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nWarning: Consider yourself warned!\n```\n:::\n:::\n\n:::\n\nJust like errors, a warning generated inside of a function will include the name of the function in which it was generated:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nmake_NA <- function(x){\n warning(\"Generating an NA.\")\n NA\n}\n\nmake_NA(\"Sodium\")\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nWarning in make_NA(\"Sodium\"): Generating an NA.\n```\n:::\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] NA\n```\n:::\n:::\n\n\nMessages are simpler than errors or warnings; they just print strings to the R console.\n\nYou can issue a message with the `message()` function:\n\n::: callout-tip\n### Example\n\n\n::: {.cell}\n\n```{.r .cell-code}\nmessage(\"In a bottle.\")\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nIn a bottle.\n```\n:::\n:::\n\n:::\n\n## When to generate errors or warnings\n\nStopping the execution of your program with `stop()` should only happen in the event of a catastrophe - meaning only if it is impossible for your program to continue.\n\n- If there are **conditions that you can anticipate** that would cause your program to create an error, then you **should document those conditions** so whoever uses your software is aware.\n\nAn example includes:\n\n- Providing invalid arguments to a function. You could check this at the beginning of your program using `stopifnot()` so that the user can quickly realize something has gone wrong.\n\nYou can think of a function as kind of contract between you and the user:\n\n- if the user provides specified arguments, your program will provide predictable results.\n\nOf course it's **impossible for you to anticipate** all of the potential uses of your program.\n\nIt's **appropriate to create a warning** when this contract between you and the user is violated.\n\nA perfect example of this situation is the result of\n\n\n::: {.cell}\n\n```{.r .cell-code}\nas.numeric(c(\"5\", \"6\", \"seven\"))\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nWarning: NAs introduced by coercion\n```\n:::\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 5 6 NA\n```\n:::\n:::\n\n\nThe user expects a vector of numbers to be returned as the result of `as.numeric()` but `\"seven\"` is coerced into being NA, which is not completely intuitive.\n\nR has largely been developed according to the [Unix Philosophy](https://en.wikipedia.org/wiki/Unix_philosophy), which generally **discourages printing text to the console unless something unexpected has occurred**.\n\nLanguages that commonly run on Unix systems like C and C++ are rarely used interactively, meaning that they usually underpin computer infrastructure (computers \"talking\" to other computers).\n\n**Messages printed to the console** are therefore not very useful since nobody will ever read them and it's not straightforward for other programs to capture and interpret them.\n\nIn contrast, R code is frequently executed by human beings in the R console, which serves as an interactive environment between the computer and person at the keyboard.\n\nIf you **think your program should produce a message**, make sure that the **output of the message is primarily meant for a human to read**.\n\nYou should avoid signaling a condition or the result of your program to another program by creating a message.\n\n## How should errors be handled?\n\nImagine writing a program that will take a long time to complete because of a complex calculation or because you're handling a large amount of data. If an error occurs during this computation then you're liable to lose all of the results that were calculated before the error, or your program may not finish a critical task that a program further down your pipeline is depending on. If you anticipate the possibility of errors occurring during the execution of your program, then you can design your program to handle them appropriately.\n\nThe `tryCatch()` function is the workhorse of handling errors and warnings in R. The first argument of this function is any R expression, followed by conditions which specify how to handle an error or a warning. The last argument, `finally`, specifies a function or expression that will be executed after the expression no matter what, even in the event of an error or a warning.\n\nLet's construct a simple function I'm going to call [`beera`](https://en.wikipedia.org/wiki/Yogi_Berra) that catches errors and warnings gracefully.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nbeera <- function(expr){\n tryCatch(expr,\n error = function(e){\n message(\"An error occurred:\\n\", e)\n },\n warning = function(w){\n message(\"A warning occured:\\n\", w)\n },\n finally = {\n message(\"Finally done!\")\n })\n}\n```\n:::\n\n\nThis function takes an expression as an argument and tries to evaluate it. If the expression can be evaluated without any errors or warnings then the result of the expression is returned and the message `Finally done!` is printed to the R console. If an error or warning is generated, then the functions that are provided to the `error` or `warning` arguments are printed. Let's try this function out with a few examples.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nbeera({\n 2 + 2\n})\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nFinally done!\n```\n:::\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 4\n```\n:::\n\n```{.r .cell-code}\nbeera({\n \"two\" + 2\n})\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nAn error occurred:\nError in \"two\" + 2: non-numeric argument to binary operator\n\nFinally done!\n```\n:::\n\n```{.r .cell-code}\nbeera({\n as.numeric(c(1, \"two\", 3))\n})\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nA warning occured:\nsimpleWarning in doTryCatch(return(expr), name, parentenv, handler): NAs introduced by coercion\n\nFinally done!\n```\n:::\n:::\n\n\nNotice that we've effectively transformed errors and warnings into messages.\n\nNow that you know the basics of generating and catching errors you'll need to decide when your program should generate an error. My advice to you is to limit the number of errors your program generates as much as possible. Even if you design your program so that it's able to catch and handle errors, the error handling process slows down your program by orders of magnitude. Imagine you wanted to write a simple function that checks if an argument is an even number. You might write the following:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nis_even <- function(n){\n n %% 2 == 0\n}\n\nis_even(768)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] TRUE\n```\n:::\n\n```{.r .cell-code}\nis_even(\"two\")\n```\n\n::: {.cell-output .cell-output-error}\n```\nError in n%%2: non-numeric argument to binary operator\n```\n:::\n:::\n\n\nYou can see that providing a string causes this function to raise an error. You could imagine though that you want to use this function across a list of different data types, and you only want to know which elements of that list are even numbers. You might think to write the following:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nis_even_error <- function(n){\n tryCatch(n %% 2 == 0,\n error = function(e){\n FALSE\n })\n}\n\nis_even_error(714)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] TRUE\n```\n:::\n\n```{.r .cell-code}\nis_even_error(\"eight\")\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] FALSE\n```\n:::\n:::\n\n\nThis appears to be working the way you intended, however when applied to more data this function will be seriously slow compared to alternatives. For example I could check that `n` is numeric before treating `n` like a number:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nis_even_check <- function(n){\n is.numeric(n) && n %% 2 == 0\n}\n\nis_even_check(1876)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] TRUE\n```\n:::\n\n```{.r .cell-code}\nis_even_check(\"twelve\")\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] FALSE\n```\n:::\n:::\n\n\n::: keyideas\nNotice that by using `is.numeric()` before the \"AND\" operator (`&&`), the expression `n %% 2 == 0` is never evaluated. This is a programming language design feature called \"short circuiting.\" The expression can never evaluate to `TRUE` if the left hand side of `&&` evaluates to `FALSE`, so the right hand side is ignored.\n:::\n\nTo demonstrate the difference in the speed of the code, we will use the `microbenchmark` package to measure how long it takes for each function to be applied to the same data.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(microbenchmark)\nmicrobenchmark(sapply(letters, is_even_check))\n```\n:::\n\n\n``` \nUnit: microseconds\n expr min lq mean median uq max neval\n sapply(letters, is_even_check) 46.224 47.7975 61.43616 48.6445 58.4755 167.091 100\n```\n\n\n::: {.cell}\n\n```{.r .cell-code}\nmicrobenchmark(sapply(letters, is_even_error))\n```\n:::\n\n\n``` \nUnit: microseconds\n expr min lq mean median uq max neval\n sapply(letters, is_even_error) 640.067 678.0285 906.3037 784.4315 1044.501 2308.931 100\n```\n\nThe error catching approach is nearly 15 times slower!\n\nProper error handling is an essential tool for any software developer so that you can design programs that are error tolerant. Creating clear and informative error messages is essential for building quality software.\n\n::: callout-tip\n### Pro-tip\n\nOne closing tip I recommend is to put documentation for your software online, including the meaning of the errors that your software can potentially throw. Often a user's first instinct when encountering an error is to search online for that error message, which should lead them to your documentation!\n:::\n\n# Summary\n\n- Errors, warnings, and messages can be generated within R code using the functions `stop`, `stopifnot`, `warning`, and `message`.\n\n- Catching errors, and providing useful error messaging, can improve user experience with functions but can also slow down code substantially.\n\n# Post-lecture materials\n\n### Additional Resources\n\n::: callout-tip\n- \n- \n:::\n\n# R session information\n\n\n::: {.cell}\n\n```{.r .cell-code}\noptions(width = 120)\nsessioninfo::session_info()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────\n setting value\n version R version 4.3.1 (2023-06-16)\n os macOS Ventura 13.5\n system aarch64, darwin20\n ui X11\n language (EN)\n collate en_US.UTF-8\n ctype en_US.UTF-8\n tz America/New_York\n date 2023-08-17\n pandoc 3.1.5 @ /opt/homebrew/bin/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────\n package * version date (UTC) lib source\n cli 3.6.1 2023-03-23 [1] CRAN (R 4.3.0)\n colorout 1.2-2 2023-05-06 [1] Github (jalvesaq/colorout@79931fd)\n digest 0.6.33 2023-07-07 [1] CRAN (R 4.3.0)\n evaluate 0.21 2023-05-05 [1] CRAN (R 4.3.0)\n fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.3.0)\n htmltools 0.5.6 2023-08-10 [1] CRAN (R 4.3.0)\n htmlwidgets 1.6.2 2023-03-17 [1] CRAN (R 4.3.0)\n jsonlite 1.8.7 2023-06-29 [1] CRAN (R 4.3.0)\n knitr 1.43 2023-05-25 [1] CRAN (R 4.3.0)\n rlang 1.1.1 2023-04-28 [1] CRAN (R 4.3.0)\n rmarkdown 2.24 2023-08-14 [1] CRAN (R 4.3.1)\n rstudioapi 0.15.0 2023-07-07 [1] CRAN (R 4.3.0)\n sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.3.0)\n xfun 0.40 2023-08-09 [1] CRAN (R 4.3.0)\n yaml 2.3.7 2023-01-23 [1] CRAN (R 4.3.0)\n\n [1] /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library\n\n──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n```\n:::\n:::\n", + "markdown": "---\ntitle: \"19 - Error Handling and Generation\"\nauthor:\n - name: Leonardo Collado Torres\n url: http://lcolladotor.github.io/\n affiliations:\n - id: libd\n name: Lieber Institute for Brain Development\n url: https://libd.org/\n - id: jhsph\n name: Johns Hopkins Bloomberg School of Public Health Department of Biostatistics\n url: https://publichealth.jhu.edu/departments/biostatistics\ndescription: \"Implement exception handling routines in R functions\"\ncategories: [module 4, week 5, programming, debugging]\n---\n\n\n*This lecture, as the rest of the course, is adapted from the version [Stephanie C. Hicks](https://www.stephaniehicks.com/) designed and maintained in 2021 and 2022. Check the recent changes to this file through the [GitHub history](https://github.com/lcolladotor/jhustatcomputing2023/commits/main/posts/19-error-handling-and-generation/index.qmd).*\n\n# Pre-lecture materials\n\n### Read ahead\n\n::: callout-note\n## Read ahead\n\n**Before class, you can prepare by reading the following materials:**\n\n1. \n:::\n\n### Acknowledgements\n\nMaterial for this lecture was borrowed and adopted from\n\n- \n- \n\n# Learning objectives\n\n::: callout-note\n# Learning objectives\n\n**At the end of this lesson you will:**\n\n- Create errors, warnings, and messages in R functions using the functions `stop`, `stopifnot`, `warning`, and `message`.\n- Understand the importance of providing useful error messaging to improve user experience with functions. However, these can also slow down code substantially.\n:::\n\n# Error Handling and Generation\n\n## What is an error?\n\n**Errors most often occur** when code is used in a way that **it is not intended to be used**.\n\n::: callout-tip\n### Example\n\nFor example adding two strings together produces the following error:\n\n\n::: {.cell}\n\n```{.r .cell-code}\n\"hello\" + \"world\"\n```\n\n::: {.cell-output .cell-output-error}\n```\nError in \"hello\" + \"world\": non-numeric argument to binary operator\n```\n:::\n:::\n\n:::\n\nThe `+` operator is essentially a **function** that takes two numbers as arguments and finds their sum.\n\nSince neither `\"hello\"` nor `\"world\"` are numbers, the R interpreter produces an error.\n\n**Errors will stop the execution of your program**, and they will (hopefully) print an error message to the R console.\n\nIn R there are two other constructs which are related to errors:\n\n1. Warnings\n2. Messages\n\n**Warnings** are meant to indicate that **something seems to have gone wrong** in your program that should be inspected.\n\n::: callout-tip\n### Example\n\nHere's a simple example of a warning being generated:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nas.numeric(c(\"5\", \"6\", \"seven\"))\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nWarning: NAs introduced by coercion\n```\n:::\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 5 6 NA\n```\n:::\n:::\n\n\nThe `as.numeric()` function attempts to **convert each string** in `c(\"5\", \"6\", \"seven\")` into a number, however it is impossible to convert `\"seven\"`, so a warning is generated.\n\nExecution of the code is not halted, and an `NA` is produced for `\"seven\"` instead of a number.\n:::\n\n**Messages** simply **print to the R console**, though they are generated by an underlying mechanism that is similar to how errors and warning are generated.\n\n::: callout-tip\n### Example\n\nHere's a small function that will generate a message:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nf <- function() {\n message(\"This is a message.\")\n}\n\nf()\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nThis is a message.\n```\n:::\n:::\n\n:::\n\n## Generating Errors\n\nThere are a few essential functions for **generating** errors, warnings, and messages in R.\n\nThe `stop()` function will generate an error.\n\n::: callout-tip\n### Example\n\nLet's generate an error:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nstop(\"Something erroneous has occurred!\")\n```\n:::\n\n\n``` r\nError: Something erroneous has occurred!\n```\n:::\n\nIf an error occurs inside of a function, then the **name of that function will appear in the error message**:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nname_of_function <- function() {\n stop(\"Something bad happened.\")\n}\n\nname_of_function()\n```\n\n::: {.cell-output .cell-output-error}\n```\nError in name_of_function(): Something bad happened.\n```\n:::\n:::\n\n\nThe `stopifnot()` function takes a series of logical expressions as arguments and if any of them are false an error is generated specifying which expression is false.\n\n::: callout-tip\n### Example\n\nLet's take a look at an example:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nerror_if_n_is_greater_than_zero <- function(n) {\n stopifnot(n <= 0)\n n\n}\n\nerror_if_n_is_greater_than_zero(5)\n```\n\n::: {.cell-output .cell-output-error}\n```\nError in error_if_n_is_greater_than_zero(5): n <= 0 is not TRUE\n```\n:::\n:::\n\n:::\n\nThe `warning()` function creates a warning, and the function itself is very similar to the `stop()` function. Remember that a warning does not stop the execution of a program (unlike an error.)\n\n::: callout-tip\n### Example\n\n\n::: {.cell}\n\n```{.r .cell-code}\nwarning(\"Consider yourself warned!\")\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nWarning: Consider yourself warned!\n```\n:::\n:::\n\n:::\n\nJust like errors, a warning generated inside of a function will include the name of the function in which it was generated:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nmake_NA <- function(x) {\n warning(\"Generating an NA.\")\n NA\n}\n\nmake_NA(\"Sodium\")\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nWarning in make_NA(\"Sodium\"): Generating an NA.\n```\n:::\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] NA\n```\n:::\n:::\n\n\nMessages are simpler than errors or warnings; they just print strings to the R console.\n\nYou can issue a message with the `message()` function:\n\n::: callout-tip\n### Example\n\n\n::: {.cell}\n\n```{.r .cell-code}\nmessage(\"In a bottle.\")\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nIn a bottle.\n```\n:::\n:::\n\n:::\n\n## When to generate errors or warnings\n\nStopping the execution of your program with `stop()` should only happen in the event of a catastrophe - meaning only if it is impossible for your program to continue.\n\n- If there are **conditions that you can anticipate** that would cause your program to create an error, then you **should document those conditions** so whoever uses your software is aware.\n\nAn example includes:\n\n- Providing invalid arguments to a function. You could check this at the beginning of your program using `stopifnot()` so that the user can quickly realize something has gone wrong.\n\nYou can think of a function as kind of contract between you and the user:\n\n- if the user provides specified arguments, your program will provide predictable results.\n\nOf course it's **impossible for you to anticipate** all of the potential uses of your program.\n\nIt's **appropriate to create a warning** when this contract between you and the user is violated.\n\nA perfect example of this situation is the result of\n\n\n::: {.cell}\n\n```{.r .cell-code}\nas.numeric(c(\"5\", \"6\", \"seven\"))\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nWarning: NAs introduced by coercion\n```\n:::\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 5 6 NA\n```\n:::\n:::\n\n\nThe user expects a vector of numbers to be returned as the result of `as.numeric()` but `\"seven\"` is coerced into being NA, which is not completely intuitive.\n\nR has largely been developed according to the [Unix Philosophy](https://en.wikipedia.org/wiki/Unix_philosophy), which generally **discourages printing text to the console unless something unexpected has occurred**.\n\nLanguages that commonly run on Unix systems like C and C++ are rarely used interactively, meaning that they usually underpin computer infrastructure (computers \"talking\" to other computers).\n\n**Messages printed to the console** are therefore not very useful since nobody will ever read them and it's not straightforward for other programs to capture and interpret them.\n\nIn contrast, R code is frequently executed by human beings in the R console, which serves as an interactive environment between the computer and person at the keyboard.\n\nIf you **think your program should produce a message**, make sure that the **output of the message is primarily meant for a human to read**.\n\nYou should avoid signaling a condition or the result of your program to another program by creating a message.\n\n## How should errors be handled?\n\nImagine writing a program that will take a long time to complete because of a complex calculation or because you're handling a large amount of data. If an error occurs during this computation then you're liable to lose all of the results that were calculated before the error, or your program may not finish a critical task that a program further down your pipeline is depending on. If you anticipate the possibility of errors occurring during the execution of your program, then you can design your program to handle them appropriately.\n\nThe `tryCatch()` function is the workhorse of handling errors and warnings in R. The first argument of this function is any R expression, followed by conditions which specify how to handle an error or a warning. The last argument, `finally`, specifies a function or expression that will be executed after the expression no matter what, even in the event of an error or a warning.\n\nLet's construct a simple function I'm going to call [`beera`](https://en.wikipedia.org/wiki/Yogi_Berra) that catches errors and warnings gracefully.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nbeera <- function(expr) {\n tryCatch(expr,\n error = function(e) {\n message(\"An error occurred:\\n\", e)\n },\n warning = function(w) {\n message(\"A warning occured:\\n\", w)\n },\n finally = {\n message(\"Finally done!\")\n }\n )\n}\n```\n:::\n\n\nThis function takes an expression as an argument and tries to evaluate it. If the expression can be evaluated without any errors or warnings then the result of the expression is returned and the message `Finally done!` is printed to the R console. If an error or warning is generated, then the functions that are provided to the `error` or `warning` arguments are printed. Let's try this function out with a few examples.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nbeera({\n 2 + 2\n})\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nFinally done!\n```\n:::\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 4\n```\n:::\n\n```{.r .cell-code}\nbeera({\n \"two\" + 2\n})\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nAn error occurred:\nError in \"two\" + 2: non-numeric argument to binary operator\n\nFinally done!\n```\n:::\n\n```{.r .cell-code}\nbeera({\n as.numeric(c(1, \"two\", 3))\n})\n```\n\n::: {.cell-output .cell-output-stderr}\n```\nA warning occured:\nsimpleWarning in doTryCatch(return(expr), name, parentenv, handler): NAs introduced by coercion\n\nFinally done!\n```\n:::\n:::\n\n\nNotice that we've effectively transformed errors and warnings into messages.\n\nNow that you know the basics of generating and catching errors you'll need to decide when your program should generate an error. My advice to you is to limit the number of errors your program generates as much as possible. Even if you design your program so that it's able to catch and handle errors, the error handling process slows down your program by orders of magnitude. Imagine you wanted to write a simple function that checks if an argument is an even number. You might write the following:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nis_even <- function(n) {\n n %% 2 == 0\n}\n\nis_even(768)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] TRUE\n```\n:::\n\n```{.r .cell-code}\nis_even(\"two\")\n```\n\n::: {.cell-output .cell-output-error}\n```\nError in n%%2: non-numeric argument to binary operator\n```\n:::\n:::\n\n\nYou can see that providing a string causes this function to raise an error. You could imagine though that you want to use this function across a list of different data types, and you only want to know which elements of that list are even numbers. You might think to write the following:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nis_even_error <- function(n) {\n tryCatch(n %% 2 == 0,\n error = function(e) {\n FALSE\n }\n )\n}\n\nis_even_error(714)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] TRUE\n```\n:::\n\n```{.r .cell-code}\nis_even_error(\"eight\")\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] FALSE\n```\n:::\n:::\n\n\nThis appears to be working the way you intended, however when applied to more data this function will be seriously slow compared to alternatives. For example I could check that `n` is numeric before treating `n` like a number:\n\n\n::: {.cell}\n\n```{.r .cell-code}\nis_even_check <- function(n) {\n is.numeric(n) && n %% 2 == 0\n}\n\nis_even_check(1876)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] TRUE\n```\n:::\n\n```{.r .cell-code}\nis_even_check(\"twelve\")\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] FALSE\n```\n:::\n:::\n\n\n::: keyideas\nNotice that by using `is.numeric()` before the \"AND\" operator (`&&`), the expression `n %% 2 == 0` is never evaluated. This is a programming language design feature called \"short circuiting.\" The expression can never evaluate to `TRUE` if the left hand side of `&&` evaluates to `FALSE`, so the right hand side is ignored.\n:::\n\nTo demonstrate the difference in the speed of the code, we will use the `microbenchmark` package to measure how long it takes for each function to be applied to the same data.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(microbenchmark)\nmicrobenchmark(sapply(letters, is_even_check))\n```\n:::\n\n\n``` \nUnit: microseconds\n expr min lq mean median uq max neval\n sapply(letters, is_even_check) 46.224 47.7975 61.43616 48.6445 58.4755 167.091 100\n```\n\n\n::: {.cell}\n\n```{.r .cell-code}\nmicrobenchmark(sapply(letters, is_even_error))\n```\n:::\n\n\n``` \nUnit: microseconds\n expr min lq mean median uq max neval\n sapply(letters, is_even_error) 640.067 678.0285 906.3037 784.4315 1044.501 2308.931 100\n```\n\nThe error catching approach is nearly 15 times slower!\n\nProper error handling is an essential tool for any software developer so that you can design programs that are error tolerant. Creating clear and informative error messages is essential for building quality software.\n\n::: callout-tip\n### Pro-tip\n\nOne closing tip I recommend is to put documentation for your software online, including the meaning of the errors that your software can potentially throw. Often a user's first instinct when encountering an error is to search online for that error message, which should lead them to your documentation!\n:::\n\n# Summary\n\n- Errors, warnings, and messages can be generated within R code using the functions `stop`, `stopifnot`, `warning`, and `message`.\n\n- Catching errors, and providing useful error messaging, can improve user experience with functions but can also slow down code substantially.\n\n# Post-lecture materials\n\n### Additional Resources\n\n::: callout-tip\n- \n- \n:::\n\n# R session information\n\n\n::: {.cell}\n\n```{.r .cell-code}\noptions(width = 120)\nsessioninfo::session_info()\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────\n setting value\n version R version 4.3.1 (2023-06-16)\n os macOS Ventura 13.5\n system aarch64, darwin20\n ui X11\n language (EN)\n collate en_US.UTF-8\n ctype en_US.UTF-8\n tz America/New_York\n date 2023-08-17\n pandoc 3.1.5 @ /opt/homebrew/bin/ (via rmarkdown)\n\n─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────\n package * version date (UTC) lib source\n cli 3.6.1 2023-03-23 [1] CRAN (R 4.3.0)\n colorout 1.2-2 2023-05-06 [1] Github (jalvesaq/colorout@79931fd)\n digest 0.6.33 2023-07-07 [1] CRAN (R 4.3.0)\n evaluate 0.21 2023-05-05 [1] CRAN (R 4.3.0)\n fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.3.0)\n htmltools 0.5.6 2023-08-10 [1] CRAN (R 4.3.0)\n htmlwidgets 1.6.2 2023-03-17 [1] CRAN (R 4.3.0)\n jsonlite 1.8.7 2023-06-29 [1] CRAN (R 4.3.0)\n knitr 1.43 2023-05-25 [1] CRAN (R 4.3.0)\n rlang 1.1.1 2023-04-28 [1] CRAN (R 4.3.0)\n rmarkdown 2.24 2023-08-14 [1] CRAN (R 4.3.1)\n rstudioapi 0.15.0 2023-07-07 [1] CRAN (R 4.3.0)\n sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.3.0)\n xfun 0.40 2023-08-09 [1] CRAN (R 4.3.0)\n yaml 2.3.7 2023-01-23 [1] CRAN (R 4.3.0)\n\n [1] /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library\n\n──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n```\n:::\n:::\n", "supporting": [], "filters": [ "rmarkdown/pagebreak.lua" diff --git a/_freeze/posts/20-working-with-dates-and-times/index/execute-results/html.json b/_freeze/posts/20-working-with-dates-and-times/index/execute-results/html.json index 95b68c9..b82baf4 100644 --- a/_freeze/posts/20-working-with-dates-and-times/index/execute-results/html.json +++ b/_freeze/posts/20-working-with-dates-and-times/index/execute-results/html.json @@ -1,7 +1,7 @@ { - "hash": "f3b1703648e41b35e71a956912954ed5", + "hash": "9fcf3d6b99d63f4cc32e29c25e524a43", "result": { - "markdown": "---\ntitle: \"20 - Working with dates and times\"\nauthor:\n - name: Leonardo Collado Torres\n url: http://lcolladotor.github.io/\n affiliations:\n - id: libd\n name: Lieber Institute for Brain Development\n url: https://libd.org/\n - id: jhsph\n name: Johns Hopkins Bloomberg School of Public Health Department of Biostatistics\n url: https://publichealth.jhu.edu/departments/biostatistics\ndescription: \"Introduction to lubridate for dates and times in R\"\ncategories: [module 5, week 6, tidyverse, R, programming, dates and times]\n---\n\n\n*This lecture, as the rest of the course, is adapted from the version [Stephanie C. Hicks](https://www.stephaniehicks.com/) designed and maintained in 2021 and 2022. Check the recent changes to this file through the [GitHub history](https://github.com/lcolladotor/jhustatcomputing2023/commits/main/posts/20-working-with-dates-and-times/index.qmd).*\n\n\n\n# Pre-lecture materials\n\n### Read ahead\n\n::: callout-note\n## Read ahead\n\n**Before class, you can prepare by reading the following materials:**\n\n1. \n:::\n\n### Acknowledgements\n\nMaterial for this lecture was borrowed and adopted from\n\n- \n- \n\n# Learning objectives\n\n::: callout-note\n# Learning objectives\n\n**At the end of this lesson you will:**\n\n- Recognize the `Date`, `POSIXct` and `POSIXlt` class types in R to represent dates and times\n- Learn how to create date and time objects in R using functions from the `lubridate` package\n- Learn how dealing with time zones can be frustrating 🙀 but hopefully less so after today's lecture 😺\n- Learn how to perform arithmetic operations on dates and times\n- Learn how plotting systems in R \"know\" about dates and times to appropriately handle axis labels\n:::\n\n# Introduction\n\nIn this lesson, we will **learn how to work with dates and times** in R. These may seem simple as you use them all of the time in your day-to-day life, but the more you work with them, the more complicated they seem to get.\n\n**Dates and times are hard to work with** because they have to reconcile **two physical phenomena**\n\n1. The rotation of the Earth and its orbit around the sun AND\n2. A whole raft of geopolitical phenomena including months, time zones, and daylight savings time (DST)\n\nThis lesson will not teach you every last detail about dates and times, but it will give you a solid grounding of **practical skills** that will help you with common data analysis challenges.\n\n::: callout-tip\n### Classes for dates and times in R\n\nR has developed a special representation of dates and times\n\n- Dates are represented by the `Date` class\n- Times are represented by the `POSIXct` or the `POSIXlt` class\n:::\n\n::: callout-tip\n### Important point in time\n\n- Dates are stored internally as the number of days since 1970-01-01\n- Times are stored internally as the number of seconds since 1970-01-01\n\nIn computing, **Unix time** (also known as Epoch time, Posix time, seconds since the Epoch, Unix timestamp, or UNIX Epoch time) is a system for **describing a point in time**.\n\nIt is the number of seconds that have elapsed since the Unix epoch, excluding leap seconds. The Unix epoch is 00:00:00 UTC on 1 January 1970.\n\nUnix time originally appeared as the system time of Unix, but is now used widely in computing, for example by filesystems; some Python language library functions handle Unix time.\\[4\\]\n\n\n:::\n\n## The `lubridate` package\n\nHere, we will focus on the `lubridate` R package, which makes it easier to work with dates and times in R.\n\n::: callout-tip\n### Pro-tip\n\n**Check out the `lubridate` cheat sheet** at \n:::\n\nA few things to note about it:\n\n- It largely **replaces the default date/time functions in base R**\n- It contains **methods for date/time arithmetic**\n- It **handles time zones**, leap year, leap seconds, etc.\n\n![Artwork by Allison Horst on the dplyr package](https://github.com/allisonhorst/stats-illustrations/raw/main/rstats-artwork/lubridate_ymd.png){preview=\"TRUE\"} \\[**Source**: [Artwork by Allison Horst](https://github.com/allisonhorst/stats-illustrations)\\]\n\n`lubridate` is installed when you install `tidyverse`, but it is not loaded when you load `tidyverse`. Alternatively, you can install it separately.\n\n\n::: {.cell}\n\n```{.r .cell-code}\ninstall.packages(\"lubridate\") \n```\n:::\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(tidyverse)\nlibrary(lubridate) \n```\n:::\n\n\n# Creating date/times\n\nThere are three types of date/time data that refer to an instant in time:\n\n- A **date**. Tibbles print this as ``.\n- A **time** within a day. Tibbles print this as `

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