{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Tutorial: Data Cleansing and the Tidyverse\n", "\n", "This lab serves as an introduction to data processing in R using the `tidyverse` family of packages. We cover a lot of material in this tutorial, and recommend coming back to use this as a reference while you learn the `tidyverse` ropes.\n", "\n", "## Goals:\n", "* Learn how to use `tidyverse`\n", "* Learn about the pipe operator\n", "* Learn various data transformations in R" ] }, { "cell_type": "markdown", "metadata": { "id": "J1TgD9BM0ZAG" }, "source": [ "---\n", "# Getting started\n", "\n", "For many people, their first instinct when it comes to data cleansing is to open their data with Excel and just start manually cleaning it up by replacing values, creating new columns, etc. The problem with that approach is that you cannot easily replicate the steps you have taken to transform the raw data into the final format you use for your analyses. This issue has many consequences, but among the two most common are, first, that if you get new or additional data from the same source, you would have to manually perform the same operations again, and second, if you make a mistake it would be difficult to identify where exactly that happened. The best approach is to preprocess your data with a script in the same way you do your analyses. However, doing so in base R can be quite cumbersome. In this tutorial, you will learn how to use tools for the **`tidyverse`** packages. Tidyverse is a collection of useful packages, which include **`ggplot2`**, **`tidyr`**, **`dplyr`**, etc, combined in a single package.\n", "\n", "Before we begin, you'll need to install and load the `tidyverse` package:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "The downloaded binary packages are in\n", "\t/var/folders/yg/xzc1rwm52nxc0l8mlvk8dkjw0000gp/T//RtmpOtBuZA/downloaded_packages\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "── \u001b[1mAttaching packages\u001b[22m ─────────────────────────────────────── tidyverse 1.3.2 ──\n", "\u001b[32m✔\u001b[39m \u001b[34mggplot2\u001b[39m 3.3.6 \u001b[32m✔\u001b[39m \u001b[34mpurrr \u001b[39m 0.3.5 \n", "\u001b[32m✔\u001b[39m \u001b[34mtibble \u001b[39m 3.1.8 \u001b[32m✔\u001b[39m \u001b[34mdplyr \u001b[39m 1.0.10\n", "\u001b[32m✔\u001b[39m \u001b[34mtidyr \u001b[39m 1.2.1 \u001b[32m✔\u001b[39m \u001b[34mstringr\u001b[39m 1.4.1 \n", "\u001b[32m✔\u001b[39m \u001b[34mreadr \u001b[39m 2.1.3 \u001b[32m✔\u001b[39m \u001b[34mforcats\u001b[39m 0.5.2 \n", "── \u001b[1mConflicts\u001b[22m ────────────────────────────────────────── tidyverse_conflicts() ──\n", "\u001b[31m✖\u001b[39m \u001b[34mdplyr\u001b[39m::\u001b[32mfilter()\u001b[39m masks \u001b[34mstats\u001b[39m::filter()\n", "\u001b[31m✖\u001b[39m \u001b[34mdplyr\u001b[39m::\u001b[32mlag()\u001b[39m masks \u001b[34mstats\u001b[39m::lag()\n" ] } ], "source": [ "install.packages('tidyverse')\n", "library(tidyverse)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Data \n", "\n", "We will use the `iris` dataset for illustrating the tidyverse functions. We'll save it to a `dat` variable like this so we can make changes to it:" ] }, { "cell_type": "code", "execution_count": 140, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
A data.frame: 6 × 5
Sepal.LengthSepal.WidthPetal.LengthPetal.WidthSpecies
<dbl><dbl><dbl><dbl><fct>
15.13.51.40.2setosa
24.93.01.40.2setosa
34.73.21.30.2setosa
44.63.11.50.2setosa
55.03.61.40.2setosa
65.43.91.70.4setosa
\n" ], "text/latex": [ "A data.frame: 6 × 5\n", "\\begin{tabular}{r|lllll}\n", " & Sepal.Length & Sepal.Width & Petal.Length & Petal.Width & Species\\\\\n", " & & & & & \\\\\n", "\\hline\n", "\t1 & 5.1 & 3.5 & 1.4 & 0.2 & setosa\\\\\n", "\t2 & 4.9 & 3.0 & 1.4 & 0.2 & setosa\\\\\n", "\t3 & 4.7 & 3.2 & 1.3 & 0.2 & setosa\\\\\n", "\t4 & 4.6 & 3.1 & 1.5 & 0.2 & setosa\\\\\n", "\t5 & 5.0 & 3.6 & 1.4 & 0.2 & setosa\\\\\n", "\t6 & 5.4 & 3.9 & 1.7 & 0.4 & setosa\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "A data.frame: 6 × 5\n", "\n", "| | Sepal.Length <dbl> | Sepal.Width <dbl> | Petal.Length <dbl> | Petal.Width <dbl> | Species <fct> |\n", "|---|---|---|---|---|---|\n", "| 1 | 5.1 | 3.5 | 1.4 | 0.2 | setosa |\n", "| 2 | 4.9 | 3.0 | 1.4 | 0.2 | setosa |\n", "| 3 | 4.7 | 3.2 | 1.3 | 0.2 | setosa |\n", "| 4 | 4.6 | 3.1 | 1.5 | 0.2 | setosa |\n", "| 5 | 5.0 | 3.6 | 1.4 | 0.2 | setosa |\n", "| 6 | 5.4 | 3.9 | 1.7 | 0.4 | setosa |\n", "\n" ], "text/plain": [ " Sepal.Length Sepal.Width Petal.Length Petal.Width Species\n", "1 5.1 3.5 1.4 0.2 setosa \n", "2 4.9 3.0 1.4 0.2 setosa \n", "3 4.7 3.2 1.3 0.2 setosa \n", "4 4.6 3.1 1.5 0.2 setosa \n", "5 5.0 3.6 1.4 0.2 setosa \n", "6 5.4 3.9 1.7 0.4 setosa " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "dat <- iris\n", "head(dat)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `iris` dataset contains [measurement data](https://eloquentarduino.github.io/2019/12/iris-classification-on-arduino/) for different species of iris flowers. You can view a detailed description of the dataset by typing:\n", "```\n", "?iris\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "# A standardized grammar\n", "One of the reasons that the tidyverse is so popular for data manipulation and analysis is that it uses a **standardized grammar** across all of its packages. This means that it's really easy to make different functions talk to each other, and function options or additional arguments all match the same style so they're easier to remember.\n", "\n", "In the tidyverse, the first argument of a function is always the **object** that you want to perform the given function on. For example,\n", "\n", "```\n", "mutate(data, var1 = c(1, 2, 3, 4))\n", "```\n", "would take the data frame `data`, and add a new column called `var1` consisting of the given vector.\n", "\n", "This object-as-first-argument style is really helpful when you want to perform a series of functions on the same object.\n", "\n", "Another feature of the tidyverse is that most functions use something called **tidy evaluation**. This means that when you are calling a variable within the function, you typically don't need to specify which dataframe it is located in. So instead of doing:\n", "```\n", "select(data, c(data$var1, data$var2))\n", "```\n", "\n", "You can just do:\n", "```\n", "select(data, c(var1, var2))\n", "```\n", "And it will know to look for `var1` and `var2` in the `data` object. This helps streamline code." ] }, { "cell_type": "markdown", "metadata": { "id": "_W5_oFhn0ZAL" }, "source": [ "## Pipes: the %>% operator" ] }, { "cell_type": "markdown", "metadata": { "id": "8lP3oIjy0ZAL" }, "source": [ "You might have noticed the weird **`%>%`** operator in the code in prior tutorials. This operator is called a **'pipe'**. Pipes are present in many programming languages, but not in the base R, so you might not be familiar with them. Pipes are an added feature from the Tidyverse package. \n", "\n", "A pipe serves as a link between two objects, whether they be variables or functions. The pipe tells R to take the object on its left side and pass it as the first argument to the function on the right. This is where the object-as-first-argument style really matters -- it's easy to pipe the output of one tidyverse function straight in as the input of the next, becuase the data object is always the first argument.\n", "\n", "Typically in R, if you want to pass an argument to a function, you specify it as `function(argument)`. For example, if you want to find the mean of the iris `Sepal.Width`, in base R you would do this:" ] }, { "cell_type": "code", "execution_count": 141, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "executionInfo": { "elapsed": 1334, "status": "ok", "timestamp": 1611095669015, "user": { "displayName": "Patience Stevens", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gi-_9ZqhIFhAv1oMehJNvNuIKSTyrFQHzjxQKhx=s64", "userId": "01994571539255174942" }, "user_tz": 300 }, "id": "H1ozV5Ve0ZAM", "outputId": "2abf5df6-9d0c-4e3b-9304-56dffde30444" }, "outputs": [ { "data": { "text/html": [ "3.05733333333333" ], "text/latex": [ "3.05733333333333" ], "text/markdown": [ "3.05733333333333" ], "text/plain": [ "[1] 3.057333" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "mean(iris$Sepal.Width)" ] }, { "cell_type": "markdown", "metadata": { "id": "esHOVJne0ZAM" }, "source": [ "If you use a pipe, you just put the argument on its left side, and the function on the right, i.e., `variable %>% function()`:" ] }, { "cell_type": "code", "execution_count": 142, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "executionInfo": { "elapsed": 1626, "status": "ok", "timestamp": 1611095669325, "user": { "displayName": "Patience Stevens", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gi-_9ZqhIFhAv1oMehJNvNuIKSTyrFQHzjxQKhx=s64", "userId": "01994571539255174942" }, "user_tz": 300 }, "id": "XYBMiqiK0ZAM", "outputId": "62949326-ba78-4ec5-96ca-042738d18287" }, "outputs": [ { "data": { "text/html": [ "3.05733333333333" ], "text/latex": [ "3.05733333333333" ], "text/markdown": [ "3.05733333333333" ], "text/plain": [ "[1] 3.057333" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "iris$Sepal.Width %>% mean()" ] }, { "cell_type": "markdown", "metadata": { "id": "PmYedpSk0ZAM" }, "source": [ "Now, you might be asking, why would you want to use **x %>% mean()** instead of **mean(x)**? Pipes are most useful when you have to run a series of functions on the same input. For example, let's say you want to find the mean of the observations, and then round the value to 2 significant digits. In base R, you can do this in two ways:\n", "\n", "1. nest the functions within one another\n", "2. assign a temporary variable for the mean, and then round that value" ] }, { "cell_type": "code", "execution_count": 143, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 52 }, "executionInfo": { "elapsed": 1612, "status": "ok", "timestamp": 1611095669327, "user": { "displayName": "Patience Stevens", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gi-_9ZqhIFhAv1oMehJNvNuIKSTyrFQHzjxQKhx=s64", "userId": "01994571539255174942" }, "user_tz": 300 }, "id": "8tZTqAAq0ZAN", "outputId": "73c88721-f681-4976-acc1-dfa30edcaaa2" }, "outputs": [ { "data": { "text/html": [ "3.06" ], "text/latex": [ "3.06" ], "text/markdown": [ "3.06" ], "text/plain": [ "[1] 3.06" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "3.06" ], "text/latex": [ "3.06" ], "text/markdown": [ "3.06" ], "text/plain": [ "[1] 3.06" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# nested\n", "round(mean(iris$Sepal.Width), 2)\n", "\n", "# tmp variable\n", "obs_mean = mean(iris$Sepal.Width)\n", "round(obs_mean, 2)" ] }, { "cell_type": "markdown", "metadata": { "id": "Q5TTG1CU0ZAN" }, "source": [ "Since pipes take the output of the expression on the left and send it as the first input to the expression on the right, you can do the following with pipes:" ] }, { "cell_type": "code", "execution_count": 144, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "executionInfo": { "elapsed": 1597, "status": "ok", "timestamp": 1611095669328, "user": { "displayName": "Patience Stevens", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gi-_9ZqhIFhAv1oMehJNvNuIKSTyrFQHzjxQKhx=s64", "userId": "01994571539255174942" }, "user_tz": 300 }, "id": "5xjWJPJS0ZAO", "outputId": "2f26de20-3ba4-4ae5-fb63-41395fb84de3" }, "outputs": [ { "data": { "text/html": [ "3.06" ], "text/latex": [ "3.06" ], "text/markdown": [ "3.06" ], "text/plain": [ "[1] 3.06" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# with pipes\n", "iris$Sepal.Width %>% \n", " mean() %>% \n", " round(2)" ] }, { "cell_type": "markdown", "metadata": { "id": "RMI5SW420ZAP" }, "source": [ "This reads smoothly from start to finish as, \"Take the observations, find the mean, and then round it to two decimals.\" \n", "\n", "Note that it's best practice to start a new row after each pipe operator, with the following functions indented.\n", "\n", "`round()` is not a tidyverse function, but notice that it also takes as first argument the **value** to be rounded, and as a second argument the number of digits to which to round. When you use a pipe, the first argument is implicitly filled in with the value on the left, so the first argument you actually type corresponds to the number of significant digits to which to round. \n", "\n", "This is the magic of the tidyverse pipe. As we'll see with our tidyverse functions below, you often want to use many of them, all in a row, on the same data object. While the above example might be easy to read in its nested form, it becomes very difficult to track what is going on with this approach as your code gets more complex. \n", "\n", "**Thus pipes have two advantages:**\n", "\n", "1. **Readability** - it is easier to see what goes on, because you can track the sequence naturally top to bottom. In contrast, with nested functions, you have to identify the inner-most function and then work your way outwards.\n", "2. **Efficiency** - you won't clutter your environment with temporary variables that you needed for only one intermediary observation.\n", "\n", "Because the pipe is so annoying to type, there is a handy keyboard shortcut:\n", "\n", "**Mac**: shift + command + M\n", "\n", "**PC**: shift + control + M" ] }, { "cell_type": "markdown", "metadata": { "id": "e5yZZfJS0ZAJ" }, "source": [ "---\n", "# Transforming data with tidyverse functions\n", "\n", "Below is a summary of the functions we will review and their general description. These functions come from the `dplyr` package, the `tidyr` package, and the `purrr` package:\n", "\n", "* **`mutate()`** - transform existing variables and create new variables\n", "* **`summarise()`** - summarize variables\n", "* **`filter()`** - filter rows based on a condition\n", "* **`select()`** - select columns to keep/remove\n", "* **`arrange()`** - sort by column/columns\n", "* **`unite()`** - combine two columns into one\n", "* **`separate()`** - split one column into multiple columns\n", "* **`*_join()`** - merge multiple dataframes\n", "* **`group_by()`** - implicitly group data\n", "* **`nest()`** - explicitly group data\n", "* **`map()`** - perform the same function on each element of list or vector\n", "* **`pivot_wider()`** - transform data to wide format (formerly `spread()`)\n", "* **`pivot_longer()`** - transform data to long format (formerly `gather()`)" ] }, { "cell_type": "markdown", "metadata": { "id": "8P2Yjlvj0ZAU" }, "source": [ "## `mutate()`: Transform existing variables and create new variables" ] }, { "cell_type": "markdown", "metadata": { "id": "Yyg73p_p0ZAU" }, "source": [ "`mutate()` is part of `dplyr`, one of the packages included in `tidyverse` that is handy for data manipulation. The `mutate()` command allows you to create new columns, i.e. new variables. Let's say you want to center the sepal lengths in the `iris` dataset by subtracting the mean:" ] }, { "cell_type": "code", "execution_count": 146, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 207 }, "executionInfo": { "elapsed": 1766, "status": "ok", "timestamp": 1611095669584, "user": { "displayName": "Patience Stevens", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gi-_9ZqhIFhAv1oMehJNvNuIKSTyrFQHzjxQKhx=s64", "userId": "01994571539255174942" }, "user_tz": 300 }, "id": "eOJI8TPg0ZAU", "outputId": "d2784afe-0eb9-440e-a4f4-0e237a9a8355" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
A data.frame: 6 × 6
Sepal.LengthSepal.WidthPetal.LengthPetal.WidthSpeciescentered_SepLen
<dbl><dbl><dbl><dbl><fct><dbl>
15.13.51.40.2setosa-0.7433333
24.93.01.40.2setosa-0.9433333
34.73.21.30.2setosa-1.1433333
44.63.11.50.2setosa-1.2433333
55.03.61.40.2setosa-0.8433333
65.43.91.70.4setosa-0.4433333
\n" ], "text/latex": [ "A data.frame: 6 × 6\n", "\\begin{tabular}{r|llllll}\n", " & Sepal.Length & Sepal.Width & Petal.Length & Petal.Width & Species & centered\\_SepLen\\\\\n", " & & & & & & \\\\\n", "\\hline\n", "\t1 & 5.1 & 3.5 & 1.4 & 0.2 & setosa & -0.7433333\\\\\n", "\t2 & 4.9 & 3.0 & 1.4 & 0.2 & setosa & -0.9433333\\\\\n", "\t3 & 4.7 & 3.2 & 1.3 & 0.2 & setosa & -1.1433333\\\\\n", "\t4 & 4.6 & 3.1 & 1.5 & 0.2 & setosa & -1.2433333\\\\\n", "\t5 & 5.0 & 3.6 & 1.4 & 0.2 & setosa & -0.8433333\\\\\n", "\t6 & 5.4 & 3.9 & 1.7 & 0.4 & setosa & -0.4433333\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "A data.frame: 6 × 6\n", "\n", "| | Sepal.Length <dbl> | Sepal.Width <dbl> | Petal.Length <dbl> | Petal.Width <dbl> | Species <fct> | centered_SepLen <dbl> |\n", "|---|---|---|---|---|---|---|\n", "| 1 | 5.1 | 3.5 | 1.4 | 0.2 | setosa | -0.7433333 |\n", "| 2 | 4.9 | 3.0 | 1.4 | 0.2 | setosa | -0.9433333 |\n", "| 3 | 4.7 | 3.2 | 1.3 | 0.2 | setosa | -1.1433333 |\n", "| 4 | 4.6 | 3.1 | 1.5 | 0.2 | setosa | -1.2433333 |\n", "| 5 | 5.0 | 3.6 | 1.4 | 0.2 | setosa | -0.8433333 |\n", "| 6 | 5.4 | 3.9 | 1.7 | 0.4 | setosa | -0.4433333 |\n", "\n" ], "text/plain": [ " Sepal.Length Sepal.Width Petal.Length Petal.Width Species centered_SepLen\n", "1 5.1 3.5 1.4 0.2 setosa -0.7433333 \n", "2 4.9 3.0 1.4 0.2 setosa -0.9433333 \n", "3 4.7 3.2 1.3 0.2 setosa -1.1433333 \n", "4 4.6 3.1 1.5 0.2 setosa -1.2433333 \n", "5 5.0 3.6 1.4 0.2 setosa -0.8433333 \n", "6 5.4 3.9 1.7 0.4 setosa -0.4433333 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "dat <- dat %>% #need to reassign the dat object with our new changes\n", " mutate(centered_SepLen = Sepal.Length - mean(Sepal.Length))\n", "\n", "head(dat)" ] }, { "cell_type": "markdown", "metadata": { "id": "gaQ6AejC0ZAU" }, "source": [ "Notice the tidy evaluation here -- we only need to indicate the dataset on the very first line. Within `mutate`, it knows to look for those variables in `dat`. \n", "\n", "If you want to create several variables in base R (that is, without using `dplyr` functions), you would have to do this everytime:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "id": "UGPeDg4s0ZAU" }, "outputs": [], "source": [ "# center sepal length\n", "dat$centered_SepLen = dat$Sepal.Length - mean(dat$Sepal.Length) \n", "# transforms petal length into zscores\n", "dat$PetLen_zscores = (dat$Petal.Length - mean(dat$Petal.Length))/sd(dat$Petal.Length)" ] }, { "cell_type": "markdown", "metadata": { "id": "MIZ2mqba0ZAU" }, "source": [ "Using `dplyr`, you don't have to write `dat$` every time you refer to a variable:" ] }, { "cell_type": "code", "execution_count": 148, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 207 }, "executionInfo": { "elapsed": 2437, "status": "ok", "timestamp": 1611095670273, "user": { "displayName": "Patience Stevens", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gi-_9ZqhIFhAv1oMehJNvNuIKSTyrFQHzjxQKhx=s64", "userId": "01994571539255174942" }, "user_tz": 300 }, "id": "9ZEsYPEK0ZAV", "outputId": "4ba1ff8f-bb02-4f02-9de1-e204d1f99b70" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
A data.frame: 6 × 8
Sepal.LengthSepal.WidthPetal.LengthPetal.WidthSpeciescentered_SepLenPetLen_zscoresn_flowers
<dbl><dbl><dbl><dbl><fct><dbl><dbl><int>
15.13.51.40.2setosa-0.7433333-1.335752150
24.93.01.40.2setosa-0.9433333-1.335752150
34.73.21.30.2setosa-1.1433333-1.392399150
44.63.11.50.2setosa-1.2433333-1.279104150
55.03.61.40.2setosa-0.8433333-1.335752150
65.43.91.70.4setosa-0.4433333-1.165809150
\n" ], "text/latex": [ "A data.frame: 6 × 8\n", "\\begin{tabular}{r|llllllll}\n", " & Sepal.Length & Sepal.Width & Petal.Length & Petal.Width & Species & centered\\_SepLen & PetLen\\_zscores & n\\_flowers\\\\\n", " & & & & & & & & \\\\\n", "\\hline\n", "\t1 & 5.1 & 3.5 & 1.4 & 0.2 & setosa & -0.7433333 & -1.335752 & 150\\\\\n", "\t2 & 4.9 & 3.0 & 1.4 & 0.2 & setosa & -0.9433333 & -1.335752 & 150\\\\\n", "\t3 & 4.7 & 3.2 & 1.3 & 0.2 & setosa & -1.1433333 & -1.392399 & 150\\\\\n", "\t4 & 4.6 & 3.1 & 1.5 & 0.2 & setosa & -1.2433333 & -1.279104 & 150\\\\\n", "\t5 & 5.0 & 3.6 & 1.4 & 0.2 & setosa & -0.8433333 & -1.335752 & 150\\\\\n", "\t6 & 5.4 & 3.9 & 1.7 & 0.4 & setosa & -0.4433333 & -1.165809 & 150\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "A data.frame: 6 × 8\n", "\n", "| | Sepal.Length <dbl> | Sepal.Width <dbl> | Petal.Length <dbl> | Petal.Width <dbl> | Species <fct> | centered_SepLen <dbl> | PetLen_zscores <dbl> | n_flowers <int> |\n", "|---|---|---|---|---|---|---|---|---|\n", "| 1 | 5.1 | 3.5 | 1.4 | 0.2 | setosa | -0.7433333 | -1.335752 | 150 |\n", "| 2 | 4.9 | 3.0 | 1.4 | 0.2 | setosa | -0.9433333 | -1.335752 | 150 |\n", "| 3 | 4.7 | 3.2 | 1.3 | 0.2 | setosa | -1.1433333 | -1.392399 | 150 |\n", "| 4 | 4.6 | 3.1 | 1.5 | 0.2 | setosa | -1.2433333 | -1.279104 | 150 |\n", "| 5 | 5.0 | 3.6 | 1.4 | 0.2 | setosa | -0.8433333 | -1.335752 | 150 |\n", "| 6 | 5.4 | 3.9 | 1.7 | 0.4 | setosa | -0.4433333 | -1.165809 | 150 |\n", "\n" ], "text/plain": [ " Sepal.Length Sepal.Width Petal.Length Petal.Width Species centered_SepLen\n", "1 5.1 3.5 1.4 0.2 setosa -0.7433333 \n", "2 4.9 3.0 1.4 0.2 setosa -0.9433333 \n", "3 4.7 3.2 1.3 0.2 setosa -1.1433333 \n", "4 4.6 3.1 1.5 0.2 setosa -1.2433333 \n", "5 5.0 3.6 1.4 0.2 setosa -0.8433333 \n", "6 5.4 3.9 1.7 0.4 setosa -0.4433333 \n", " PetLen_zscores n_flowers\n", "1 -1.335752 150 \n", "2 -1.335752 150 \n", "3 -1.392399 150 \n", "4 -1.279104 150 \n", "5 -1.335752 150 \n", "6 -1.165809 150 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "dat <- dat %>% \n", " mutate(centered_SepLen = Sepal.Length - mean(Sepal.Length), # center Sepal Lengths\n", " PetLen_zscores = (Petal.Length - mean(Petal.Length))/sd(Petal.Length), # zscore the Petal Lengths\n", " n_flowers = length(Species)) # calculate the total number of flowers\n", "head(dat)" ] }, { "cell_type": "markdown", "metadata": { "id": "KeGAInjb0ZAV" }, "source": [ "As you see, you can create multiple variables at the same time within a single `mutate` command, by separating them with commas. It's best practice to start each new variable on a new line to maintain readability." ] }, { "cell_type": "markdown", "metadata": { "id": "qHYA9eW30ZAV" }, "source": [ "## `summarise()`: Summarize variables" ] }, { "cell_type": "markdown", "metadata": { "id": "_eO-11nr0ZAV" }, "source": [ "`Mutate()` creates new variables within the existing dataset and does not change the number of rows. You might also want to calculate statistics that summarize the whole data set. In the example above I calculated how many flowers were measured total (`n_flowers`) - but it doesn't really make sense to output this as a variable with entries for every observation. If you want to create a new data.frame in which you store the summary values for one or more variables, you can use the `summarise()` command. \n", "\n", "Let's get summaries for a few of the existing variables:" ] }, { "cell_type": "code", "execution_count": 149, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 100 }, "executionInfo": { "elapsed": 2421, "status": "ok", "timestamp": 1611095670273, "user": { "displayName": "Patience Stevens", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gi-_9ZqhIFhAv1oMehJNvNuIKSTyrFQHzjxQKhx=s64", "userId": "01994571539255174942" }, "user_tz": 300 }, "id": "n02qoPTD0ZAV", "outputId": "1972d1e1-bd88-46a1-8063-0cc7325ad6f2" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\n", "
A data.frame: 1 × 6
n_flowersshortSepal_propsetosa_propSepLen_meanSepLen_sdSepLen_se
<int><dbl><dbl><dbl><dbl><dbl>
1500.53333330.33333335.8433330.82806610.06761132
\n" ], "text/latex": [ "A data.frame: 1 × 6\n", "\\begin{tabular}{llllll}\n", " n\\_flowers & shortSepal\\_prop & setosa\\_prop & SepLen\\_mean & SepLen\\_sd & SepLen\\_se\\\\\n", " & & & & & \\\\\n", "\\hline\n", "\t 150 & 0.5333333 & 0.3333333 & 5.843333 & 0.8280661 & 0.06761132\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "A data.frame: 1 × 6\n", "\n", "| n_flowers <int> | shortSepal_prop <dbl> | setosa_prop <dbl> | SepLen_mean <dbl> | SepLen_sd <dbl> | SepLen_se <dbl> |\n", "|---|---|---|---|---|---|\n", "| 150 | 0.5333333 | 0.3333333 | 5.843333 | 0.8280661 | 0.06761132 |\n", "\n" ], "text/plain": [ " n_flowers shortSepal_prop setosa_prop SepLen_mean SepLen_sd SepLen_se \n", "1 150 0.5333333 0.3333333 5.843333 0.8280661 0.06761132" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "smry <- dat %>% #creating new smry object\n", " summarise(n_flowers = length(Species), #how many observations (flowers) are there total? \n", " shortSepal_prop = mean(centered_SepLen < 0), #what prop. have smaller-than-average sepal length?\n", " setosa_prop = mean(Species == 'setosa'), #what prop. of measured flowers are species Setosa?\n", " SepLen_mean = mean(Sepal.Length), #mean sepal length\n", " SepLen_sd = sd(Sepal.Length), #standard deviation of sepal length\n", " SepLen_se = SepLen_sd / sqrt(n_flowers)\n", " )\n", "smry" ] }, { "cell_type": "markdown", "metadata": { "id": "SYCurmYK0ZAW" }, "source": [ "Notice that when you get to a new row, you can refer to a variable you have already created on a previous row. (The same is true in `mutate`.) For example, when we calculate the standard error for `Sepal.Length`, we have put `SepLen_se = SepLen_sd / sqrt(n_flowers)`, in which SepLen_sd and n_flowers do not exist in the original data.frame, but are variables that we created on previous rows. We could have written it directly as `SepLen_se = sd(Sepal.Length) / sqrt(length(Species))`, but doing it in the above way is more efficient and readable." ] }, { "cell_type": "markdown", "metadata": { "id": "UHrvl9A10ZAW" }, "source": [ "## `filter()`: Filter rows based on a condition" ] }, { "cell_type": "markdown", "metadata": { "id": "64Fl2ALU0ZAX" }, "source": [ "Here are three scenarios:\n", "* you find that there was an error with data collection for one species of flower (e.g. setosa) and you want to remove it from the data.frame\n", "* you find out that some flowers have a negative `Sepal.Length` value, which is an error, and you want to remove them\n", "* you want to separate the data for the remaining two species into separate datasets\n", "\n", "You can do all of these things with the **`filter`** command, which uses a logical argument to identify subsets of rows (observations). Rows for which the logical is TRUE will be retained in the data frame, and all others will be removed:" ] }, { "cell_type": "code", "execution_count": 150, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 605 }, "executionInfo": { "elapsed": 2407, "status": "ok", "timestamp": 1611095670275, "user": { "displayName": "Patience Stevens", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gi-_9ZqhIFhAv1oMehJNvNuIKSTyrFQHzjxQKhx=s64", "userId": "01994571539255174942" }, "user_tz": 300 }, "id": "OzlTsEOE0ZAX", "outputId": "fc088bc2-f2af-41cc-cb64-287321e215c8", "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1] \"species options: setosa, versicolor, virginica\"\n" ] }, { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
A data.frame: 6 × 8
Sepal.LengthSepal.WidthPetal.LengthPetal.WidthSpeciescentered_SepLenPetLen_zscoresn_flowers
<dbl><dbl><dbl><dbl><fct><dbl><dbl><int>
17.03.24.71.4versicolor 1.15666670.5336209150
26.43.24.51.5versicolor 0.55666670.4203256150
36.93.14.91.5versicolor 1.05666670.6469162150
45.52.34.01.3versicolor-0.34333330.1370873150
56.52.84.61.5versicolor 0.65666670.4769732150
65.72.84.51.3versicolor-0.14333330.4203256150
\n" ], "text/latex": [ "A data.frame: 6 × 8\n", "\\begin{tabular}{r|llllllll}\n", " & Sepal.Length & Sepal.Width & Petal.Length & Petal.Width & Species & centered\\_SepLen & PetLen\\_zscores & n\\_flowers\\\\\n", " & & & & & & & & \\\\\n", "\\hline\n", "\t1 & 7.0 & 3.2 & 4.7 & 1.4 & versicolor & 1.1566667 & 0.5336209 & 150\\\\\n", "\t2 & 6.4 & 3.2 & 4.5 & 1.5 & versicolor & 0.5566667 & 0.4203256 & 150\\\\\n", "\t3 & 6.9 & 3.1 & 4.9 & 1.5 & versicolor & 1.0566667 & 0.6469162 & 150\\\\\n", "\t4 & 5.5 & 2.3 & 4.0 & 1.3 & versicolor & -0.3433333 & 0.1370873 & 150\\\\\n", "\t5 & 6.5 & 2.8 & 4.6 & 1.5 & versicolor & 0.6566667 & 0.4769732 & 150\\\\\n", "\t6 & 5.7 & 2.8 & 4.5 & 1.3 & versicolor & -0.1433333 & 0.4203256 & 150\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "A data.frame: 6 × 8\n", "\n", "| | Sepal.Length <dbl> | Sepal.Width <dbl> | Petal.Length <dbl> | Petal.Width <dbl> | Species <fct> | centered_SepLen <dbl> | PetLen_zscores <dbl> | n_flowers <int> |\n", "|---|---|---|---|---|---|---|---|---|\n", "| 1 | 7.0 | 3.2 | 4.7 | 1.4 | versicolor | 1.1566667 | 0.5336209 | 150 |\n", "| 2 | 6.4 | 3.2 | 4.5 | 1.5 | versicolor | 0.5566667 | 0.4203256 | 150 |\n", "| 3 | 6.9 | 3.1 | 4.9 | 1.5 | versicolor | 1.0566667 | 0.6469162 | 150 |\n", "| 4 | 5.5 | 2.3 | 4.0 | 1.3 | versicolor | -0.3433333 | 0.1370873 | 150 |\n", "| 5 | 6.5 | 2.8 | 4.6 | 1.5 | versicolor | 0.6566667 | 0.4769732 | 150 |\n", "| 6 | 5.7 | 2.8 | 4.5 | 1.3 | versicolor | -0.1433333 | 0.4203256 | 150 |\n", "\n" ], "text/plain": [ " Sepal.Length Sepal.Width Petal.Length Petal.Width Species centered_SepLen\n", "1 7.0 3.2 4.7 1.4 versicolor 1.1566667 \n", "2 6.4 3.2 4.5 1.5 versicolor 0.5566667 \n", "3 6.9 3.1 4.9 1.5 versicolor 1.0566667 \n", "4 5.5 2.3 4.0 1.3 versicolor -0.3433333 \n", "5 6.5 2.8 4.6 1.5 versicolor 0.6566667 \n", "6 5.7 2.8 4.5 1.3 versicolor -0.1433333 \n", " PetLen_zscores n_flowers\n", "1 0.5336209 150 \n", "2 0.4203256 150 \n", "3 0.6469162 150 \n", "4 0.1370873 150 \n", "5 0.4769732 150 \n", "6 0.4203256 150 " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
A data.frame: 6 × 8
Sepal.LengthSepal.WidthPetal.LengthPetal.WidthSpeciescentered_SepLenPetLen_zscoresn_flowers
<dbl><dbl><dbl><dbl><fct><dbl><dbl><int>
17.03.24.71.4versicolor 1.15666670.5336209150
26.43.24.51.5versicolor 0.55666670.4203256150
36.93.14.91.5versicolor 1.05666670.6469162150
45.52.34.01.3versicolor-0.34333330.1370873150
56.52.84.61.5versicolor 0.65666670.4769732150
65.72.84.51.3versicolor-0.14333330.4203256150
\n" ], "text/latex": [ "A data.frame: 6 × 8\n", "\\begin{tabular}{r|llllllll}\n", " & Sepal.Length & Sepal.Width & Petal.Length & Petal.Width & Species & centered\\_SepLen & PetLen\\_zscores & n\\_flowers\\\\\n", " & & & & & & & & \\\\\n", "\\hline\n", "\t1 & 7.0 & 3.2 & 4.7 & 1.4 & versicolor & 1.1566667 & 0.5336209 & 150\\\\\n", "\t2 & 6.4 & 3.2 & 4.5 & 1.5 & versicolor & 0.5566667 & 0.4203256 & 150\\\\\n", "\t3 & 6.9 & 3.1 & 4.9 & 1.5 & versicolor & 1.0566667 & 0.6469162 & 150\\\\\n", "\t4 & 5.5 & 2.3 & 4.0 & 1.3 & versicolor & -0.3433333 & 0.1370873 & 150\\\\\n", "\t5 & 6.5 & 2.8 & 4.6 & 1.5 & versicolor & 0.6566667 & 0.4769732 & 150\\\\\n", "\t6 & 5.7 & 2.8 & 4.5 & 1.3 & versicolor & -0.1433333 & 0.4203256 & 150\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "A data.frame: 6 × 8\n", "\n", "| | Sepal.Length <dbl> | Sepal.Width <dbl> | Petal.Length <dbl> | Petal.Width <dbl> | Species <fct> | centered_SepLen <dbl> | PetLen_zscores <dbl> | n_flowers <int> |\n", "|---|---|---|---|---|---|---|---|---|\n", "| 1 | 7.0 | 3.2 | 4.7 | 1.4 | versicolor | 1.1566667 | 0.5336209 | 150 |\n", "| 2 | 6.4 | 3.2 | 4.5 | 1.5 | versicolor | 0.5566667 | 0.4203256 | 150 |\n", "| 3 | 6.9 | 3.1 | 4.9 | 1.5 | versicolor | 1.0566667 | 0.6469162 | 150 |\n", "| 4 | 5.5 | 2.3 | 4.0 | 1.3 | versicolor | -0.3433333 | 0.1370873 | 150 |\n", "| 5 | 6.5 | 2.8 | 4.6 | 1.5 | versicolor | 0.6566667 | 0.4769732 | 150 |\n", "| 6 | 5.7 | 2.8 | 4.5 | 1.3 | versicolor | -0.1433333 | 0.4203256 | 150 |\n", "\n" ], "text/plain": [ " Sepal.Length Sepal.Width Petal.Length Petal.Width Species centered_SepLen\n", "1 7.0 3.2 4.7 1.4 versicolor 1.1566667 \n", "2 6.4 3.2 4.5 1.5 versicolor 0.5566667 \n", "3 6.9 3.1 4.9 1.5 versicolor 1.0566667 \n", "4 5.5 2.3 4.0 1.3 versicolor -0.3433333 \n", "5 6.5 2.8 4.6 1.5 versicolor 0.6566667 \n", "6 5.7 2.8 4.5 1.3 versicolor -0.1433333 \n", " PetLen_zscores n_flowers\n", "1 0.5336209 150 \n", "2 0.4203256 150 \n", "3 0.6469162 150 \n", "4 0.1370873 150 \n", "5 0.4769732 150 \n", "6 0.4203256 150 " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
A data.frame: 6 × 8
Sepal.LengthSepal.WidthPetal.LengthPetal.WidthSpeciescentered_SepLenPetLen_zscoresn_flowers
<dbl><dbl><dbl><dbl><fct><dbl><dbl><int>
16.33.36.02.5virginica 0.456666671.2700404150
25.82.75.11.9virginica-0.043333330.7602115150
37.13.05.92.1virginica 1.256666671.2133927150
46.32.95.61.8virginica 0.456666671.0434497150
56.53.05.82.2virginica 0.656666671.1567451150
67.63.06.62.1virginica 1.756666671.6099263150
\n" ], "text/latex": [ "A data.frame: 6 × 8\n", "\\begin{tabular}{r|llllllll}\n", " & Sepal.Length & Sepal.Width & Petal.Length & Petal.Width & Species & centered\\_SepLen & PetLen\\_zscores & n\\_flowers\\\\\n", " & & & & & & & & \\\\\n", "\\hline\n", "\t1 & 6.3 & 3.3 & 6.0 & 2.5 & virginica & 0.45666667 & 1.2700404 & 150\\\\\n", "\t2 & 5.8 & 2.7 & 5.1 & 1.9 & virginica & -0.04333333 & 0.7602115 & 150\\\\\n", "\t3 & 7.1 & 3.0 & 5.9 & 2.1 & virginica & 1.25666667 & 1.2133927 & 150\\\\\n", "\t4 & 6.3 & 2.9 & 5.6 & 1.8 & virginica & 0.45666667 & 1.0434497 & 150\\\\\n", "\t5 & 6.5 & 3.0 & 5.8 & 2.2 & virginica & 0.65666667 & 1.1567451 & 150\\\\\n", "\t6 & 7.6 & 3.0 & 6.6 & 2.1 & virginica & 1.75666667 & 1.6099263 & 150\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "A data.frame: 6 × 8\n", "\n", "| | Sepal.Length <dbl> | Sepal.Width <dbl> | Petal.Length <dbl> | Petal.Width <dbl> | Species <fct> | centered_SepLen <dbl> | PetLen_zscores <dbl> | n_flowers <int> |\n", "|---|---|---|---|---|---|---|---|---|\n", "| 1 | 6.3 | 3.3 | 6.0 | 2.5 | virginica | 0.45666667 | 1.2700404 | 150 |\n", "| 2 | 5.8 | 2.7 | 5.1 | 1.9 | virginica | -0.04333333 | 0.7602115 | 150 |\n", "| 3 | 7.1 | 3.0 | 5.9 | 2.1 | virginica | 1.25666667 | 1.2133927 | 150 |\n", "| 4 | 6.3 | 2.9 | 5.6 | 1.8 | virginica | 0.45666667 | 1.0434497 | 150 |\n", "| 5 | 6.5 | 3.0 | 5.8 | 2.2 | virginica | 0.65666667 | 1.1567451 | 150 |\n", "| 6 | 7.6 | 3.0 | 6.6 | 2.1 | virginica | 1.75666667 | 1.6099263 | 150 |\n", "\n" ], "text/plain": [ " Sepal.Length Sepal.Width Petal.Length Petal.Width Species centered_SepLen\n", "1 6.3 3.3 6.0 2.5 virginica 0.45666667 \n", "2 5.8 2.7 5.1 1.9 virginica -0.04333333 \n", "3 7.1 3.0 5.9 2.1 virginica 1.25666667 \n", "4 6.3 2.9 5.6 1.8 virginica 0.45666667 \n", "5 6.5 3.0 5.8 2.2 virginica 0.65666667 \n", "6 7.6 3.0 6.6 2.1 virginica 1.75666667 \n", " PetLen_zscores n_flowers\n", "1 1.2700404 150 \n", "2 0.7602115 150 \n", "3 1.2133927 150 \n", "4 1.0434497 150 \n", "5 1.1567451 150 \n", "6 1.6099263 150 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "print(paste('species options:',paste(levels(dat$Species),collapse=\", \")))\n", "\n", "# get rid of all setosa flowers and any flowers with negative sepal lengths\n", "cleaned_dat <- dat %>% \n", " filter(Species != 'setosa', #!= is read \"not equal to\"\n", " Sepal.Length >= 0)\n", "\n", "# make new data.frames for the remaining two species\n", "versi.dat <- filter(cleaned_dat, Species == 'versicolor')\n", "virgi.dat <- filter(cleaned_dat, Species == 'virginica')\n", "\n", "# look at first six rows of all three data.frames\n", "head(cleaned_dat); head(versi.dat); head(virgi.dat)" ] }, { "cell_type": "markdown", "metadata": { "id": "BWZJWEG00ZAX" }, "source": [ "Here's where the pipe becomes useful. Let's say you want to calculate the summaries we described above separately for the versicolor and virginica species. I will show you later how to do it more efficiently, but for the moment we can illustrate how you can chain commands with pipes. Rather than creating the intermediate `versi.dat` and `virgi.dat` dataframes, we can chain the `summarise` function after the `filter` function. In the example below, we pass `dat` as the first argument of `filter`, then specify to keep only versicolor flowers, and then the resulting data.frame is passed on as the first argument to `summarise`:" ] }, { "cell_type": "code", "execution_count": 151, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 184 }, "executionInfo": { "elapsed": 2393, "status": "ok", "timestamp": 1611095670277, "user": { "displayName": "Patience Stevens", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gi-_9ZqhIFhAv1oMehJNvNuIKSTyrFQHzjxQKhx=s64", "userId": "01994571539255174942" }, "user_tz": 300 }, "id": "j0O40e7G0ZAX", "outputId": "664550ec-c2ee-4d0d-d9e3-db5137204fb8" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\n", "
A data.frame: 1 × 2
SepLen_meanSepLen_sd
<dbl><dbl>
5.9360.5161711
\n" ], "text/latex": [ "A data.frame: 1 × 2\n", "\\begin{tabular}{ll}\n", " SepLen\\_mean & SepLen\\_sd\\\\\n", " & \\\\\n", "\\hline\n", "\t 5.936 & 0.5161711\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "A data.frame: 1 × 2\n", "\n", "| SepLen_mean <dbl> | SepLen_sd <dbl> |\n", "|---|---|\n", "| 5.936 | 0.5161711 |\n", "\n" ], "text/plain": [ " SepLen_mean SepLen_sd\n", "1 5.936 0.5161711" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\n", "
A data.frame: 1 × 2
SepLen_meanSepLen_sd
<dbl><dbl>
6.5880.6358796
\n" ], "text/latex": [ "A data.frame: 1 × 2\n", "\\begin{tabular}{ll}\n", " SepLen\\_mean & SepLen\\_sd\\\\\n", " & \\\\\n", "\\hline\n", "\t 6.588 & 0.6358796\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "A data.frame: 1 × 2\n", "\n", "| SepLen_mean <dbl> | SepLen_sd <dbl> |\n", "|---|---|\n", "| 6.588 | 0.6358796 |\n", "\n" ], "text/plain": [ " SepLen_mean SepLen_sd\n", "1 6.588 0.6358796" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# calculate summarise for versicolor species\n", "dat %>% \n", " filter(Species == 'versicolor') %>% \n", " summarise(SepLen_mean = mean(Sepal.Length),\n", " SepLen_sd = sd(Sepal.Length))\n", "\n", "# calculate summarise for virginica species\n", "dat %>% \n", " filter(Species == 'virginica') %>% \n", " summarise(SepLen_mean = mean(Sepal.Length),\n", " SepLen_sd = sd(Sepal.Length))" ] }, { "cell_type": "markdown", "metadata": { "id": "iXCX5F7r0ZAY" }, "source": [ "**_TIP_**: it is very easy to remove missing values by using the `!is.na(variable)` command. E.g. if some flowers are missing petal length measurements, you can exclude them by doing **`filter(dat, !is.na(Petal.Length))`**" ] }, { "cell_type": "markdown", "metadata": { "id": "QOP2juim0ZAY" }, "source": [ "## `select()`: Select columns to keep/remove" ] }, { "cell_type": "markdown", "metadata": { "id": "3hSuLskc0ZAY" }, "source": [ "Often the dataset contains many irrelevant columns that make it difficult to display the dataframe all at once. You can easily choose which columns to keep or remove in a data.frame with the **`select()`** command. It has complex usage, and I suggest checking the help, i.e. type `?select`. However, the basic usage is as follows: " ] }, { "cell_type": "code", "execution_count": 153, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 207 }, "executionInfo": { "elapsed": 2378, "status": "ok", "timestamp": 1611095670278, "user": { "displayName": "Patience Stevens", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gi-_9ZqhIFhAv1oMehJNvNuIKSTyrFQHzjxQKhx=s64", "userId": "01994571539255174942" }, "user_tz": 300 }, "id": "6HO_umTi0ZAY", "outputId": "b7906442-4aa0-4648-f8fe-ab703e465bd7" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
A data.frame: 6 × 3
SpeciesPetal.LengthPetal.Width
<fct><dbl><dbl>
1setosa1.40.2
2setosa1.40.2
3setosa1.30.2
4setosa1.50.2
5setosa1.40.2
6setosa1.70.4
\n" ], "text/latex": [ "A data.frame: 6 × 3\n", "\\begin{tabular}{r|lll}\n", " & Species & Petal.Length & Petal.Width\\\\\n", " & & & \\\\\n", "\\hline\n", "\t1 & setosa & 1.4 & 0.2\\\\\n", "\t2 & setosa & 1.4 & 0.2\\\\\n", "\t3 & setosa & 1.3 & 0.2\\\\\n", "\t4 & setosa & 1.5 & 0.2\\\\\n", "\t5 & setosa & 1.4 & 0.2\\\\\n", "\t6 & setosa & 1.7 & 0.4\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "A data.frame: 6 × 3\n", "\n", "| | Species <fct> | Petal.Length <dbl> | Petal.Width <dbl> |\n", "|---|---|---|---|\n", "| 1 | setosa | 1.4 | 0.2 |\n", "| 2 | setosa | 1.4 | 0.2 |\n", "| 3 | setosa | 1.3 | 0.2 |\n", "| 4 | setosa | 1.5 | 0.2 |\n", "| 5 | setosa | 1.4 | 0.2 |\n", "| 6 | setosa | 1.7 | 0.4 |\n", "\n" ], "text/plain": [ " Species Petal.Length Petal.Width\n", "1 setosa 1.4 0.2 \n", "2 setosa 1.4 0.2 \n", "3 setosa 1.3 0.2 \n", "4 setosa 1.5 0.2 \n", "5 setosa 1.4 0.2 \n", "6 setosa 1.7 0.4 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "dat %>% \n", " select(Species, Petal.Length, Petal.Width) %>%\n", " head() " ] }, { "cell_type": "markdown", "metadata": { "id": "WZLNn4id0ZAY" }, "source": [ "If you want to **remove** only specific variables, list each with a **-** sign:" ] }, { "cell_type": "code", "execution_count": 154, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 207 }, "executionInfo": { "elapsed": 2633, "status": "ok", "timestamp": 1611095670548, "user": { "displayName": "Patience Stevens", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gi-_9ZqhIFhAv1oMehJNvNuIKSTyrFQHzjxQKhx=s64", "userId": "01994571539255174942" }, "user_tz": 300 }, "id": "uPkomyI90ZAY", "outputId": "6ab1967f-d88d-4dae-9e23-d8c46c7b62e3" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
A data.frame: 6 × 6
Sepal.LengthSepal.WidthSpeciescentered_SepLenPetLen_zscoresn_flowers
<dbl><dbl><fct><dbl><dbl><int>
15.13.5setosa-0.7433333-1.335752150
24.93.0setosa-0.9433333-1.335752150
34.73.2setosa-1.1433333-1.392399150
44.63.1setosa-1.2433333-1.279104150
55.03.6setosa-0.8433333-1.335752150
65.43.9setosa-0.4433333-1.165809150
\n" ], "text/latex": [ "A data.frame: 6 × 6\n", "\\begin{tabular}{r|llllll}\n", " & Sepal.Length & Sepal.Width & Species & centered\\_SepLen & PetLen\\_zscores & n\\_flowers\\\\\n", " & & & & & & \\\\\n", "\\hline\n", "\t1 & 5.1 & 3.5 & setosa & -0.7433333 & -1.335752 & 150\\\\\n", "\t2 & 4.9 & 3.0 & setosa & -0.9433333 & -1.335752 & 150\\\\\n", "\t3 & 4.7 & 3.2 & setosa & -1.1433333 & -1.392399 & 150\\\\\n", "\t4 & 4.6 & 3.1 & setosa & -1.2433333 & -1.279104 & 150\\\\\n", "\t5 & 5.0 & 3.6 & setosa & -0.8433333 & -1.335752 & 150\\\\\n", "\t6 & 5.4 & 3.9 & setosa & -0.4433333 & -1.165809 & 150\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "A data.frame: 6 × 6\n", "\n", "| | Sepal.Length <dbl> | Sepal.Width <dbl> | Species <fct> | centered_SepLen <dbl> | PetLen_zscores <dbl> | n_flowers <int> |\n", "|---|---|---|---|---|---|---|\n", "| 1 | 5.1 | 3.5 | setosa | -0.7433333 | -1.335752 | 150 |\n", "| 2 | 4.9 | 3.0 | setosa | -0.9433333 | -1.335752 | 150 |\n", "| 3 | 4.7 | 3.2 | setosa | -1.1433333 | -1.392399 | 150 |\n", "| 4 | 4.6 | 3.1 | setosa | -1.2433333 | -1.279104 | 150 |\n", "| 5 | 5.0 | 3.6 | setosa | -0.8433333 | -1.335752 | 150 |\n", "| 6 | 5.4 | 3.9 | setosa | -0.4433333 | -1.165809 | 150 |\n", "\n" ], "text/plain": [ " Sepal.Length Sepal.Width Species centered_SepLen PetLen_zscores n_flowers\n", "1 5.1 3.5 setosa -0.7433333 -1.335752 150 \n", "2 4.9 3.0 setosa -0.9433333 -1.335752 150 \n", "3 4.7 3.2 setosa -1.1433333 -1.392399 150 \n", "4 4.6 3.1 setosa -1.2433333 -1.279104 150 \n", "5 5.0 3.6 setosa -0.8433333 -1.335752 150 \n", "6 5.4 3.9 setosa -0.4433333 -1.165809 150 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#remove original petal length & width variables\n", "dat %>% \n", " select(-Petal.Length, -Petal.Width) %>%\n", " head() " ] }, { "cell_type": "markdown", "metadata": { "id": "wYwrBSmT0ZAY" }, "source": [ "If you want to keep a sequence of variables, you can specify the first and the last using a range. Note that this will be an inclusive range, so the first and last variables will be included in your selection:" ] }, { "cell_type": "code", "execution_count": 155, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 398 }, "executionInfo": { "elapsed": 2619, "status": "ok", "timestamp": 1611095670549, "user": { "displayName": "Patience Stevens", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gi-_9ZqhIFhAv1oMehJNvNuIKSTyrFQHzjxQKhx=s64", "userId": "01994571539255174942" }, "user_tz": 300 }, "id": "-qC7uW7q0ZAZ", "outputId": "f0c5e7dd-c17b-4bea-f4e6-162da4605190" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
A data.frame: 6 × 8
Sepal.LengthSepal.WidthPetal.LengthPetal.WidthSpeciescentered_SepLenPetLen_zscoresn_flowers
<dbl><dbl><dbl><dbl><fct><dbl><dbl><int>
15.13.51.40.2setosa-0.7433333-1.335752150
24.93.01.40.2setosa-0.9433333-1.335752150
34.73.21.30.2setosa-1.1433333-1.392399150
44.63.11.50.2setosa-1.2433333-1.279104150
55.03.61.40.2setosa-0.8433333-1.335752150
65.43.91.70.4setosa-0.4433333-1.165809150
\n" ], "text/latex": [ "A data.frame: 6 × 8\n", "\\begin{tabular}{r|llllllll}\n", " & Sepal.Length & Sepal.Width & Petal.Length & Petal.Width & Species & centered\\_SepLen & PetLen\\_zscores & n\\_flowers\\\\\n", " & & & & & & & & \\\\\n", "\\hline\n", "\t1 & 5.1 & 3.5 & 1.4 & 0.2 & setosa & -0.7433333 & -1.335752 & 150\\\\\n", "\t2 & 4.9 & 3.0 & 1.4 & 0.2 & setosa & -0.9433333 & -1.335752 & 150\\\\\n", "\t3 & 4.7 & 3.2 & 1.3 & 0.2 & setosa & -1.1433333 & -1.392399 & 150\\\\\n", "\t4 & 4.6 & 3.1 & 1.5 & 0.2 & setosa & -1.2433333 & -1.279104 & 150\\\\\n", "\t5 & 5.0 & 3.6 & 1.4 & 0.2 & setosa & -0.8433333 & -1.335752 & 150\\\\\n", "\t6 & 5.4 & 3.9 & 1.7 & 0.4 & setosa & -0.4433333 & -1.165809 & 150\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "A data.frame: 6 × 8\n", "\n", "| | Sepal.Length <dbl> | Sepal.Width <dbl> | Petal.Length <dbl> | Petal.Width <dbl> | Species <fct> | centered_SepLen <dbl> | PetLen_zscores <dbl> | n_flowers <int> |\n", "|---|---|---|---|---|---|---|---|---|\n", "| 1 | 5.1 | 3.5 | 1.4 | 0.2 | setosa | -0.7433333 | -1.335752 | 150 |\n", "| 2 | 4.9 | 3.0 | 1.4 | 0.2 | setosa | -0.9433333 | -1.335752 | 150 |\n", "| 3 | 4.7 | 3.2 | 1.3 | 0.2 | setosa | -1.1433333 | -1.392399 | 150 |\n", "| 4 | 4.6 | 3.1 | 1.5 | 0.2 | setosa | -1.2433333 | -1.279104 | 150 |\n", "| 5 | 5.0 | 3.6 | 1.4 | 0.2 | setosa | -0.8433333 | -1.335752 | 150 |\n", "| 6 | 5.4 | 3.9 | 1.7 | 0.4 | setosa | -0.4433333 | -1.165809 | 150 |\n", "\n" ], "text/plain": [ " Sepal.Length Sepal.Width Petal.Length Petal.Width Species centered_SepLen\n", "1 5.1 3.5 1.4 0.2 setosa -0.7433333 \n", "2 4.9 3.0 1.4 0.2 setosa -0.9433333 \n", "3 4.7 3.2 1.3 0.2 setosa -1.1433333 \n", "4 4.6 3.1 1.5 0.2 setosa -1.2433333 \n", "5 5.0 3.6 1.4 0.2 setosa -0.8433333 \n", "6 5.4 3.9 1.7 0.4 setosa -0.4433333 \n", " PetLen_zscores n_flowers\n", "1 -1.335752 150 \n", "2 -1.335752 150 \n", "3 -1.392399 150 \n", "4 -1.279104 150 \n", "5 -1.335752 150 \n", "6 -1.165809 150 " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
A data.frame: 6 × 5
Sepal.LengthSepal.WidthPetal.LengthPetal.WidthSpecies
<dbl><dbl><dbl><dbl><fct>
15.13.51.40.2setosa
24.93.01.40.2setosa
34.73.21.30.2setosa
44.63.11.50.2setosa
55.03.61.40.2setosa
65.43.91.70.4setosa
\n" ], "text/latex": [ "A data.frame: 6 × 5\n", "\\begin{tabular}{r|lllll}\n", " & Sepal.Length & Sepal.Width & Petal.Length & Petal.Width & Species\\\\\n", " & & & & & \\\\\n", "\\hline\n", "\t1 & 5.1 & 3.5 & 1.4 & 0.2 & setosa\\\\\n", "\t2 & 4.9 & 3.0 & 1.4 & 0.2 & setosa\\\\\n", "\t3 & 4.7 & 3.2 & 1.3 & 0.2 & setosa\\\\\n", "\t4 & 4.6 & 3.1 & 1.5 & 0.2 & setosa\\\\\n", "\t5 & 5.0 & 3.6 & 1.4 & 0.2 & setosa\\\\\n", "\t6 & 5.4 & 3.9 & 1.7 & 0.4 & setosa\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "A data.frame: 6 × 5\n", "\n", "| | Sepal.Length <dbl> | Sepal.Width <dbl> | Petal.Length <dbl> | Petal.Width <dbl> | Species <fct> |\n", "|---|---|---|---|---|---|\n", "| 1 | 5.1 | 3.5 | 1.4 | 0.2 | setosa |\n", "| 2 | 4.9 | 3.0 | 1.4 | 0.2 | setosa |\n", "| 3 | 4.7 | 3.2 | 1.3 | 0.2 | setosa |\n", "| 4 | 4.6 | 3.1 | 1.5 | 0.2 | setosa |\n", "| 5 | 5.0 | 3.6 | 1.4 | 0.2 | setosa |\n", "| 6 | 5.4 | 3.9 | 1.7 | 0.4 | setosa |\n", "\n" ], "text/plain": [ " Sepal.Length Sepal.Width Petal.Length Petal.Width Species\n", "1 5.1 3.5 1.4 0.2 setosa \n", "2 4.9 3.0 1.4 0.2 setosa \n", "3 4.7 3.2 1.3 0.2 setosa \n", "4 4.6 3.1 1.5 0.2 setosa \n", "5 5.0 3.6 1.4 0.2 setosa \n", "6 5.4 3.9 1.7 0.4 setosa " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# look at full data set to see order\n", "head(dat)\n", "\n", "# look at just a certain range of variables\n", "dat %>% \n", " select(Sepal.Length:Species) %>%\n", " head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The tidyverse also has something called **tidy selection** which makes it easy to \"batch\" select based on patterns in variable names. For example, we can use `starts_with()` to select all columns starting with \"Petal\":" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
A data.frame: 6 × 2
Petal.LengthPetal.Width
<dbl><dbl>
11.40.2
21.40.2
31.30.2
41.50.2
51.40.2
61.70.4
\n" ], "text/latex": [ "A data.frame: 6 × 2\n", "\\begin{tabular}{r|ll}\n", " & Petal.Length & Petal.Width\\\\\n", " & & \\\\\n", "\\hline\n", "\t1 & 1.4 & 0.2\\\\\n", "\t2 & 1.4 & 0.2\\\\\n", "\t3 & 1.3 & 0.2\\\\\n", "\t4 & 1.5 & 0.2\\\\\n", "\t5 & 1.4 & 0.2\\\\\n", "\t6 & 1.7 & 0.4\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "A data.frame: 6 × 2\n", "\n", "| | Petal.Length <dbl> | Petal.Width <dbl> |\n", "|---|---|---|\n", "| 1 | 1.4 | 0.2 |\n", "| 2 | 1.4 | 0.2 |\n", "| 3 | 1.3 | 0.2 |\n", "| 4 | 1.5 | 0.2 |\n", "| 5 | 1.4 | 0.2 |\n", "| 6 | 1.7 | 0.4 |\n", "\n" ], "text/plain": [ " Petal.Length Petal.Width\n", "1 1.4 0.2 \n", "2 1.4 0.2 \n", "3 1.3 0.2 \n", "4 1.5 0.2 \n", "5 1.4 0.2 \n", "6 1.7 0.4 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "dat %>% \n", " select(starts_with(\"Petal\")) %>% \n", " head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Other selection helpers include `ends_with()`, `contains()`, `matches()` and `num_range()`. Learn more with `?tidyselect::ends_with()`." ] }, { "cell_type": "markdown", "metadata": { "id": "IH9yxLQB0ZAZ" }, "source": [ "## `arrange()`: Sort by columns" ] }, { "cell_type": "markdown", "metadata": { "id": "5Pztgqld0ZAZ" }, "source": [ "If you want to sort your data.frame by one or more columns you can use the `arrange()` command, where you list the variables in the order in which you want the sorting to occur. The default is to sort by ascending order for each variable. If you want to sort by descending order for one of them, you can surround the variable in the `desc()` command. Let's sort the flowers by species, and then within each species, by descending petal length:" ] }, { "cell_type": "code", "execution_count": 156, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 207 }, "executionInfo": { "elapsed": 2605, "status": "ok", "timestamp": 1611095670551, "user": { "displayName": "Patience Stevens", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gi-_9ZqhIFhAv1oMehJNvNuIKSTyrFQHzjxQKhx=s64", "userId": "01994571539255174942" }, "user_tz": 300 }, "id": "ju148EdW0ZAZ", "outputId": "f382bf99-4cb8-443a-f5f4-84c9ff47bd00" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
A data.frame: 6 × 8
Sepal.LengthSepal.WidthPetal.LengthPetal.WidthSpeciescentered_SepLenPetLen_zscoresn_flowers
<dbl><dbl><dbl><dbl><fct><dbl><dbl><int>
14.83.41.90.2setosa-1.0433333-1.052513150
25.13.81.90.4setosa-0.7433333-1.052513150
35.43.91.70.4setosa-0.4433333-1.165809150
45.73.81.70.3setosa-0.1433333-1.165809150
55.43.41.70.2setosa-0.4433333-1.165809150
65.13.31.70.5setosa-0.7433333-1.165809150
\n" ], "text/latex": [ "A data.frame: 6 × 8\n", "\\begin{tabular}{r|llllllll}\n", " & Sepal.Length & Sepal.Width & Petal.Length & Petal.Width & Species & centered\\_SepLen & PetLen\\_zscores & n\\_flowers\\\\\n", " & & & & & & & & \\\\\n", "\\hline\n", "\t1 & 4.8 & 3.4 & 1.9 & 0.2 & setosa & -1.0433333 & -1.052513 & 150\\\\\n", "\t2 & 5.1 & 3.8 & 1.9 & 0.4 & setosa & -0.7433333 & -1.052513 & 150\\\\\n", "\t3 & 5.4 & 3.9 & 1.7 & 0.4 & setosa & -0.4433333 & -1.165809 & 150\\\\\n", "\t4 & 5.7 & 3.8 & 1.7 & 0.3 & setosa & -0.1433333 & -1.165809 & 150\\\\\n", "\t5 & 5.4 & 3.4 & 1.7 & 0.2 & setosa & -0.4433333 & -1.165809 & 150\\\\\n", "\t6 & 5.1 & 3.3 & 1.7 & 0.5 & setosa & -0.7433333 & -1.165809 & 150\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "A data.frame: 6 × 8\n", "\n", "| | Sepal.Length <dbl> | Sepal.Width <dbl> | Petal.Length <dbl> | Petal.Width <dbl> | Species <fct> | centered_SepLen <dbl> | PetLen_zscores <dbl> | n_flowers <int> |\n", "|---|---|---|---|---|---|---|---|---|\n", "| 1 | 4.8 | 3.4 | 1.9 | 0.2 | setosa | -1.0433333 | -1.052513 | 150 |\n", "| 2 | 5.1 | 3.8 | 1.9 | 0.4 | setosa | -0.7433333 | -1.052513 | 150 |\n", "| 3 | 5.4 | 3.9 | 1.7 | 0.4 | setosa | -0.4433333 | -1.165809 | 150 |\n", "| 4 | 5.7 | 3.8 | 1.7 | 0.3 | setosa | -0.1433333 | -1.165809 | 150 |\n", "| 5 | 5.4 | 3.4 | 1.7 | 0.2 | setosa | -0.4433333 | -1.165809 | 150 |\n", "| 6 | 5.1 | 3.3 | 1.7 | 0.5 | setosa | -0.7433333 | -1.165809 | 150 |\n", "\n" ], "text/plain": [ " Sepal.Length Sepal.Width Petal.Length Petal.Width Species centered_SepLen\n", "1 4.8 3.4 1.9 0.2 setosa -1.0433333 \n", "2 5.1 3.8 1.9 0.4 setosa -0.7433333 \n", "3 5.4 3.9 1.7 0.4 setosa -0.4433333 \n", "4 5.7 3.8 1.7 0.3 setosa -0.1433333 \n", "5 5.4 3.4 1.7 0.2 setosa -0.4433333 \n", "6 5.1 3.3 1.7 0.5 setosa -0.7433333 \n", " PetLen_zscores n_flowers\n", "1 -1.052513 150 \n", "2 -1.052513 150 \n", "3 -1.165809 150 \n", "4 -1.165809 150 \n", "5 -1.165809 150 \n", "6 -1.165809 150 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "dat %>% \n", " arrange(Species, desc(Petal.Length)) %>%\n", " head()\n", "\n", "#levels(dat$Species)\n", "#dat %>% \n", "# arrange(desc(Species), desc(Petal.Length)) %>%\n", "# head()" ] }, { "cell_type": "markdown", "metadata": { "id": "pRhRKPghWoqn" }, "source": [ "Note: since the `Species` variable is a factor, not a numeric variable, it will be sorted by the order listed by `levels(dat$Species)`. You can test this out by uncommenting the second line in the code cell above - since the flowers are now sorted in the reverse `Species` order, the first six rows shown by `head()` are now virginica, not setosa. " ] }, { "cell_type": "markdown", "metadata": { "id": "za8IdRYR0ZAZ" }, "source": [ "## `unite()`: Combine two columns into one" ] }, { "cell_type": "markdown", "metadata": { "id": "5FmR7HHxYVTV" }, "source": [ "Let's say flowers with short petals are fundamentally different from those with long petals. I'm going to make a new categorical variable, `PetalType`, that can either be \"long\" or \"short\". *To learn more about the `if_else()` function used below, type `?if_else`.*" ] }, { "cell_type": "code", "execution_count": 160, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 627 }, "executionInfo": { "elapsed": 2589, "status": "ok", "timestamp": 1611095670552, "user": { "displayName": "Patience Stevens", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gi-_9ZqhIFhAv1oMehJNvNuIKSTyrFQHzjxQKhx=s64", "userId": "01994571539255174942" }, "user_tz": 300 }, "id": "VP2I_EOIYrm-", "outputId": "3ba25c34-0f8b-4a82-80bc-83a1d314711b" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
A data.frame: 6 × 9
Sepal.LengthSepal.WidthPetal.LengthPetal.WidthSpeciescentered_SepLenPetLen_zscoresn_flowersPetalType
<dbl><dbl><dbl><dbl><fct><dbl><dbl><int><chr>
15.13.51.40.2setosa-0.7433333-1.335752150short
24.93.01.40.2setosa-0.9433333-1.335752150short
34.73.21.30.2setosa-1.1433333-1.392399150short
44.63.11.50.2setosa-1.2433333-1.279104150short
55.03.61.40.2setosa-0.8433333-1.335752150short
65.43.91.70.4setosa-0.4433333-1.165809150short
\n" ], "text/latex": [ "A data.frame: 6 × 9\n", "\\begin{tabular}{r|lllllllll}\n", " & Sepal.Length & Sepal.Width & Petal.Length & Petal.Width & Species & centered\\_SepLen & PetLen\\_zscores & n\\_flowers & PetalType\\\\\n", " & & & & & & & & & \\\\\n", "\\hline\n", "\t1 & 5.1 & 3.5 & 1.4 & 0.2 & setosa & -0.7433333 & -1.335752 & 150 & short\\\\\n", "\t2 & 4.9 & 3.0 & 1.4 & 0.2 & setosa & -0.9433333 & -1.335752 & 150 & short\\\\\n", "\t3 & 4.7 & 3.2 & 1.3 & 0.2 & setosa & -1.1433333 & -1.392399 & 150 & short\\\\\n", "\t4 & 4.6 & 3.1 & 1.5 & 0.2 & setosa & -1.2433333 & -1.279104 & 150 & short\\\\\n", "\t5 & 5.0 & 3.6 & 1.4 & 0.2 & setosa & -0.8433333 & -1.335752 & 150 & short\\\\\n", "\t6 & 5.4 & 3.9 & 1.7 & 0.4 & setosa & -0.4433333 & -1.165809 & 150 & short\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "A data.frame: 6 × 9\n", "\n", "| | Sepal.Length <dbl> | Sepal.Width <dbl> | Petal.Length <dbl> | Petal.Width <dbl> | Species <fct> | centered_SepLen <dbl> | PetLen_zscores <dbl> | n_flowers <int> | PetalType <chr> |\n", "|---|---|---|---|---|---|---|---|---|---|\n", "| 1 | 5.1 | 3.5 | 1.4 | 0.2 | setosa | -0.7433333 | -1.335752 | 150 | short |\n", "| 2 | 4.9 | 3.0 | 1.4 | 0.2 | setosa | -0.9433333 | -1.335752 | 150 | short |\n", "| 3 | 4.7 | 3.2 | 1.3 | 0.2 | setosa | -1.1433333 | -1.392399 | 150 | short |\n", "| 4 | 4.6 | 3.1 | 1.5 | 0.2 | setosa | -1.2433333 | -1.279104 | 150 | short |\n", "| 5 | 5.0 | 3.6 | 1.4 | 0.2 | setosa | -0.8433333 | -1.335752 | 150 | short |\n", "| 6 | 5.4 | 3.9 | 1.7 | 0.4 | setosa | -0.4433333 | -1.165809 | 150 | short |\n", "\n" ], "text/plain": [ " Sepal.Length Sepal.Width Petal.Length Petal.Width Species centered_SepLen\n", "1 5.1 3.5 1.4 0.2 setosa -0.7433333 \n", "2 4.9 3.0 1.4 0.2 setosa -0.9433333 \n", "3 4.7 3.2 1.3 0.2 setosa -1.1433333 \n", "4 4.6 3.1 1.5 0.2 setosa -1.2433333 \n", "5 5.0 3.6 1.4 0.2 setosa -0.8433333 \n", "6 5.4 3.9 1.7 0.4 setosa -0.4433333 \n", " PetLen_zscores n_flowers PetalType\n", "1 -1.335752 150 short \n", "2 -1.335752 150 short \n", "3 -1.392399 150 short \n", "4 -1.279104 150 short \n", "5 -1.335752 150 short \n", "6 -1.165809 150 short " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "dat <- dat %>% \n", " mutate(PetalType = if_else(Petal.Length > mean(Petal.Length),\"long\",\"short\"))\n", "\n", "head(dat)" ] }, { "cell_type": "markdown", "metadata": { "id": "q5xy1F8u0ZAZ" }, "source": [ "Right now `Species` and `PetalType` are two different variables. Let's say for some reason you want a new variable that specifies both, e.g. 'short virginica', 'long setosa', etc. This is often useful when you are plotting and you want to use a color to denote each combination of two variables, instead of using a combination of colors and shapes. \n", "\n", "You can combine variables with the `unite()` command, which takes the arguments `unite(new_var, input1, input2)`. The `remove = FALSE` means it won't remove the two input variables. This is set to `TRUE` by default." ] }, { "cell_type": "code", "execution_count": 161, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 207 }, "executionInfo": { "elapsed": 2573, "status": "ok", "timestamp": 1611095670553, "user": { "displayName": "Patience Stevens", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gi-_9ZqhIFhAv1oMehJNvNuIKSTyrFQHzjxQKhx=s64", "userId": "01994571539255174942" }, "user_tz": 300 }, "id": "pZEnK09-0ZAa", "outputId": "21bf1919-bd37-4aee-bde4-41c92ba5593b" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
A data.frame: 6 × 10
Sepal.LengthSepal.WidthPetal.LengthPetal.WidthCombined_varSpeciescentered_SepLenPetLen_zscoresn_flowersPetalType
<dbl><dbl><dbl><dbl><chr><fct><dbl><dbl><int><chr>
15.13.51.40.2setosa_shortsetosa-0.7433333-1.335752150short
24.93.01.40.2setosa_shortsetosa-0.9433333-1.335752150short
34.73.21.30.2setosa_shortsetosa-1.1433333-1.392399150short
44.63.11.50.2setosa_shortsetosa-1.2433333-1.279104150short
55.03.61.40.2setosa_shortsetosa-0.8433333-1.335752150short
65.43.91.70.4setosa_shortsetosa-0.4433333-1.165809150short
\n" ], "text/latex": [ "A data.frame: 6 × 10\n", "\\begin{tabular}{r|llllllllll}\n", " & Sepal.Length & Sepal.Width & Petal.Length & Petal.Width & Combined\\_var & Species & centered\\_SepLen & PetLen\\_zscores & n\\_flowers & PetalType\\\\\n", " & & & & & & & & & & \\\\\n", "\\hline\n", "\t1 & 5.1 & 3.5 & 1.4 & 0.2 & setosa\\_short & setosa & -0.7433333 & -1.335752 & 150 & short\\\\\n", "\t2 & 4.9 & 3.0 & 1.4 & 0.2 & setosa\\_short & setosa & -0.9433333 & -1.335752 & 150 & short\\\\\n", "\t3 & 4.7 & 3.2 & 1.3 & 0.2 & setosa\\_short & setosa & -1.1433333 & -1.392399 & 150 & short\\\\\n", "\t4 & 4.6 & 3.1 & 1.5 & 0.2 & setosa\\_short & setosa & -1.2433333 & -1.279104 & 150 & short\\\\\n", "\t5 & 5.0 & 3.6 & 1.4 & 0.2 & setosa\\_short & setosa & -0.8433333 & -1.335752 & 150 & short\\\\\n", "\t6 & 5.4 & 3.9 & 1.7 & 0.4 & setosa\\_short & setosa & -0.4433333 & -1.165809 & 150 & short\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "A data.frame: 6 × 10\n", "\n", "| | Sepal.Length <dbl> | Sepal.Width <dbl> | Petal.Length <dbl> | Petal.Width <dbl> | Combined_var <chr> | Species <fct> | centered_SepLen <dbl> | PetLen_zscores <dbl> | n_flowers <int> | PetalType <chr> |\n", "|---|---|---|---|---|---|---|---|---|---|---|\n", "| 1 | 5.1 | 3.5 | 1.4 | 0.2 | setosa_short | setosa | -0.7433333 | -1.335752 | 150 | short |\n", "| 2 | 4.9 | 3.0 | 1.4 | 0.2 | setosa_short | setosa | -0.9433333 | -1.335752 | 150 | short |\n", "| 3 | 4.7 | 3.2 | 1.3 | 0.2 | setosa_short | setosa | -1.1433333 | -1.392399 | 150 | short |\n", "| 4 | 4.6 | 3.1 | 1.5 | 0.2 | setosa_short | setosa | -1.2433333 | -1.279104 | 150 | short |\n", "| 5 | 5.0 | 3.6 | 1.4 | 0.2 | setosa_short | setosa | -0.8433333 | -1.335752 | 150 | short |\n", "| 6 | 5.4 | 3.9 | 1.7 | 0.4 | setosa_short | setosa | -0.4433333 | -1.165809 | 150 | short |\n", "\n" ], "text/plain": [ " Sepal.Length Sepal.Width Petal.Length Petal.Width Combined_var Species\n", "1 5.1 3.5 1.4 0.2 setosa_short setosa \n", "2 4.9 3.0 1.4 0.2 setosa_short setosa \n", "3 4.7 3.2 1.3 0.2 setosa_short setosa \n", "4 4.6 3.1 1.5 0.2 setosa_short setosa \n", "5 5.0 3.6 1.4 0.2 setosa_short setosa \n", "6 5.4 3.9 1.7 0.4 setosa_short setosa \n", " centered_SepLen PetLen_zscores n_flowers PetalType\n", "1 -0.7433333 -1.335752 150 short \n", "2 -0.9433333 -1.335752 150 short \n", "3 -1.1433333 -1.392399 150 short \n", "4 -1.2433333 -1.279104 150 short \n", "5 -0.8433333 -1.335752 150 short \n", "6 -0.4433333 -1.165809 150 short " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n/Nz6OTxxp25nWJPcti5BQrjyGZZpWZm5tk+f68Orkv49P7u57dX7aq8XafNQnvAFlKhBdWrZ\nKPIjD8L7jRzw11+P/S0JTWZGjrVvNtBL8FCzTwbD1+A7AgggEDSB4tKN9u+PD7Cv5j5pSjRU\nWLLOpi95zx74aB9btu7nBs/x8ssv2wMPPNDg29FQG5D0ACleiEaNGtkf/vAHGzp0qG299dbu\nq1WrVq47Ua8TGaoX7zXZDwEENgucu+t4L8303l4+tc2/AvSGfefuZ9vhg/5fvSXKy25mZw59\nw7bp8HvLzWrqpfbOt55thttZQ9+0Nk16pbTeu251nh269d3uOgrIWjbq6mWgu9FLjX5TzOt2\nbzXUTt3hJevSYnsXzCnN9w5dT7GTd3jBC/YqBl0xT8YOCCCAAAJO4Ms5/2erNs71RhVsTp6j\nlSErdT1JY3+8MalK+gBf00Eq94RfdtllNmHCBHctZXLW42pGjhxpp5xyir333nvldVCv8Nln\nn+2mihx11FF29dVXuzn8eraokp/tu+++bvsXX/yWuEejrPxz8zXN5IorrrDDDjvMzclXR0O4\naPmqq66y/fff31173Lhx4U0Rv6vOp512mutVuvTSS23evHnl+91333329ttvu2spAZtyBSRa\nqqqPLP/617+6RwadddZZdtBBB5mm7Pht5aXg8PDDDzfto84T+S1YsCDRqlR7/zoLkJo3b+5u\njm5Q+Kt///6u+0+v1W1OQQCB1AhkZmbb8UP+z24YMcf+ccJGu27fGTaiAaScVg/SYYPutav2\n/tGu2We6nTDkSWvbpHaGUgzudKRdtvdn9v9O2mBXjfjW6z06Pe6b07XlDna6l4r82n1+sSv2\n/M4FVrlZjeM+nh0RQAABBCoK/Lz0Ayv1htVVLiFvfufsFRMrr67R6969e9vDDz9cIej59NNP\nTUGMtm3YsMF22GEHGzt2rP3+9783zYk7+OCDTXNzVIqLi10yshNPPNENcdQoqWXLltlee+3l\nEozozb9GRQ0bNsx++uknd8w777xjn3zyiVtWojIFUTNnznSP2FHvkgItFY3E2n777V0CNQVP\nykR76KGH2oMPPui2V/7f66+/bsOHD3dDn3UOtWPw4MHu3NpXwdE555zjApj169e7jovK56jq\ndaz6KHfBP/7xDxfIaU7ULrvsYtdff70LmsLnGU56GAAAQABJREFUveCCC+yWW25x2zRyTE5K\n5qZz11bJrq0LcR0EEEAAAQQQQAABBJIhkJPVKOppsjKTm/lXyckUdKhHR700Kgp+NIe+Q4cO\ndvvtt7t5XcrorLnQ559/vvXr18/16px88snl9Tz66KPdvlqhHibNndPzQ5Xg4LjjjnOZmSNl\n/FTW5lNPPdXuv/9+dy7VRRmjFUw99thjbp76rFmz3DSUiy66yLp06eKyTZ9++uluf///Lrnk\nElOgFg7ezjvvPOvZs6fr/XrmmWfcrhrlpcf2VCdBmCw0b76q+ii52/jx411gpguqZ+h///uf\n3XjjjfbNN9+4Nun6CoxUNDdT86gi2bgdUvC/OutBitQW/QO48847I21iHQIIIIAAAggggAAC\nTmBQ50MrzEkNs2jI+Nadkj+/U0PhNHdeQY2GgCmJgtapaGic3sQrONBjcPT1448/uvn28+fP\nD1fNTSsJv9AUE/U+9e3b14455hh7/PHHXRBU+fE1Cgq+/fZbNxwufGzbtm1dgDFgwAAXUOy3\n334uOApvVwClIX+Vh8epB2b27NluWFt4X31XIggFd+Gi3rDqBEc6XgFOrPooAFOvVbh0797d\n1FulEg4yd9999/Bm1xtX/qKWFmL2IKmrLpFsOhs3bqylqnMZBBBAAAEEEEAAgSAKDO58hE1e\n+JpNWzKu/Bl5WRm51rxRJztg4J+TTqK5RUq7/eqrr7pgRAFEOMOcAg9l0FVCsXDR8LHrrruu\nwro2bdqEN7tzKbBSr9Sbb75pGlZ2+eWX2yuvvGJ77713+X4avqfgIdrUE2UJrRxUqVdLxT+v\nR6/DCdDUw+Qv2t+/r7+e/v3iWY6nPrLyF7mFe4cUc6g+/tT9yppd2yVmgKSJW1tttVVt14vr\nIdBgBJQ956t5T9iCNV97Wdba27adj7GtWg9rMPWvTkXXblpkX8573Bavm2It8rvYdl1O8FJt\nb1+dUyV0jJ4p9MOS17wHw461Ei/Fdq82e9r2XU607CweEpkQJDsjgAACDVxAc3ZO3PFx+27B\nf23KwletuLTAerfby4ZudYblZTdNeuv0hl3D3J5//nn35l1D58IJxfr06WOaM3TbbbeVB0Qz\nZsxw83s0PK+oaMu5UtOnT3dJGxQY6Us9Phq+p2F0/gBJQZmG4Kk3SD0zKuq80BC7iy++2HRt\nzRvyF71WfQcNGmRK8x0u6qnRnB5t32OPPcKrTUkdtttuu/LXNVmIVR/1rFVVlC58zpw5rnMm\n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\nOxsQQAABBBBAAIF0F0g4QJoxY4btuuuurtdIOEOGDLHwM4/69Oljd955p/3pT39Kdzfah0CD\nFejecqhFC5Kys/KtfbMBDbZtVBwBBBBAAAEEEKipQMIBUqtWraxRo0bl1+3fv79NmjSp/PVu\nu+3m5ibNnz+/fB0LCCBQfwTaNe1nQ7qcuMUwuwzLtP373WzZmXn1p7LUBAEEEEAAAQQQqGWB\nhAOkAQMG2MSJE93cI9VVQ+xmz55tc+fOdVXXMDvNQ8rJyanlpnA5BBCIV+DAAX+z/fr+2aX1\nzs1qbB2abm1Hb/sf267LcfGegv0QQAABBBBAAIG0FEg4QDr11FNdD1Lfvn3tww8/tH322cea\nNGliRx11lP3tb3+ziy66yA3B01wkCgII1E+BjIwM99yji3b/1P5+7Ar7wy5vW792+9fPylIr\nBBBAAAEEAibw3HPPmeb917QUFhbazTffbPPmzavpqap1vJK63XXXXdU6NtZBa9eujbVLtbcn\nHCApW92YMWPc3KNNmzaZhtwpa923335rN9xwg7sBl156abUrxIEIIIAAAggggAACCMQrsMp7\n5MwiLxBIp/LCCy/YW2+9VeMm6b36TTfdVGcB0nfffefyE9S4IZVOoA6Z++67r9La5L2MnOs3\nxvmHDRvmeo/Czzo65ZRTbP/993dzkbbZZhvr1q1bjDOwGQEEEEAAAQQQQACB6gv8UlBg10yf\nYT+s3+BO0s6b3nFTn562b5vW1T9pPTny5Zdfric1qZ/V+Pzzz+33v/99yiqXcA/S6NGj7eqr\nr3YV0jCdcNGQupEjR9rXX3/tno+0cePG8Ca+I4AAAggggAACCCCQNIHlRUV2wnc/2NRfgyOd\neJnXk3Tx1On22eo1SbuOTqRszRdeeKGVlpZWOO9ll11mEyZMcOs03EtZnPVeWB0H7733Xvm+\nGuZ29tln25dffummpOh9dFlZmetYOOOMM2zfffd127/44ovyY/71r3/ZU089Vf5ax15xxRV2\n2GGH2T//+c/yXADaQc8kveqqq1xnha49bty48uMiLajOp512mo0YMcI06ss//E69Mm+//ba7\n1kknnWTTpk2LdIoK61avXu1Gkamz5LjjjrNHHnnEwp0o4R0VH+iahx56qP3jH/+osF2u//73\nv+2II45w7bvnnnus2LuXKpHsNGRP+Q9effVVu/3228OXSOr3uAKkZcuW2YIFC9yXMtZ9+umn\n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\njjpdrupelJSR2KVObw4XRwABBBqQwMbFmfbzY02srDDDC4y8rxJFSBm28H/5tuyz3KS25LPP\nPrMLL7zQws8GDZ/8sssuswkTJtjnn39uWlYpLCy0s88+27788ks76qij3LC7Mu+DWq1/4IEH\n7PDDD7ezzjrLpk6d6vZbsGCBe6aojvnpp5/cOe6//34bN26cPfbYY27/448/3t599123Tf/z\nX0+vly9fbnfccYcdeuihdu2119rXX3+t1a7oun//+9/tmGOOccPkLrnkEpszZ054c8LfldX6\nqquusv33399OOeUUV8/wSRTkqR0zZ8509dCwvIsuusiU0C1cqnII71MfvhMg1Ye7QB1qJLBT\ns6b64Chi6eUla2ga4SHHEXdmZcoFdvDuVaRfOjne3KNdW/Dg2ZTfAC6AAAIIpInAko/zIrek\nTEFSlG2Rj4i5tnfv3vbwww/be++9V77vp59+6uboa9svv/xiGoqmoiDhkUcecT1KeXl5tnr1\nasv0RrFccMEFdsstt9guu+xi6jHaa6+93H6rVq0yBVA6RsGSioKjc88915544gnbd999XWCm\nYOOHH35w2/3X27Bhgx144IHu+iNHjnSB2LBhwyw8XE/HPffcc+482m/8+PG2zz77uGu6kyXw\nP9V1++23t7feessOO+wwdw4FZQ8++KA7iwJIteOggw4yBVLaR2YKpsKlKofwPvXhO0Ps6sNd\noA41EhjeorkNbd7MvvAm+6s3SUVvwhU0/blHN72k1BOBq7p1thOm/mzF3h8DbySEKwqOenqB\n7OFtWteTWlINBBBAAIH6LrBpqfeX3guGIpWi1ZE+iou0Z3zr2rVr53pnnnrqqfI3+wqIFHB0\n6NAh4kmOPvpou/322922b775xvUGvf/++y4w0sqOHTvaTTfdFPWxOE2aNLEPPvjABVfqvVKi\nBAUb22yzTYXrPfrooy4YUdCkwEulqKjI9TgdeeSR7jgFMAMHDnTb9GgeBTDLli2LWne3Y4T/\nqT16/qmCL11LvUNdunRxvUWnn356eaKlY4891gWDOoWuN2LECNeLpJ4k9Yol4hChGrWyKrn/\ngmqlylwEgS0F/tGnp53XqYN1b5RvrbzU3uqNeGpgX9uuaZMtd2ZNnQkoo+DzA/vZ3i1bWMvs\nLOvg3asTvXTsT/TvYzneJ2wUBBBAAAEE4hHI7+ANrs+MPDQ7t1VVA+/jOfuW+5xxxhk2ZswY\n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\np7//9re/lXPOOSfHe5h9zZ8wYYLMnz8/+xpGixBAAAEEEOghgaIeOg6HQQABBDokYE97v+ee\ne9zI0QMPPCB+/6bvc/bee2+xwMlGku699165+uqrpX///h3aNxsnF7BbASkIIIAAAggUsgAB\nUiGfffqOQBYLVFdXu/k6hxxySHNwFGtuIBBwI0kzZ86UlStXtgiQ7Baxf/7zn/Lee+/JNtts\nI1OmTJHJkyfHqrrff/3rX6Vfv36y5557yp133ikfffSR7L///jJ16lQZOnRoi23Xrl3rArH3\n339fvvrqK9lhhx3cPvfbb78W23X3m3T7UVFRIQcddJDcfffdsmDBAhkyZIiccMIJYoFkfLF+\nPP744/L000+7bb773e86XxuVs9G4L774Qm6++WZ32+Lrr78uv/vd7+Tss8+O34XYbXazZ8+W\nr7/+Wvbaay8588wzpby8vMU2vEEAAQQQQCDnBTwKAgggkKUCo0eP9oqKirzrr7/e+/LLL9tt\n5a233uqVlJS4H52v5I0fP97Tf6S9n//85y3q7r777t7YsWM9DSa8fffd1zvrrLPc68rKSm/Z\nsmXN27700kvelltu6fXp08c79NBD3bYanHk+n8+74447mrebMWOGO47ORWpe1vqFBmxum/PP\nP7/1qjbvO9IPa/+IESM8naflHXDAAZ4GLJ610doUK2vWrPE0WHT90NsVvX322ccrLS319thj\nDy8YDLrNrN8HHniga6O52Ot33nnH06DKLdOAyCsuLnZ1bb25amDmNTQ0xA7DbwQQQAABBPJC\nwL4tpCCAAAJZKWBBhSY/cBfjeoudpyM+3sUXX+w988wznt4K1qLNOgrkAiO7aNfRkuZ1v/71\nr119HTlpXmYBUuvAafXq1d6wYcO83XbbzdMseW5bHVVygYeti5Xly5e7oM2Cr1jpzgCpM/34\nxS9+4WmWOdecDz/80AVCkyZNijXP0xE0T0eaPM0A2LzstttucwaxACm2woI/HTmKvW0OkAYM\nGODpKJpbbvY6AuXqv/LKK83b8gIBBBBAAIF8ECBJQ86PAdIBBPJXwOYZLVy4UK699lp3C9wb\nb7whV155pRx88MGioyby1ltvNXfebg9rbGwUDaCkqqqqefnPfvYz0ZEPmT59evMye2G3pl16\n6aXNywYNGiQXXHCBvPnmm7J06VJ3q5kliJgzZ47YuljZeuut3a15dstaJkpH+6EBjlhGPx0R\n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", "text/plain": [ "plot without title" ] }, "metadata": { "image/png": { "height": 420, "width": 420 } }, "output_type": "display_data" } ], "source": [ "dat <- dat %>% \n", " unite(Combined_var, Species, PetalType, remove=FALSE)\n", "head(dat)\n", "\n", "ggplot(dat, aes(Sepal.Length, Petal.Length, color = Combined_var))+ geom_point(size = 1.5)" ] }, { "cell_type": "markdown", "metadata": { "id": "xS_M3Z2q0ZAa" }, "source": [ "With `unite()`, you can also specify the separator (by default it is '\\_') and whether to remove the original variables. Check the help section for more on how to do this (`?unite`)." ] }, { "cell_type": "markdown", "metadata": { "id": "1A9LI6580ZAa" }, "source": [ "## `separate()`: Split one column into multiple columns" ] }, { "cell_type": "markdown", "metadata": { "id": "-tl2-rOw0ZAa" }, "source": [ "The reverse of the operation above is called `separate()`. It becomes useful, for example, if you have the name of participants stored in one variable, but you want to separate it into First and Last name. For the illustration, I will just reverse the above example (adding 1 to the new variables, to distinguish them from the existing Species and PetalType variables):" ] }, { "cell_type": "code", "execution_count": 162, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 207 }, "executionInfo": { "elapsed": 2558, "status": "ok", "timestamp": 1611095670554, "user": { "displayName": "Patience Stevens", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gi-_9ZqhIFhAv1oMehJNvNuIKSTyrFQHzjxQKhx=s64", "userId": "01994571539255174942" }, "user_tz": 300 }, "id": "kM6DbKC50ZAa", "outputId": "eec54e8d-c108-47d4-e6b2-d424e34d749a", "scrolled": true }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
A data.frame: 6 × 11
Sepal.LengthSepal.WidthPetal.LengthPetal.WidthSpecies1PetalType1Speciescentered_SepLenPetLen_zscoresn_flowersPetalType
<dbl><dbl><dbl><dbl><chr><chr><fct><dbl><dbl><int><chr>
15.13.51.40.2setosashortsetosa-0.7433333-1.335752150short
24.93.01.40.2setosashortsetosa-0.9433333-1.335752150short
34.73.21.30.2setosashortsetosa-1.1433333-1.392399150short
44.63.11.50.2setosashortsetosa-1.2433333-1.279104150short
55.03.61.40.2setosashortsetosa-0.8433333-1.335752150short
65.43.91.70.4setosashortsetosa-0.4433333-1.165809150short
\n" ], "text/latex": [ "A data.frame: 6 × 11\n", "\\begin{tabular}{r|lllllllllll}\n", " & Sepal.Length & Sepal.Width & Petal.Length & Petal.Width & Species1 & PetalType1 & Species & centered\\_SepLen & PetLen\\_zscores & n\\_flowers & PetalType\\\\\n", " & & & & & & & & & & & \\\\\n", "\\hline\n", "\t1 & 5.1 & 3.5 & 1.4 & 0.2 & setosa & short & setosa & -0.7433333 & -1.335752 & 150 & short\\\\\n", "\t2 & 4.9 & 3.0 & 1.4 & 0.2 & setosa & short & setosa & -0.9433333 & -1.335752 & 150 & short\\\\\n", "\t3 & 4.7 & 3.2 & 1.3 & 0.2 & setosa & short & setosa & -1.1433333 & -1.392399 & 150 & short\\\\\n", "\t4 & 4.6 & 3.1 & 1.5 & 0.2 & setosa & short & setosa & -1.2433333 & -1.279104 & 150 & short\\\\\n", "\t5 & 5.0 & 3.6 & 1.4 & 0.2 & setosa & short & setosa & -0.8433333 & -1.335752 & 150 & short\\\\\n", "\t6 & 5.4 & 3.9 & 1.7 & 0.4 & setosa & short & setosa & -0.4433333 & -1.165809 & 150 & short\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "A data.frame: 6 × 11\n", "\n", "| | Sepal.Length <dbl> | Sepal.Width <dbl> | Petal.Length <dbl> | Petal.Width <dbl> | Species1 <chr> | PetalType1 <chr> | Species <fct> | centered_SepLen <dbl> | PetLen_zscores <dbl> | n_flowers <int> | PetalType <chr> |\n", "|---|---|---|---|---|---|---|---|---|---|---|---|\n", "| 1 | 5.1 | 3.5 | 1.4 | 0.2 | setosa | short | setosa | -0.7433333 | -1.335752 | 150 | short |\n", "| 2 | 4.9 | 3.0 | 1.4 | 0.2 | setosa | short | setosa | -0.9433333 | -1.335752 | 150 | short |\n", "| 3 | 4.7 | 3.2 | 1.3 | 0.2 | setosa | short | setosa | -1.1433333 | -1.392399 | 150 | short |\n", "| 4 | 4.6 | 3.1 | 1.5 | 0.2 | setosa | short | setosa | -1.2433333 | -1.279104 | 150 | short |\n", "| 5 | 5.0 | 3.6 | 1.4 | 0.2 | setosa | short | setosa | -0.8433333 | -1.335752 | 150 | short |\n", "| 6 | 5.4 | 3.9 | 1.7 | 0.4 | setosa | short | setosa | -0.4433333 | -1.165809 | 150 | short |\n", "\n" ], "text/plain": [ " Sepal.Length Sepal.Width Petal.Length Petal.Width Species1 PetalType1 Species\n", "1 5.1 3.5 1.4 0.2 setosa short setosa \n", "2 4.9 3.0 1.4 0.2 setosa short setosa \n", "3 4.7 3.2 1.3 0.2 setosa short setosa \n", "4 4.6 3.1 1.5 0.2 setosa short setosa \n", "5 5.0 3.6 1.4 0.2 setosa short setosa \n", "6 5.4 3.9 1.7 0.4 setosa short setosa \n", " centered_SepLen PetLen_zscores n_flowers PetalType\n", "1 -0.7433333 -1.335752 150 short \n", "2 -0.9433333 -1.335752 150 short \n", "3 -1.1433333 -1.392399 150 short \n", "4 -1.2433333 -1.279104 150 short \n", "5 -0.8433333 -1.335752 150 short \n", "6 -0.4433333 -1.165809 150 short " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "dat <- dat %>% \n", " separate(Combined_var, into=c('Species1', 'PetalType1'))\n", "head(dat)" ] }, { "cell_type": "markdown", "metadata": { "id": "0qnJTfjleG2v" }, "source": [ "Like with `unite()`, you can specify the character you want `separate()` to split. For example, splitting at \" \" instead of at the default \"_\" for the First, Last name example. See `?separate` for more info." ] }, { "cell_type": "markdown", "metadata": { "id": "TKlDT_I-0ZAa" }, "source": [ "## `group_by()`: Implicitly group data" ] }, { "cell_type": "markdown", "metadata": { "id": "6WFQokKg0ZAa" }, "source": [ "In the filtering example in section 4.3, we saw how to subset the data.frame separately for different species, and then to calculate the summaries. This is inefficient and also creates two separate data.frames. While you can join them manually afterwards, there is a much easier way with the **`group_by`** command.\n", "\n", "When you pass a data.frame to a **`group_by`** command, you can specify names of variables, by which to split the data.frame. For example, if we specify the `Species` and `PetalType` variables in the group_by command, the data.frame will be **_implicitly_** split into 4 data.frames - one for each combination of species and petal type. E.g.:" ] }, { "cell_type": "code", "execution_count": 165, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 2544, "status": "ok", "timestamp": 1611095670555, "user": { "displayName": "Patience Stevens", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gi-_9ZqhIFhAv1oMehJNvNuIKSTyrFQHzjxQKhx=s64", "userId": "01994571539255174942" }, "user_tz": 300 }, "id": "E6KlSAS90ZAb", "outputId": "767de59d-39ff-48b5-dd28-e0569d4338f7" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[90m# A tibble: 150 × 11\u001b[39m\n", "\u001b[90m# Groups: Species, PetalType [4]\u001b[39m\n", " Sepal.Length Sepal.…¹ Petal…² Petal…³ Speci…⁴ Petal…⁵ Species cente…⁶ PetLe…⁷\n", " \u001b[3m\u001b[90m\u001b[39m\u001b[23m \u001b[3m\u001b[90m\u001b[39m\u001b[23m \u001b[3m\u001b[90m\u001b[39m\u001b[23m \u001b[3m\u001b[90m\u001b[39m\u001b[23m \u001b[3m\u001b[90m\u001b[39m\u001b[23m \u001b[3m\u001b[90m\u001b[39m\u001b[23m \u001b[3m\u001b[90m\u001b[39m\u001b[23m \u001b[3m\u001b[90m\u001b[39m\u001b[23m \u001b[3m\u001b[90m\u001b[39m\u001b[23m\n", "\u001b[90m 1\u001b[39m 5.1 3.5 1.4 0.2 setosa short setosa -\u001b[31m0\u001b[39m\u001b[31m.\u001b[39m\u001b[31m743\u001b[39m -\u001b[31m1\u001b[39m\u001b[31m.\u001b[39m\u001b[31m34\u001b[39m\n", "\u001b[90m 2\u001b[39m 4.9 3 1.4 0.2 setosa short setosa -\u001b[31m0\u001b[39m\u001b[31m.\u001b[39m\u001b[31m943\u001b[39m -\u001b[31m1\u001b[39m\u001b[31m.\u001b[39m\u001b[31m34\u001b[39m\n", "\u001b[90m 3\u001b[39m 4.7 3.2 1.3 0.2 setosa short setosa -\u001b[31m1\u001b[39m\u001b[31m.\u001b[39m\u001b[31m14\u001b[39m -\u001b[31m1\u001b[39m\u001b[31m.\u001b[39m\u001b[31m39\u001b[39m\n", "\u001b[90m 4\u001b[39m 4.6 3.1 1.5 0.2 setosa short setosa -\u001b[31m1\u001b[39m\u001b[31m.\u001b[39m\u001b[31m24\u001b[39m -\u001b[31m1\u001b[39m\u001b[31m.\u001b[39m\u001b[31m28\u001b[39m\n", "\u001b[90m 5\u001b[39m 5 3.6 1.4 0.2 setosa short setosa -\u001b[31m0\u001b[39m\u001b[31m.\u001b[39m\u001b[31m843\u001b[39m -\u001b[31m1\u001b[39m\u001b[31m.\u001b[39m\u001b[31m34\u001b[39m\n", "\u001b[90m 6\u001b[39m 5.4 3.9 1.7 0.4 setosa short setosa -\u001b[31m0\u001b[39m\u001b[31m.\u001b[39m\u001b[31m443\u001b[39m -\u001b[31m1\u001b[39m\u001b[31m.\u001b[39m\u001b[31m17\u001b[39m\n", "\u001b[90m 7\u001b[39m 4.6 3.4 1.4 0.3 setosa short setosa -\u001b[31m1\u001b[39m\u001b[31m.\u001b[39m\u001b[31m24\u001b[39m -\u001b[31m1\u001b[39m\u001b[31m.\u001b[39m\u001b[31m34\u001b[39m\n", "\u001b[90m 8\u001b[39m 5 3.4 1.5 0.2 setosa short setosa -\u001b[31m0\u001b[39m\u001b[31m.\u001b[39m\u001b[31m843\u001b[39m -\u001b[31m1\u001b[39m\u001b[31m.\u001b[39m\u001b[31m28\u001b[39m\n", "\u001b[90m 9\u001b[39m 4.4 2.9 1.4 0.2 setosa short setosa -\u001b[31m1\u001b[39m\u001b[31m.\u001b[39m\u001b[31m44\u001b[39m -\u001b[31m1\u001b[39m\u001b[31m.\u001b[39m\u001b[31m34\u001b[39m\n", "\u001b[90m10\u001b[39m 4.9 3.1 1.5 0.1 setosa short setosa -\u001b[31m0\u001b[39m\u001b[31m.\u001b[39m\u001b[31m943\u001b[39m -\u001b[31m1\u001b[39m\u001b[31m.\u001b[39m\u001b[31m28\u001b[39m\n", "\u001b[90m# … with 140 more rows, 2 more variables: n_flowers , PetalType , and\u001b[39m\n", "\u001b[90m# abbreviated variable names ¹​Sepal.Width, ²​Petal.Length, ³​Petal.Width,\u001b[39m\n", "\u001b[90m# ⁴​Species1, ⁵​PetalType1, ⁶​centered_SepLen, ⁷​PetLen_zscores\u001b[39m\n" ] } ], "source": [ "dat %>% \n", " group_by(Species, PetalType) %>%\n", " print()" ] }, { "cell_type": "markdown", "metadata": { "id": "DcONDAd00ZAb" }, "source": [ "Now, the key is that the split is implicit - as you can see above, we still only have one data.frame, but now it has the specification:\n", "\n", "`# Groups: Species, PetalType [4]`\n", "\n", "Every function that you add after `group_by()` will be evaluated separately for each group, and then the results will be combined. Let's say you want to calculate the mean and sd for `Sepal.Length` and `Sepal.Width` separately for the four groups:" ] }, { "cell_type": "code", "execution_count": 166, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 199 }, "executionInfo": { "elapsed": 2530, "status": "ok", "timestamp": 1611095670557, "user": { "displayName": "Patience Stevens", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gi-_9ZqhIFhAv1oMehJNvNuIKSTyrFQHzjxQKhx=s64", "userId": "01994571539255174942" }, "user_tz": 300 }, "id": "_UxGcbX80ZAb", "outputId": "cc9a7607-fd6a-441f-c16e-7a2973626fdb" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "\u001b[1m\u001b[22m`summarise()` has grouped output by 'Species'. You can override using the\n", "`.groups` argument.\n" ] }, { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
A grouped_df: 4 × 6
SpeciesPetalTypeSepLen_meanSepLen_sdSepWid_meanSepWid_sd
<fct><chr><dbl><dbl><dbl><dbl>
setosa short5.0060000.35248973.4280000.3524897
versicolorlong 6.0465120.45374052.8232560.4537405
versicolorshort5.2571430.33094382.4428570.3309438
virginica long 6.5880000.63587962.9740000.6358796
\n" ], "text/latex": [ "A grouped\\_df: 4 × 6\n", "\\begin{tabular}{llllll}\n", " Species & PetalType & SepLen\\_mean & SepLen\\_sd & SepWid\\_mean & SepWid\\_sd\\\\\n", " & & & & & \\\\\n", "\\hline\n", "\t setosa & short & 5.006000 & 0.3524897 & 3.428000 & 0.3524897\\\\\n", "\t versicolor & long & 6.046512 & 0.4537405 & 2.823256 & 0.4537405\\\\\n", "\t versicolor & short & 5.257143 & 0.3309438 & 2.442857 & 0.3309438\\\\\n", "\t virginica & long & 6.588000 & 0.6358796 & 2.974000 & 0.6358796\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "A grouped_df: 4 × 6\n", "\n", "| Species <fct> | PetalType <chr> | SepLen_mean <dbl> | SepLen_sd <dbl> | SepWid_mean <dbl> | SepWid_sd <dbl> |\n", "|---|---|---|---|---|---|\n", "| setosa | short | 5.006000 | 0.3524897 | 3.428000 | 0.3524897 |\n", "| versicolor | long | 6.046512 | 0.4537405 | 2.823256 | 0.4537405 |\n", "| versicolor | short | 5.257143 | 0.3309438 | 2.442857 | 0.3309438 |\n", "| virginica | long | 6.588000 | 0.6358796 | 2.974000 | 0.6358796 |\n", "\n" ], "text/plain": [ " Species PetalType SepLen_mean SepLen_sd SepWid_mean SepWid_sd\n", "1 setosa short 5.006000 0.3524897 3.428000 0.3524897\n", "2 versicolor long 6.046512 0.4537405 2.823256 0.4537405\n", "3 versicolor short 5.257143 0.3309438 2.442857 0.3309438\n", "4 virginica long 6.588000 0.6358796 2.974000 0.6358796" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "dat %>% \n", " group_by(Species, PetalType) %>% \n", " summarise(SepLen_mean = mean(Sepal.Length),\n", " SepLen_sd = sd(Sepal.Length),\n", " SepWid_mean = mean(Sepal.Width),\n", " SepWid_sd = sd(Sepal.Length))\n" ] }, { "cell_type": "markdown", "metadata": { "id": "P2EDfqdQ0ZAb" }, "source": [ "And that's all the code you need. If you have tried to do something like this in base R (i.e., without `dplyr` commands), you know how involved it is! `dplyr` can make your code **much** cleaner. What is going on behind the scenes is that the data.frame is separated into multiple data.frames, one for each combination of variables. Then the `summarise` function is executed on each, and the resulting 4 data.frames are automatically combined into a new resulting data.frame.\n", "\n", "Note that you can ungroup using `ungroup()`.\n", "\n", "The `group_by` command works not only with `summarise`, but also with `mutate`. While with `summarise` it creates a new data.frame with summary results, with `mutate` it creates a new variable that is calculated separately for each group, and then combined into the final data.frame. This is useful, when, for example, we want to standardize variables within groups. Earlier we saw how to subtract the overall mean of `Sepal.Length` to center a variable. Let's say that we want to subtract the mean `Sepal.Length` of each species only from the flowers in that species. So, for our example we can do:" ] }, { "cell_type": "code", "execution_count": 167, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 207 }, "executionInfo": { "elapsed": 2736, "status": "ok", "timestamp": 1611095670778, "user": { "displayName": "Patience Stevens", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gi-_9ZqhIFhAv1oMehJNvNuIKSTyrFQHzjxQKhx=s64", "userId": "01994571539255174942" }, "user_tz": 300 }, "id": "5tlnhAp30ZAc", "outputId": "80e278a1-e092-4fc5-f657-fcd6bda08d4f" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
A grouped_df: 6 × 3
SpeciesSepLen_centered_overallSepLen_centered_byspecies
<fct><dbl><dbl>
setosa-0.7433333 0.094
setosa-0.9433333-0.106
setosa-1.1433333-0.306
setosa-1.2433333-0.406
setosa-0.8433333-0.006
setosa-0.4433333 0.394
\n" ], "text/latex": [ "A grouped\\_df: 6 × 3\n", "\\begin{tabular}{lll}\n", " Species & SepLen\\_centered\\_overall & SepLen\\_centered\\_byspecies\\\\\n", " & & \\\\\n", "\\hline\n", "\t setosa & -0.7433333 & 0.094\\\\\n", "\t setosa & -0.9433333 & -0.106\\\\\n", "\t setosa & -1.1433333 & -0.306\\\\\n", "\t setosa & -1.2433333 & -0.406\\\\\n", "\t setosa & -0.8433333 & -0.006\\\\\n", "\t setosa & -0.4433333 & 0.394\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "A grouped_df: 6 × 3\n", "\n", "| Species <fct> | SepLen_centered_overall <dbl> | SepLen_centered_byspecies <dbl> |\n", "|---|---|---|\n", "| setosa | -0.7433333 | 0.094 |\n", "| setosa | -0.9433333 | -0.106 |\n", "| setosa | -1.1433333 | -0.306 |\n", "| setosa | -1.2433333 | -0.406 |\n", "| setosa | -0.8433333 | -0.006 |\n", "| setosa | -0.4433333 | 0.394 |\n", "\n" ], "text/plain": [ " Species SepLen_centered_overall SepLen_centered_byspecies\n", "1 setosa -0.7433333 0.094 \n", "2 setosa -0.9433333 -0.106 \n", "3 setosa -1.1433333 -0.306 \n", "4 setosa -1.2433333 -0.406 \n", "5 setosa -0.8433333 -0.006 \n", "6 setosa -0.4433333 0.394 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "dat_centered <- dat %>% \n", " #center values by mean for all data:\n", " mutate(SepLen_centered_overall = Sepal.Length - mean(Sepal.Length)) %>% \n", " group_by(Species) %>% \n", " #center values by mean for each species:\n", " mutate(SepLen_centered_byspecies = Sepal.Length - mean(Sepal.Length)) %>% \n", " #just show the relevant variables (there are a lot of variables in this data.frame now!):\n", " select(Species, SepLen_centered_overall:SepLen_centered_byspecies)\n", "\n", "head(dat_centered)" ] }, { "cell_type": "markdown", "metadata": { "id": "zIrqCevU0ZAc" }, "source": [ "The second column above gives us the sepal lengths centered over the whole sample, while the third line gives us the sepal lengths centered separately for each species. To illustrate, I will plot the means for each species under the two centerings (don't worry about the code if you don't know `ggplot2` yet):" ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 437 }, "executionInfo": { "elapsed": 579, "status": "ok", "timestamp": 1611095726181, "user": { "displayName": "Patience Stevens", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gi-_9ZqhIFhAv1oMehJNvNuIKSTyrFQHzjxQKhx=s64", "userId": "01994571539255174942" }, "user_tz": 300 }, "id": "c0HLucst0ZAc", "outputId": "7c332eac-0011-4ec9-9ea3-44e6d756205a", "scrolled": false }, "outputs": [ { "data": { "image/png": "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\nApULSDFydNJJJ6WjjjoqrbHGGmnq1Klpzz33TGeeeWb+u6dG3XvvvWn33XdP22+/fU9ve40A\nAQIECBAgQIAAAQL9EqjcNUjXXXddWmKJJfJwFC0YNWpU2mKLLdKll17aY4MmT56cIlSttNJK\nPb7f/cVp06al5k+j0ej+tucECBAgQIAAAQIECMzCApUbQXriiSfSkksu2aVLIjBNnDgxDzYj\nRnTNdA899FD++jXXXJOOPPLI9NJLL6VNNtkk7bbbbmns2LFdjnPzzTenj3/8411e6zwtr8sb\nnhAgQIAAAQIECBAgMMsJVC4gPfnkk2meeebp0hERYmLU5/nnn3/LdUj33Xdfvm+MJO21115p\n/Pjx6ZxzzknPPvtsOuigg7ocZ84550xrrbVW67UJEyakRx99tPXcAwIECBAgQIAAAQIEZm2B\nygWk0aNH59cdde6WuA4ptjnmmKPzy/njzTbbLF+MYfHFF8+fRwAaOXJkOvnkk9Pee+/dJWyt\nsMIKKRZ0aG4HHHBAipEnGwECBAgQIECAAAECBEKg63y1CpgstNBC6cUXX+xSkxdeeCEfOeo+\nZS52itea4ahZaL311ssfxmiUjQABAgQIECBAgAABAv0VqFxAGjduXLr77ru7jCLdcccdb7ku\nqdnAs846K33ta19rPs1/33LLLamjo+MtwanLTp4QIECAAAECBAgQIECgm0DlAtKmm26aV/H0\n00/PrzuKG8BeeOGFaZdddmlVPd6L0BRb3ET22muvTeedd14eqm644Yb8cax8ZwGGFpkHBAgQ\nIECAAAECBAj0Q6ByASmmzB122GH5QgsRcr7yla+k7bbbLg9CzfYce+yxKVakiy1WuIvFGY45\n5pi0+eabp/333z9fIjx+2wgQIECAAAECBAgQIDAQgcot0hCVX3PNNdO5556bnnrqqbTwwgun\n7kt7X3HFFV3auMMOO6Rtt902Pf300ymuYRozZkyX9z0hQIAAAQIECBAgQIBAfwQqGZCaFV90\n0UWbD9v+jhvKxmiSjQABAgQIECBAgAABAjMqULkpdjPaEOUIECBAgAABAgQIECBQVEBAKiqo\nPAECBAgQIECAAAECtREQkGrTlRpCgAABAgQIECBAgEBRAQGpqKDyBAgQIECAAAECBAjURkBA\nqk1XaggBAgQIECBAgAABAkUFBKSigsoTIECAAAECBAgQIFAbAQGpNl2pIQQIECBAgAABAgQI\nFBUQkIoKKk+AAAECBAgQIECAQG0EBKTadKWGECBAgAABAgQIECBQVEBAKiqoPAECBAgQIECA\nAAECtREQkGrTlRpCgAABAgQIECBAgEBRAQGpqKDyBAgQIECAAAECBAjURkBAqk1XaggBAgQI\nECBAgAABAkUFBKSigsoTIECAAAECBAgQIFAbAQGpNl2pIQQIECBAgAABAgQIFBUQkIoKKk+A\nAAECBAgQIECAQG0EBKTadKWGECBAgAABAgQIECBQVEBAKiqoPAECBAgQIECAAAECtREQkGrT\nlRpCgAABAgQIECBAgEBRAQGpqKDyBAgQIECAAAECBAjURkBAqk1XaggBAgQIECBAgAABAkUF\nBKSigsoTIECAAAECBAgQIFAbAQGpNl2pIQQIECBAgAABAgQIFBUQkIoKKk+AAAECBAgQIECA\nQG0EBKTadKWGECBAgAABAgQIECBQVEBAKiqoPAECBAgQIECAAAECtREQkGrTlRpCgAABAgQI\nECBAgEBRAQGpqKDyBAgQIECAAAECBAjURkBAqk1XaggBAgQIECBAgAABAkUFBKSigsoTIECA\nAAECBAgQIFAbAQGpNl2pIQQIECBAgAABAgQIFBUQkIoKKk+AAAECBAgQIECAQG0EBKTadKWG\nECBAgAABAgQIECBQVEBAKiqoPAECBAgQIECAAAECtREQkGrTlRpCgAABAgQIECBAgEBRAQGp\nqKDyBAgQIECAAAECBAjURkBAqk1XaggBAgQIECBAgAABAkUFBKSigsoTIECAAAECBAgQIFAb\nAQGpNl2pIQQIECBAgAABAgQIFBUQkIoKKk+AAAECBAgQIECAQG0EBKTadKWGECBAgAABAgQI\nECBQVEBAKiqoPAECBAgQIECAAAECtREQkGrTlRpCgAABAgQIECBAgEBRAQGpqKDyBAgQIECA\nAAECBAjURkBAqk1XaggBAgQIECBAgAABAkUFBKSigsoTIECAAAECBAgQIFAbAQGpNl2pIQQI\nECBAgAABAgQIFBUQkIoKKk+AAAECBAgQIECAQG0EBKTadKWGECBAgAABAgQIECBQVEBAKiqo\nPAECBAgQIECAAAECtREQkGrTlRpCgAABAgQIECBAgEBRAQGpqKDyBAgQIECAAAECBAjURkBA\nqk1XaggBAgQIECBAgAABAkUFBKSigsoTIECAAAECBAgQIFAbAQGpNl2pIQQIECBAgAABAgQI\nFBUQkIoKKk+AAAECBAgQIECAQG0EBKTadKWGECBAgAABAgQIECBQVEBAKiqoPAECBAgQIECA\nAAECtREQkGrTlRpCgAABAgQIECBAgEBRAQGpqKDyBAgQIECAAAECBAjURkBAqk1XaggBAgQI\nECBAgAABAkUFBKSigsoTIECAAAECBAgQIFAbAQGpNl2pIQQIECBAgAABAgQIFBUQkIoKKk+A\nAAECBAgQIECAQG0EBKTadKWGECBAgAABAgQIECBQVEBAKiqoPAECBAgQIECAAAECtREQkGrT\nlRpCgAABAgQIECBAgEBRAQGpqKDyBAgQIECAAAECBAjURkBAqk1XaggBAgQIECBAgAABAkUF\nBKSigsoTIECAAAECBAgQIFAbAQGpNl2pIQQIECBAgAABAgQIFBUQkIoKKk+AAAECBAgQIECA\nQG0EBKTadKWGECBAgAABAgQIECBQVEBAKiqoPAECBAgQIECAAAECtREQkGrTlRpCgAABAgQI\nECBAgEBRAQGpqKDyBAgQIECAAAECBAjURkBAqk1XaggBAgQIECBAgAABAkUFBKSigsoTIECA\nAAECBAgQIFAbAQGpNl2pIQQIECBAgAABAgQIFBUQkIoKKk+AAAECBAgQIECAQG0EBKTadKWG\nECBAgAABAgQIECBQVEBAKiqoPAECBAgQIECAAAECtREQkGrTlRpCgAABAgQIECBAgEBRAQGp\nqKDyBAgQIECAAAECBAjURkBAqk1XaggBAgQIECBAgAABAkUFBKSigsoTIECAAAECBAgQIFAb\nAQGpNl2pIQQIECBAgAABAgQIFBUQkIoKKk+AAAECBAgQIECAQG0EBKTadKWGECBAgAABAgQI\nECBQVEBAKiqoPAECBAgQIECAAAECtREQkGrTlRpCgAABAgQIECBAgEBRAQGpqKDyBAgQIECA\nAAECBAjURkBAqk1XaggBAgQIECBAgAABAkUFBKSigsoTIECAAAECBAgQIFAbAQGpNl2pIQQI\nECBAgAABAgQIFBUQkIoKKk+AAAECBAgQIECAQG0EBKTadKWGECBAgAABAgQIECBQVEBAKiqo\nPAECBAgQIECAAAECtREQkGrTlRpCgAABAgQIECBAgEBRAQGpqKDyBAgQIECAAAECBAjURkBA\nqk1XaggBAgQIECBAgAABAkUFBKSigsoTIECAAAECBAgQIFAbAQGpNl2pIQQIECBAgAABAgQI\nFBUQkIoKKk+AAAECBAgQIECAQG0EBKTadKWGECBAgAABAgQIECBQVEBAKiqoPAECBAgQIECA\nAAECtREQkGrTlRpCgAABAgQIECBAgEBRAQGpqKDyBAgQIECAAAECBAjURkBAqk1XaggBAgQI\nECBAgAABAkUFBKSigsoTIECAAAECBAgQIFAbAQGpNl2pIQQIECBAgAABAgQIFBUQkIoKKk+A\nAAECBAgQIECAQG0EBKTadKWGECBAgAABAgQIECBQVEBAKiqoPAECBAgQIECAAAECtREQkGrT\nlRpCgAABAgQIECBAgEBRAQGpqKDyBAgQIECAAAECBAjURkBAqk1XaggBAgQIECBAgAABAkUF\nBKSigsoTIECAAAECBAgQIFAbAQGpNl2pIQQIECBAgAABAgQIFBUQkIoKKk+AAAECBAgQIECA\nQG0EBKTadKWGECBAgAABAgQIECBQVEBAKiqoPAECBAgQIECAAAECtREQkGrTlRpCgAABAgQI\nECBAgEBRAQGpqKDyBAgQIECAAAECBAjURkBAqk1XaggBAgQIECBAgAABAkUFBKSigsoTIECA\nAAECBAgQIFAbAQGpNl2pIQQIECBAgAABAgQIFBUQkIoKKk+AAAECBAgQIECAQG0EBKTadKWG\nECBAgAABAgQIECBQVEBAKiqoPAECBAgQIECAAAECtREQkGrTlRpCgAABAgQIECBAgEBRAQGp\nqKDyBAgQIECAAAECBAjURkBAqk1XaggBAgQIECBAgAABAkUFBKSigsoTIECAAAECBAgQIFAb\nAQGpNl2pIQQIECBAgAABAgQIFBUQkIoKKk+AAAECBAgQIECAQG0EBKTadKWGECBAgAABAgQI\nECBQVEBAKiqoPAECBAgQIECAAAECtREQkGrTlRpCgAABAgQIECBAgEBRAQGpqKDyBAgQIECA\nAAECBAjURkBAqk1XaggBAgQIECBAgAABAkUFBKSigsoTIECAAAECBAgQIFAbAQGpNl2pIQQI\nECBAgAABAgQIFBUQkIoKKk+AAAECBAgQIECAQG0EBKTadKWGECBAgAABAgQIECBQVEBAKiqo\nPAECBAgQIECAAAECtREQkGrTlRpCgAABAgQIECBAgEBRAQGpqKDyBAgQIECAAAECBAjURkBA\nqk1XaggBAgQIECBAgAABAkUFBKSigsoTIECAAAECBAgQIFAbAQGpNl2pIQQIECBAgAABAgQI\nFBUQkIoKKk+AAAECBAgQIECAQG0EBKTadKWGECBAgAABAgQIECBQVEBAKiqoPAECBAgQIECA\nAAECtREQkGrTlRpCgAABAgQIECBAgEBRAQGpqKDyBAgQIECAAAECBAjURkBAqk1XaggBAgQI\nECBAgAABAkUFBKSigsoTIECAAAECBAgQIFAbAQGpNl2pIQQIECBAgAABAgQIFBUQkIoKKk+A\nAAECBAgQIECAQG0EBKTadKWGECBAgAABAgQIECBQVEBAKiqoPAECBAgQIECAAAECtREQkGrT\nlRpCgAABAgQIECBAgEBRAQGpqKDyBAgQIECAAAECBAjURkBAqk1XaggBAgQIECBAgAABAkUF\nBKSigsoTIECAAAECBAgQIFAbAQGpNl2pIQQIECBAgAABAgQIFBUQkIoKKk+AAAECBAgQIECA\nQG0ERtWmJRpCgACBTgIPv/xK+vMTT6YHXn45zTFyZFp7/vnShxZbNM2ePbYRIECAAAECBHoT\nEJB6k/E6AQLDUmBao5G+e9c96dgHJ6TRI0akydOmpRgqP+2Rf6dv3nFXOn7tNdMGCy4wLNum\n0gQIECBAgMDQC5hiN/TGzkCAwEwUOPC2O9MJEx5O07JzRjiKrfn4mSmvpR2vuT7d8N/n8tf9\nQ4AAAQIECBDoLiAgdRfxnACBYSsQwee0Rx5NU6Y1em3D1GyEae+bbk2N7LeNAAECBAgQINBd\nQEDqLuI5AQLDVuD0bBpdR0dH2/o//Mor6ebnX2i7nx0IECBAgACBWU9AQJr1+lyLCdRW4Jbn\nn0+v92NkaOzIEemuF16srYOGESBAgAABAjMuICDNuJ2SBAhUTKD92NH0Cmez6/ox0FSx1qkO\nAQIECBAgMDMEBKSZoewcBAjMFIE155s3jexH8onFG1aee+6ZUicnIUCAAAECBIaXgIA0vPpL\nbQkQ6ENg52WWbrv4QowyLTfXnGn1LEzZCBAgQIAAAQLdBQSk7iKeEyAwbAXWyELPZ8e9LY3p\nYxRpVPbeMWusNmzbqOIECBAgQIDA0AoISEPr6+gECMxkgUNXfkf64nLj0sjsvLNlN4qNEaOY\ndjdmREdaZOzYdPb66xo9msl94nQECBAgQGA4CYwaTpVVVwIECLQTiGW+D3zHimmXty2dLnzi\nqfTAyy+n2UeOTGvPP1/abNFFsqDk70LtDL1PgAABAgRmZQEBaVbufW0nUGOBJWefPe3+9mVr\n3EJNI0CAAAECBIZCwJ9Sh0LVMQkQIECAAAECBAgQGJYCAtKw7DaVJkCAAAECBAgQIEBgKAQE\npKFQdUwCBAgQIECAAAECBIalgIA0LLtNpQkQIECAAAECBAgQGAoBAWkoVB2TAAECBAgQIECA\nAIFhKSAgDctuU2kCBAgQIECAAAECBIZCQEAaClXHJECAAAECBAgQIEBgWAoISMOy21SaAAEC\nBAgQIECAAIGhEBCQhkLVMQkQIECAAAECBAgQGJYCAtKw7DaVJkCAAAECBAgQIEBgKAQEpKFQ\ndUwCBAgQIECAAAECBIalgIA0LLtNpQkQIECAAAECBAgQGAoBAWkoVB2TAAECBAgQIECAAIFh\nKSAgDctuU2kCBAgQIECAAAECBIZCQEAaClXHJECAAAECBAgQIEBgWAoISMOy21SaAAECBAgQ\nIECAAIGhEBCQhkLVMQkQIECAAAECBAgQGJYCAtKw7DaVJkCAAAECBAgQIEBgKAQEpKFQdUwC\nBAgQIECAAAECBIalwKhhWWuVJkCAAAECBAiUJHDfffel0047LX3pS19KN9xwQ7rwwgvT008/\nnd71rnelL3zhC2n22WfvUrN4/4orrkhRbr755kurrLJK2n333dNcc83V2u+4445LCyywQNpw\nww3TKaeckm688ca0+uqrp09+8pNp6aWXTldffXX6wx/+kCZNmpQ+8YlPpPe85z2po6OjVX7q\n1KnppJNOStddd1165ZVX0pprrpmfY955523t4wEBAv0T6GhkW/92rd9eBxxwQDr88MPz/2jF\nf5BsBAgQIECAAIF2AhF4ttpqq/SZz3wm/frXv05rrLFGevXVV9M999yT1lprrXT99denESPe\nmKSz8847p9/+9rdpxRVXTO985zvTVVddlZ588sm0wgorpNtvvz2NGTMmP926666bP3788cfz\n4DPnnHOm2267LQ9T+++/f9pjjz3Sqquump577rn00EMPpb333jv9/Oc/z8v+5z//SVtuuWUa\nP358fp6VV145/eMf/0gRjqKu8dxGgED/BUyx67+VPQkQIECAAAECLYELLrggDzE33XRTuvvu\nu/MQEyM/l112Wb7P3//+9zwcxR9kIzz98Y9/TBGAYpQpRpMuueSS1rHiwb/+9a/0sY99LD3w\nwAPp1ltvTd/4xjfSHXfckfbdd998BCmOHcdZe+2189GiZuEDDzwwD0dnn312/v4555yTbrnl\n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\n7ktkI0CAAAECBAgQIECAwHAUmKGA1GzofPPNl971rnc1n/pNgAABAgQIECBAgACBYS0w4ID0\n05/+NB111FFtG/3www+33ccOBAgQIECAAAECBAgQqJLAgAPSQgstlFZcccUubXg9W7XnkUce\nSRGK5p9//nzBhi47eEKAAAECBAgQIECAAIFhIDDggPSpT30qxU9PW9zUdfPNN88Xa+jpfa8R\nIECAAAECBAgQIECgygIDDkh9NSYWaTj44IPTPvvsk/bff/800r0g+uLyHgECBAgQIFBzgWnP\nTMxvWv36A/en9Pq0NGLZZdPo92yYRiyxZM1brnkEhq/AoN89cemll85uJP5ivrrd8GVRcwIE\nCBAgQIBAMYEpl16SXvm/r6QpfzovvX7Lzen1229Nr118YXrloK+lyWeekRqNRrET9FD6tdde\nS7/5zW/Svvvumz7/+c+nX/ziF+nxxx/vYc8Zf+mhhx5KhxxySHruuedm/CAVLzllypQ0adKk\nmVrLp556Knd96aWX+nXe3/72t/mtd/q1c4V2iktz4vMTn6OqboMakF555ZX0y1/+Mh85WmaZ\nZaraZvUiQIAAAQIECAypwGuX/z1N+e1pKbthZEpTX3vzXFOnpiwZpdf+cnGactbv33x9EB5F\nYNl4443Tl770pXT//ffnf7COL6JrrbVWuvbaawfhDG8cIr7Yfuc730n//e9/B+2YVTpQtGu1\n1VbLr6+fmfV68sknc9dZISB997vfrXRAGvAUu+OPPz6/B1L3D0z8xSIWaXjmmWfSpz/96TTH\nHHN038VzAgQIECBAgEDtBRovv5wmn3bKG+Got9ZmQem1C/6cRr9vozRi0cV622tAr//xj39M\nN998c3rggQfSYou9ccwYpVp77bXzSyAuu+yyAR1vVt05guY999wzqzZ/yNs9ZsyYFLmhytuA\nR5BiyPHl7H/43X9iuOyd73xn+v73v58P51a50epGgAABAgQIEBgqgak335iPErU9/shRaeo1\nV7fdrb87TJgwIS2wwAIpVhxubh0dHfntWd7//vc3X8p/R5Dafffd02abbZa+/OUvd5mGd8wx\nx6QLLrggxa1dttpqq/S1r30t3XXXXV3Kt3vywgsvpG984xtpiy22SLvsskv661//2ioSX47j\n3LG414EHHpgv8LX33nunJ554orVPfx6ceuqp+bFj8bAIh1NjdG761lf7rrnmmvS9730vjR8/\nPn32s59NW265ZTriiCNSfJeN77df//rX86NE/S+99NLmIdMpp5ySdtxxx/SRj3wk/exnP2ud\nb/LkyXl7rr/++vSxj30sHXDAAdnAYTZymG29lYn34jt1WH/0ox9NX/jCF9K///3veHlAW5zn\nyCOPTB/60IfyKZXNYBdt2WuvvdI///nPLsc7++yz0+GHH56/dtNNN6XddtstfeADH8jrf911\n17X27c9noC/jONDEiRPTD3/4w7T11lvn/XzDDTfkx49+iv6/++67W+fryykCa6xxEJ/Vj3/8\n4+mEE04YkumprcpkDwYckAL7tttue8tPIP3jH//IP1RGjzoTe0yAAAECBAjMSgLT4pqf6V+Q\n+2x3NvXu9Ucf6XOXgbwZX86fffbZfJrdcccd15rC9N73vjcddNBBrUP97W9/S+uvv36KqVw7\n7LBDPv0uppQ1r1W65JJL8tlAZ555Ztppp53S7bffnjbZZJP02GOPtY7R14MIGTFqddFFF+Vf\n/keNGpUHrQg0scWX9/iSG8EkrruJwBEBKr4A93f79re/nS8Ktvjii6d11lknn1YY11vF1q59\n9913Xx4qIrjFtfPrrbde7hOhKeq6+uqr58dZddVVWyNxcU1XLEC2wgorpA022CD9+Mc/Tttv\nv32+XwS+aM8nPvGJNHbs2PzarBEjRuTXgfVWJgrGd+qYahbHi7C0884758cbyD8nn3xyHsIi\nZEU4ete73pVPr4yF0mLKXoTczltMjYwt3GM65myzzZaHlQjS73nPe1qhpd1noJ1xfAYitEWf\nR0iOEBnHj+mZEerCq/l56ss26vrJT34y/f3vf899o31f/epX8+AV7w3Zlg29zrJbBhxXRzau\nuOKKWdZAwwkQIECAAIHBFZh09lmNFz/zqcaLn/pE259Xf/WLQT15NorRyEaLGtkX/fw7zrLL\nLtv41re+1ci+gLfOs+aaaza23Xbb1vN4EK9lX9jz1z784Q835plnnkb2xb+1z3LLLdf44he/\nmD/Pwkx+7GwEqPV+5wfZbKLGnHPO2cj+8t96OV5bdNFFG9mX48arr76al//mN7/Zej8bqclf\ny0Ja67XeHsQ+8f3t8ssvb+3yhz/8oZEFlPz47dqXjVbk5W+99dZW+T322KOx4YYb5s+jXXH8\nLHDkz+N3Fnga2aIIrf2zkJXvkw0ONLLFyfLH2WhY6/12ZW655ZZGFkoad9xxR6tMNoqVHycb\n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\nyVeqGz9+fLrzzjvT//3f/6V4vPXWW+cLNMSNqWwECBAgQIAAAQIECBAYbgIzFJA6N/J//ud/\n8vsfXX/99elzn/tcevLJJ9Phhx/eeRePCRAgQIAAAQIECBAgMCwECq1i99JLL6UA/t/KAABA\nAElEQVSzzz47nXbaaelvf/tbimW/N99887TbbrsNi8arJAECBAgQIECAAAECBDoLDDggxTVG\nl1xySR6K/vSnP6VXXnklLb/88umQQw5Ju+66a1pqqaU6H99jAgQIECBAgAABAgQIDBuBAQek\n7373u3kYmnPOOdOOO+6Yjxa9733vGzYNVlECBAgQIECAAAECBAj0JjDggLTyyiunE088MQ9H\nc801V2/H9ToBAgQIECBAYJYX+OvT/0knPvRwuvX5F9Lr2aUI75h7rvSpty2dtlli8dTR0THo\nPq+99lr67W9/m2688cY0adKktNpqq6Vtt902X3F4sE720EMPpVNOOSVfsGu++eYbrMNW6jhT\npkxJ06ZNS7PNNttMq9dTTz2Vjj322LT//vun4fgde/LkyemHP/xh+sxnPpMv2nbqqafmC7vF\n5TfDbRvwIg0xahQNH44dN9w6R30JECBAgACB4SkQYeiLN96SPnX9jelv/5mYJmZfuP+bhZer\nn/1v2ufm29L211yfXs4uWxjM7bnnnksbb7xx+tKXvpTuv//+9OKLL+azfuLelddee+2gnSoC\n0ne+85303//+d9COWaUDRbsiWD7yyCMztVqx0Fm4xjX+w3GLQB71f/TRR/PqR0C6+OKLh2NT\n0oBHkIZlK1WaAAECBAgQIDATBQ676550fvaFN4JS9+217LXrsy/he990azrpXWt1f3uGn//x\nj39MN998c3rggQfSYostlh8nFtBae+2108EHH5wuu+yyGT72rFQwguY999wzKzVZW7sJDHgE\nqVt5TwkQIECAAAECBDoJPP7qpHTcgxPSlGlvDUfN3eK9S556Ot3w3+eaLxX+PWHChLTAAguk\nhRZaqHWsmMZ31FFHpfe///2t1+JBBKndd989bbbZZunLX/5yevzxx1vvH3PMMemCCy5IP/3p\nT9NWW22Vvva1r6W77rqr9X5/HrzwwgvpG9/4Rtpiiy3SLrvskv7617+2isU0wDj3gw8+mA48\n8MB8BeS99947PfHEE619+vMgRiji2J/61KdShMNYSKy59dW+a665Jn3ve9/L7+H52c9+Nm25\n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\nQIAAAQIECBAgQKA8AQGpPHtnJkCAAAECBAgQIECgYgICUsU6RHUIECBAgAABAgQIEChPQEAq\nz96ZCRAgQIAAAQIECBComICAVLEOUR0CBAgQIECAAAECBMoTEJDKs3dmAgQIECBAgAABAgQq\nJiAgVaxDVIcAAQIECBAgQIAAgfIEBKTy7J2ZAAECBAgQIECAAIGKCQhIFesQ1SFAgAABAgQI\nECBAoDwBAak8e2cmQIAAAQIECBAgQKBiAgJSxTpEdQgQIECAAAECBAgQKE9AQCrP3pkJECBA\ngAABAgQIEKiYgIBUsQ5RHQIECBAgQIAAAQIEyhMQkMqzd2YCBAgQIECAAAECBComICBVrENU\nhwABAgQIECBAgACB8gQEpPLsnZkAAQIECBAgQIAAgYoJCEgV6xDVIUCAAAECBAgQIECgPAEB\nqTx7ZyZAgAABAgQIECBAoGICAlLFOkR1CBAgQIAAAQIECBAoT0BAKs/emQkQIECAAAECBAgQ\nqJjAqIrVp1WdRx55JF111VVpgQUWSBtssEGaa665Wu91f3D//fenBx98sMvLUW6dddbp8pon\nBAgQIECAAAECBAgQ6EugkgHp1FNPTSeccELaaKON0uOPP57i+dFHH53mn3/+HttyxhlnpCuv\nvDLNPffcrfdXXXVVAaml4QEBAgQIECBAgAABAv0RqFxAipGjk046KR111FFpjTXWSFOnTk17\n7rlnOvPMM/PfPTXq3nvvTbvvvnvafvvte3rbawQIECBAgAABAgQIEOiXQOWuQbruuuvSEkss\nkYejaMGoUaPSFltskS699NIeGzR58uQUoWqllVbq8X0vEiBAgAABAgQIECBAoL8ClRtBeuKJ\nJ9KSSy7Zpf4RmCZOnJimTZuWRozomukeeuih/PVrrrkmHXnkkemll15Km2yySdptt93S2LFj\nuxzntttuS5/+9Kdbr02aNKnPa5taO3pAgAABAgQIECBAgMAsIVC5gPTkk0+meeaZpwt+XFsU\n4ej5559/y3VI9913X75vjCTttddeafz48emcc85Jzz77bDrooIO6HGf06NFpkUUWab329NNP\np0aj0XruAQECBAgQIECAAAECs7ZAqQHp/PPPz0d8ml2wzTbbpAgxcd1R5635fI455uj8cv54\ns802yxdjWHzxxfPna621Vho5cmQ6+eST0957790lbL3jHe9IF110UesYBxxwQLrxxhtbzz0g\nQIAAAQIECBAgQGDWFig1IF122WUpRnGaW1xrtNBCC6UJEyY0X8p/v/DCC/nIUfcpc/FmvNYM\nR81C6623Xh6QehqNau7jNwECBAgQIECAAAECBLoLlBqQ4pqh7tu4cePSxRdfnI8ixQINsd1x\nxx1vuS6pWe6ss85K119/ffrRj37UfCndcsstqaOj4y3BqbWDBwQIECBAgAABAgQIEOhBoOuK\nBz3sMLNf2nTTTfNTnn766fl1R3ED2AsvvDDtsssurarEexGaYoubyF577bXpvPPOy0PVDTfc\nkD+O0ajO90VqFfaAAAECBAgQIECAAAECvQhULiDFlLnDDjssX2ghQs5XvvKVtN122+VBqNmG\nY489Nt18883501jhLhZnOOaYY9Lmm2+e9t9//3yJ8PhtI0CAAAECBAgQIECAwEAESp1i11tF\n11xzzXTuueemp556Ki288MJvWdr7iiuu6FJ0hx12SNtuu21+PVNcwzRmzJgu73tCgAABAgQI\nECBAgACB/ghUMiA1K77ooos2H7b9HdcrxWiSjQABAgQIECBAgAABAjMqULkpdjPaEOUIECBA\ngAABAgQIECBQVEBAKiqoPAECBAgQIECAAAECtREQkGrTlRpCgAABAgQIECBAgEBRAQGpqKDy\nBAgQIECAAAECBAjURkBAqk1XaggBAgQIECBAgAABAkUFBKSigsoTIECAAAECBAgQIFAbAQGp\nNl2pIQQIECBAgAABAgQIFBUQkIoKKk+AAAECBAgQIECAQG0EBKTadKWGECBAgAABAgQIECBQ\nVEBAKiqoPAECBAgQIECAAAECtREQkGrTlRpCgAABAgQIECBAgEBRAQGpqKDyBAgQIECAAAEC\nBAjURkBAqk1XaggBAgQIECBAgAABAkUFBKSigsoTIECAAAECBAgQIFAbAQGpNl2pIQQIECBA\ngAABAgQIFBUQkIoKKk+AAAECBAgQIECAQG0EBKTadKWGECBAgAABAgQIECBQVEBAKiqoPAEC\nBAgQIECAAAECtREQkGrTlRpCgAABAgQIECBAgEBRAQGpqKDyBAgQIECAAAECBAjURkBAqk1X\naggBAgQIECBAgAABAkUFBKSigsoTIECAAAECBAgQIFAbAQGpNl2pIQQIECBAgAABAgQIFBUQ\nkIoKKk+AAAECBAgQIECAQG0EBKTadKWGECBAgAABAgQIECBQVEBAKiqoPAECBAgQIECAAAEC\n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\nAQI9JTC8p0qjMI0VWHGWmcuNa69e/vTc8+Uv//xne9rdlGWJmWYs87WDJokAAQIECBAgQIBA\nrwgIkHqlJYZIORYbOWPJl0SAAAECBAgQIECgFwVMsevFVlEmAgQIECBAgAABAgS6IiBA6gq7\ngxIgQIAAAQIECBAg0IsCAqRebBVlIkCAAAECBAgQIECgKwICpK6wOygBAgQIECBAgAABAr0o\nIEDqxVZRJgIECBAgQIAAAQIEuiIgQOoKu4MSIECAAAECBAgQINCLAgKkXmwVZSJAgAABAgQI\nECBAoCsCAqSusDsoAQIECBAgQIAAAQK9KCBA6sVWUSYCBAgQIECAAAECBLoiIEDqCruDEiBA\ngAABAgQIECDQiwICpF5sFWUiQIAAAQIECBAgQKArAgKkrrA7KAECBAgQIECAAAECvSggQOrF\nVlEmAgQIECBAgAABAgS6IiBA6gq7gxIgQIAAAQIECBAg0IsCAqRebBVlIkCAAAECBAgQIECg\nKwICpK6wOygBAgQIECBAgAABAr0oIEDqxVZRJgIECBAgQIAAAQIEuiIgQOoKu4MSIECAAAEC\nBAgQINCLAgKkXmwVZSJAgAABAgQIECBAoCsCAqSusDsoAQIECBAgQIAAAQK9KCBA6sVWUSYC\nBAgQIECAAAECBLoiIEDqCruDEiBAgAABAgQIECDQiwICpF5sFWUiQIAAAQIECBAgQKArAgKk\nrrA7KAECBAgQIECAAAECvSggQOrFVlEmAgQIECBAgAABAgS6IiBA6gq7gxIgQIAAAQIECBAg\n0IsCAqRebBVlIkCAAAECBAgQIECgKwLDu3LUHjvoHnvsUUaOHNljpVIcAgQIECBAYFIEjjzy\nyLLssstOyqa2IUCAwEQFhnSAdMABB5S77767XHLJJROFssHbJzD//POXl156qTz22GNv307t\nicB4BKaccsoy33zzlTFjxpTRo0ePZwsvEXj7BEaMGFHmnnvu8sILL5Snnnrq7duxPU1U4Nln\nn53oNjYgQIDApApM0WqnSd24idu98cYbJV/SwAksuuiiZfHFFy9nn332wB3UkYakwDPPPFNW\nW221suaaa5bjjjtuSBqo9MAJ3HfffWXTTTctW2yxRTn44IMH7sCOVIYNG1ammGIKEgQIEHhb\nBIb0CFIEc4U5X9LACuQfsuHDh3z3G1j0IXi0Th/T34Zg43ehyjlJT8q/KZ2+14ViOCQBAgQI\n1BQQGdQElJ0AAQIECBAgQIAAgeYIuITfnLYcNDVZZ511yqhRowZNeRV08Ar8z//8T1l77bXL\nEkssMXgroeSDRmD66aev+tt73/veQVNmBSVAgACBNwsM+XuQ3kziFQIECBAgQIAAAQIEhqqA\nKXZDteXVmwABAgQIECBAgACBNwkIkN5E4gUCBAgQIECAAAECBIaqgABpqLb8ANb71VdfLS+/\n/PIAHtGhhrrA66+/Xk499dTy97//vTbFPffcY0n62oq9vYO3o79cffXV5de//vUkVfT+++8v\nZ5111iRtayMCBAgQGHgBAdLAmw+pI+aBiTvssIOHdA6pVu9+ZfNss9NPP/1teRhxAqRzzjmn\n+5VSgskm8Hb0l1/+8pflxhtvnKQyPvDAA4LuSZKyEQECBLojYBW77rgPmaMmQHrkkUeGTH1V\ntDcERowYUa699treKIxS9LzA29FfDj300Emu53rrrVfyJREgQIBAbwoM+2o79WbRlKpXBO69\n995y4oknlvPPP7/ccccdZZZZZimzzTZbX/H+8pe/lFNOOaVccMEFJVfbF1xwwTLttNOWF198\nsRx11FHlr3/9a/nHP/5RsgTuXHPNVZ555plq+tNPfvKTcvPNN5epp566zD333H37m9jxMo0l\n01NSnj/84Q8lSzn3z9+3I7/0jMCdd95ZzjzzzLLCCiuM9WDm9I/pppuuzD777OVf//pX+dGP\nflR+/OMfl5tuuql6fc4556zqkH531VVXlaeeeqqccMIJJQ/knH/++ctll11W9aXLL7+85Kr8\nwgsvXKaaaqry2muvlcMPP7zMM888ZaaZZqr2cffdd1dX7S+88MLy3HPPlTnmmKNMM8001XsT\n6pPp07fddlvZZpttqm0zHetnP/tZNUJ15ZVXlqeffrpkWec8HPSVV14p3/nOd8o73vGOcuSR\nR1b/Pyy77LIlD6qVuieQdjniiCOqz620TSel39x6663lPe95z1j95bzzziu5uHPRRReVbLPA\nAgtUfeXiiy+u2j2fW+lb+VxM3vTh9KuHH364+vxLf0/fzGfbySefXJIvfex973tf1U/yfj7/\nVlpppU5RquPktRtuuKFkRCufaZ2HmPvM62PyCwECBAZEwBS7AWEevAfJP+qf/vSnqyBk4403\nrk709thjj/LQQw9VlUqAsttuu1XB0FprrVXuuuuuakpdTmRzEptgKSknGAmsctKx4447VlNR\n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\nizKh42UEYvfdd6+Wdc6yuSlLArRMscoVfan3BbLAR1Y2TNt1VjhMqROoZEQn9wVlVbgERbm6\n31mVbnw1yyhi2j2rKHYWZthrr72qleWy//5p++23L1nkISseph9lOfBcnc80qNx0P6E+2X8/\nmQp12GGHVf8vbLvtttW+skJjAvWMpOb/Bam3BbJYw7HHHlutgjmpJc3nVFaWy8Ig6TdZbS6j\n6tlP+kSdlP6YQD8j4fnszPTNBGQ777xz1b985tXRlZcAAQL/ncAU7Suvb54U/d/tS66GC+R5\nL5l3P74TgixvnCv4uW9kfCknjsmXE42kdLtcfc+JRk4QxpcmdLzkHfeegPHtw2uDTyCLM+Tq\n+VuNHI1bo4wmJk/63rhTOsfdNoFURjLTd8ZNk9In++fJfSk5XqZqSc0WyKhOnueWYLrTx26/\n/fbqgk+edzSx+5EmVScr36XfZ1rouMln3rgi/iZAgMDkExAgTT5beyZAgACBBghkymfuV8u9\nlnmswOjRo6vRpATHeTCwRIAAAQLNEhAgNas91YYAAQIEJoNAFhfJ1N4sHJKpw5kCmimb4xvt\nmQyHt0sCBAgQGEABAdIAYjsUAQIECAxugUzT7CwoM7hrovQECBAg8FYCAqS3kvE6AQIECBAg\nQIAAAQJDTsAy30OuyVWYAAECBAgQIECAAIG3EhAgvZWM1wkQIECAAAECBAgQGHIC419fecgx\nqDABAgMlkBXBskRyljNeYoklqiW9B+rYEzpOHjyc1clmm202N95PCMp7BAgQIECg4QJGkBre\nwKpHoFcE7r///rLMMstUAci6665b1lhjjTLzzDNXr/XCg36vvfbaMmrUqHLppZf2CplyECBA\ngAABAl0QMILUBXSHJDDUBB566KFqWeRpppmmHHvssdXIUUaSrrjiinL++eeXFVZYodxwww1l\nscUW6xrNrLPOWtZbb70y++yzd60MDkyAAAECBAh0X8Aqdt1vAyUg0HiB733ve2WfffYp55xz\nTtlqq63Gqu/pp59edthhh+qZMt/+9rfHes8fBAgQIECAAIGBFjCCNNDijkdgCAp0ptAtvvji\nb6r9xz72sfKLX/yijBw5su+9k046qfp7xRVXLKeeempJ/tVXX71ssskmZa655urbrvNLHt55\n7rnnlrvvvrvMO++85UMf+lBZe+21O2/3/cx2GbW65ZZbyvvf//6y6aabVttng/vuu6+cccYZ\nZeutty6LLLJIX57XXnutnHbaaeWmm24qY8aMKUsvvXTZZZddxirvG2+8US666KJy+eWXl2ee\neaYsvPDCZaONNiqrrbZa3378QoAAAQIECAwSgZZEgACBySxwwQUXtNofia12wNC68cYbW+2A\nYoJHXH755VtLLrlk613veldr1VVXbe20007V77PMMkvrgQceGCvvCSec0Go/uLP62njjjVvt\n+5yqY+27775jbffTn/60NWzYsNYCCyzQ+shHPtKaY445qu3OO++8arvLLrtsrL/z4hNPPNFa\nbrnlqtfbQU/rwx/+cGummWZqzTfffK0777yzb/977bVXa4oppmi1A8DWlltu2Zpzzjmrv484\n4oi+bfxCgAABAgQIDA6BMjiKqZQECAxmgQREBxxwQBVoJFBqrxTX2mabbVoJbh599NE3VS0B\nUrbrH+Q8/vjjrXnmmae11FJL9QVY7ZGlKjBaa621Wk8++WTffg488MAq/9VXX1299qc//anV\nvv+p1R4xar388svVa+2RoVZ7hKo1//zzt9or2LXGFyDtuOOO1X4uvPDCvn2376eqgrUEe0nP\nP/98FXjtsccefdu8/vrrVbDUvp+pleNIBAgQIECAwOARsIrdIBnpU0wCg1mgPbpSDj300HLd\nddeVnXfeuWSxhrPPPrvstttupR30lP3226+0g4qxqpgV7r761a/2vZbFEz772c+W2267rWRF\nvKTjjz++vPLKK2X//fcvWWShkz73uc9Vy4gfd9xx1UuZVvfiiy+Www8/vLRHm6rX2qNJpR2g\nlXYQVtpBTidr389nn322mlqXqXibbbZZ3+uZwpdpgVlU4o477qhen3LKKUt7RKk89thjfX+n\nrg8++GDJcSQCBAgQIEBg8Ai4B2nwtJWSEhj0ArmPKF9JuefnqquuKkcddVQVuDz88MNV0NSp\n5KKLLlqmm266zp/Vzzw3KenWW28tCy64YLnnnntKgq/cs3TKKadU73W+TTvttOXee++t/kxQ\nlX0ttNBCnbern+3RqJKv8aXc99S+1lUFT+MuLPG3v/2typL9p0wJ3LLARO6PylLmG264YWlP\nxyvLLrvs+HbtNQIECBAgQKCHBYwg9XDjKBqBJgjkAaxXXnllyQIJ/VMCnN13370aEcpiBu1p\nbGON5LTv9em/efV7gp6k5557rvqZpcKnmmqqMxgVHwAABGpJREFUMnz48JJRnP5fG2ywQVlp\npZWq7drT+Mr0009f/T6p37LvpIx29d9vfs8oUhZzmGGGGaptDjvssOr5SRlZSqB3yCGHVMua\nZ3W+LPIgESBAgAABAoNHwAjS4GkrJSUwKAUyxSwjMFn97ZprrnlTHaaeeuqy/vrrV1PWMiWt\nM0rUGaXpnyHPU0rKKE1Se8GFanW5gw8+uFo5rnrx398SmCRwSmrfZ1TyINhXX321mnr3701K\n+76mcvHFF5d11lmn81Lfz+w7KSvSnXXWWX2v55dMB+w/dS5/pw4ZOcqo0+9///tq6l6WMN9+\n++3Hu/+xdugPAgQIECBAoGcEjCD1TFMoCIFmCowYMaIKHK6//vpy5plnvqmSL7zwQrVEdnvF\nutJ/GfDc35Nlu/unBBwZ0ek8UHaVVVap3s7r/VPyZsRo7733rl7OfURZiru9Yl3/zarpfbkP\nanzBWAKk9kp3VdnGvUdp2223LRnhSsDWmb6XZz0lZcpfe5GJsueee1Z/JwiTCBAgQIAAgcEj\nYARp8LSVkhIYtAJZbOHmm28u2223XRUkrbzyytXiDLmHJw+PfeSRR8rJJ59cBRedSiagyXOK\njj766JLg6cQTT6yeM5TRnM5CC7vuumu1UMORRx5Z2ivjlXXXXbfcfvvt1RS3BEgHHXRQtbtM\ndUsAk6AlizpkBOrSSy+t8raXEa+eV5T7ofqnBHZZ1CFlzv1EX/nKV0qm+GVxiZT5S1/6Umkv\n9119ZQTqW9/6VjWqlOcv3XXXXdWiFClDRpUkAgQIECBAYBAJDJ4F95SUAIHBLPD0009XS3vP\nPffc1dLZ7Y/Jaonu9kIGrc5y3J36ZZnv9sNaW+0RoFZ7mly1fZ5fdMwxx3Q26fuZZxXluUad\n7bLf9mIMrfZ9T33b5JcsE55lvtv3EPUdf/PNN2+NHj262m58y3znjXYwVD3XKPvNV46T5b87\ny4Vnm/ZiEdWS4Z1t8kykLEee5cUlAgQIECBAYHAJTJHitv9RlwgQIDBgAllCO9PasqpcFlkY\nN62wwgqlHYBUo0Fjxoyp7hXq3BM07radvzMylJXxRo4cWdoPah1rNKqzTX5mue/2w2ZLO1Cr\ntu3/3oR+z1S5dpBXRo0a9abV9Tr5srBDlvrONp0FHDrv+UmAAAECBAgMDgEB0uBoJ6UkMKQE\n+gdIQ6riKkuAAAECBAh0XcAiDV1vAgUgQIAAAQIECBAgQKBXBCzS0CstoRwECPQJ5BlGnh/U\nx+EXAgQIECBAYAAFTLEbQGyHIkCAAAECBAgQIECgtwVMsevt9lE6AgQIECBAgAABAgQGUECA\nNIDYDkWAAAECBAgQIECAQG8LCJB6u32UjgABAgQIECBAgACBARQQIA0gtkMRIECAAAECBAgQ\nINDbAgKk3m4fpSNAgAABAgQIECBAYAAFBEgDiO1QBAgQIECAAAECBAj0toAAqbfbR+kIECBA\ngAABAgQIEBhAAQHSAGI7FAECBAgQIECAAAECvS3wv4Hs6lEO3eRCAAAAAElFTkSuQmCC", "text/plain": [ "plot without title" ] }, "metadata": { "image/png": { "height": 420, "width": 420 } }, "output_type": "display_data" } ], "source": [ "dat_centered %>% \n", " pivot_longer(c(SepLen_centered_overall, SepLen_centered_byspecies)) %>% \n", " ggplot(aes(Species, value, color=name)) +\n", " stat_summary(geom='point',fun=mean, size = 2.5) +\n", " theme_classic()" ] }, { "cell_type": "markdown", "metadata": { "id": "NB9JgDMR0ZAc" }, "source": [ "This plot makes sense, because if you're calculating `SepLen_centering_byspecies` by subtracting the species mean from each `Sepal.Length` value, the mean of the new values should be 0 for every species. Meanwhile, the `SepLen_centering_overall` values were calculated by subtracting the same amount from all `Sepal.Length` values, regardless of species, so we still see variation for these means across species.\n", "\n", "There are a lot of other handy uses for `group_by`, which will be covered in future tutorials. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## `nest()`: Explicitly group data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Whereas `group_by()` implicitly groups data, `nest()` **explicitly** groups data. That is, it takes the subset of data associated with a certain grouping, and *nests* it within a single cell. That's right, it puts a whole data frame (ok technically a tibble) in a single cell.\n", "\n", "Replicating our example from above:" ] }, { "cell_type": "code", "execution_count": 176, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
A data.frame: 6 × 6
Sepal.LengthSepal.WidthPetal.LengthPetal.WidthSpeciesPetalType
<dbl><dbl><dbl><dbl><fct><chr>
15.13.51.40.2setosashort
24.93.01.40.2setosashort
34.73.21.30.2setosashort
44.63.11.50.2setosashort
55.03.61.40.2setosashort
65.43.91.70.4setosashort
\n" ], "text/latex": [ "A data.frame: 6 × 6\n", "\\begin{tabular}{r|llllll}\n", " & Sepal.Length & Sepal.Width & Petal.Length & Petal.Width & Species & PetalType\\\\\n", " & & & & & & \\\\\n", "\\hline\n", "\t1 & 5.1 & 3.5 & 1.4 & 0.2 & setosa & short\\\\\n", "\t2 & 4.9 & 3.0 & 1.4 & 0.2 & setosa & short\\\\\n", "\t3 & 4.7 & 3.2 & 1.3 & 0.2 & setosa & short\\\\\n", "\t4 & 4.6 & 3.1 & 1.5 & 0.2 & setosa & short\\\\\n", "\t5 & 5.0 & 3.6 & 1.4 & 0.2 & setosa & short\\\\\n", "\t6 & 5.4 & 3.9 & 1.7 & 0.4 & setosa & short\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "A data.frame: 6 × 6\n", "\n", "| | Sepal.Length <dbl> | Sepal.Width <dbl> | Petal.Length <dbl> | Petal.Width <dbl> | Species <fct> | PetalType <chr> |\n", "|---|---|---|---|---|---|---|\n", "| 1 | 5.1 | 3.5 | 1.4 | 0.2 | setosa | short |\n", "| 2 | 4.9 | 3.0 | 1.4 | 0.2 | setosa | short |\n", "| 3 | 4.7 | 3.2 | 1.3 | 0.2 | setosa | short |\n", "| 4 | 4.6 | 3.1 | 1.5 | 0.2 | setosa | short |\n", "| 5 | 5.0 | 3.6 | 1.4 | 0.2 | setosa | short |\n", "| 6 | 5.4 | 3.9 | 1.7 | 0.4 | setosa | short |\n", "\n" ], "text/plain": [ " Sepal.Length Sepal.Width Petal.Length Petal.Width Species PetalType\n", "1 5.1 3.5 1.4 0.2 setosa short \n", "2 4.9 3.0 1.4 0.2 setosa short \n", "3 4.7 3.2 1.3 0.2 setosa short \n", "4 4.6 3.1 1.5 0.2 setosa short \n", "5 5.0 3.6 1.4 0.2 setosa short \n", "6 5.4 3.9 1.7 0.4 setosa short " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#Initial dataframe\n", "nested <- dat %>% \n", " select(c(Sepal.Length:Petal.Width, Species, PetalType))\n", "head(nested)" ] }, { "cell_type": "code", "execution_count": 177, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[90m# A tibble: 3 × 2\u001b[39m\n", " Species data \n", " \u001b[3m\u001b[90m\u001b[39m\u001b[23m \u001b[3m\u001b[90m\u001b[39m\u001b[23m \n", "\u001b[90m1\u001b[39m setosa \u001b[90m\u001b[39m\n", "\u001b[90m2\u001b[39m versicolor \u001b[90m\u001b[39m\n", "\u001b[90m3\u001b[39m virginica \u001b[90m\u001b[39m\n" ] } ], "source": [ "#nesting\n", "nested %>% \n", " nest(data = c(Sepal.Length:Petal.Width, PetalType)) %>% \n", " print" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this example, we had to specify in the `data =` argument which columns we wanted to nest. Because we **left out** \"Species\", this became our grouping variable, with all other data getting nested under the new `data` column.\n", "\n", "Now in the `data` column we have a 50 x 5 tibble for each species of iris. Let's see what's really in cell [1, 2]:" ] }, { "cell_type": "code", "execution_count": 178, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
A tibble: 6 × 5
Sepal.LengthSepal.WidthPetal.LengthPetal.WidthPetalType
<dbl><dbl><dbl><dbl><chr>
5.13.51.40.2short
4.93.01.40.2short
4.73.21.30.2short
4.63.11.50.2short
5.03.61.40.2short
5.43.91.70.4short
\n" ], "text/latex": [ "A tibble: 6 × 5\n", "\\begin{tabular}{lllll}\n", " Sepal.Length & Sepal.Width & Petal.Length & Petal.Width & PetalType\\\\\n", " & & & & \\\\\n", "\\hline\n", "\t 5.1 & 3.5 & 1.4 & 0.2 & short\\\\\n", "\t 4.9 & 3.0 & 1.4 & 0.2 & short\\\\\n", "\t 4.7 & 3.2 & 1.3 & 0.2 & short\\\\\n", "\t 4.6 & 3.1 & 1.5 & 0.2 & short\\\\\n", "\t 5.0 & 3.6 & 1.4 & 0.2 & short\\\\\n", "\t 5.4 & 3.9 & 1.7 & 0.4 & short\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "A tibble: 6 × 5\n", "\n", "| Sepal.Length <dbl> | Sepal.Width <dbl> | Petal.Length <dbl> | Petal.Width <dbl> | PetalType <chr> |\n", "|---|---|---|---|---|\n", "| 5.1 | 3.5 | 1.4 | 0.2 | short |\n", "| 4.9 | 3.0 | 1.4 | 0.2 | short |\n", "| 4.7 | 3.2 | 1.3 | 0.2 | short |\n", "| 4.6 | 3.1 | 1.5 | 0.2 | short |\n", "| 5.0 | 3.6 | 1.4 | 0.2 | short |\n", "| 5.4 | 3.9 | 1.7 | 0.4 | short |\n", "\n" ], "text/plain": [ " Sepal.Length Sepal.Width Petal.Length Petal.Width PetalType\n", "1 5.1 3.5 1.4 0.2 short \n", "2 4.9 3.0 1.4 0.2 short \n", "3 4.7 3.2 1.3 0.2 short \n", "4 4.6 3.1 1.5 0.2 short \n", "5 5.0 3.6 1.4 0.2 short \n", "6 5.4 3.9 1.7 0.4 short " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "nested %>% \n", " nest(data = c(Sepal.Length:Petal.Width, PetalType)) %>% \n", " pull(data) %>% #tidyverse version of $ -- selecting data column\n", " first() %>% #pulling first row\n", " head() #just top 6 lines" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So we can see that a whole other tibble is comfortably waiting for us in a single cell!\n", "\n", "If we leave out both \"Species\" and \"PetalType\" from the `data = ` argument, we get more nests. This is analogous to grouping by multiple variables:" ] }, { "cell_type": "code", "execution_count": 179, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[90m# A tibble: 4 × 3\u001b[39m\n", " Species PetalType data \n", " \u001b[3m\u001b[90m\u001b[39m\u001b[23m \u001b[3m\u001b[90m\u001b[39m\u001b[23m \u001b[3m\u001b[90m\u001b[39m\u001b[23m \n", "\u001b[90m1\u001b[39m setosa short \u001b[90m\u001b[39m\n", "\u001b[90m2\u001b[39m versicolor long \u001b[90m\u001b[39m\n", "\u001b[90m3\u001b[39m versicolor short \u001b[90m\u001b[39m \n", "\u001b[90m4\u001b[39m virginica long \u001b[90m\u001b[39m\n" ] } ], "source": [ "nested %>% \n", " nest(data = c(Sepal.Length:Petal.Width)) %>% #re-nesting with different variables\n", " print()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can even combine `group_by()` with `nest()` to streamline the variable selection. The below will nest all variables **aside from** the `group_by()` variable:" ] }, { "cell_type": "code", "execution_count": 180, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[90m# A tibble: 3 × 2\u001b[39m\n", "\u001b[90m# Groups: Species [3]\u001b[39m\n", " Species data \n", " \u001b[3m\u001b[90m\u001b[39m\u001b[23m \u001b[3m\u001b[90m\u001b[39m\u001b[23m \n", "\u001b[90m1\u001b[39m setosa \u001b[90m\u001b[39m\n", "\u001b[90m2\u001b[39m versicolor \u001b[90m\u001b[39m\n", "\u001b[90m3\u001b[39m virginica \u001b[90m\u001b[39m\n" ] } ], "source": [ "nested %>% \n", " group_by(Species) %>% \n", " nest() %>% \n", " print()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that any variables supplied to the `nest()` function above would override the `group_by()` variables.\n", "\n", "So what is the difference between using `group_by()` versus `nest()`? For most of your operations, `group_by()` will probably be your go-to. However, `nest()` comes into play when the operations you need to perform over each group require a data frame as input (e.g., models). We'll see some examples of this below with `map()`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## `map()`: Perform same function on each element of list or vector" ] }, { "cell_type": "markdown", "metadata": { "id": "2VrX-f-A0ZAk" }, "source": [ "`map()` works by applying a given function across different elements of a list or vector. If you are familiar with `for` loops, this is conceptually similar to looping a function over, e.g., lines of data. However, `map()` is *vectorized*. This is a fancy way of saying it's implemented using a lower-level programming language. This makes it more efficient than loops.\n", "\n", "(Note: `map` operates basically the same as the `*apply` family of functions (e.g., `lapply()`, `sapply`, etc.) but since `map` is part of the tidyverse, it plays better with tidyverse grammar and is more standardized.)\n", "\n", "`map()` and `nest()` work really well together. Here, we'll use them to fit a model for different subgroups and then extract the results of all our models. \n", "\n", "We'll use our nested data frame from above, with both Species and PetalType as nesting factors:" ] }, { "cell_type": "code", "execution_count": 181, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[90m# A tibble: 4 × 3\u001b[39m\n", "\u001b[90m# Groups: Species, PetalType [4]\u001b[39m\n", " Species PetalType data \n", " \u001b[3m\u001b[90m\u001b[39m\u001b[23m \u001b[3m\u001b[90m\u001b[39m\u001b[23m \u001b[3m\u001b[90m\u001b[39m\u001b[23m \n", "\u001b[90m1\u001b[39m setosa short \u001b[90m\u001b[39m\n", "\u001b[90m2\u001b[39m versicolor long \u001b[90m\u001b[39m\n", "\u001b[90m3\u001b[39m versicolor short \u001b[90m\u001b[39m \n", "\u001b[90m4\u001b[39m virginica long \u001b[90m\u001b[39m\n" ] } ], "source": [ "nested <- nested %>% \n", " group_by(Species, PetalType) %>% \n", " nest() %>% \n", " print()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`map` takes the form:\n", "```\n", "map(data, function)\n", "```\n", "`data` is a list/vector. We want our function to apply to each element of this list/vector.\n", "\n", "`function` can be a pre-existing function, or we can create a short custom function right within `map` using what we learned in our tutorial on writing functions.\n", "\n", "Here, we'll fit a linear model to predict Sepal.Length from Petal.Length:" ] }, { "cell_type": "code", "execution_count": 182, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[90m# A tibble: 4 × 4\u001b[39m\n", "\u001b[90m# Groups: Species, PetalType [4]\u001b[39m\n", " Species PetalType data model_fit\n", " \u001b[3m\u001b[90m\u001b[39m\u001b[23m \u001b[3m\u001b[90m\u001b[39m\u001b[23m \u001b[3m\u001b[90m\u001b[39m\u001b[23m \u001b[3m\u001b[90m\u001b[39m\u001b[23m \n", "\u001b[90m1\u001b[39m setosa short \u001b[90m\u001b[39m \u001b[90m\u001b[39m \n", "\u001b[90m2\u001b[39m versicolor long \u001b[90m\u001b[39m \u001b[90m\u001b[39m \n", "\u001b[90m3\u001b[39m versicolor short \u001b[90m\u001b[39m \u001b[90m\u001b[39m \n", "\u001b[90m4\u001b[39m virginica long \u001b[90m\u001b[39m \u001b[90m\u001b[39m \n" ] } ], "source": [ "nested_lm <- nested %>% \n", " mutate(model_fit = map(data, #column name in nested df\n", " function(nest_df) lm(Sepal.Length ~ Petal.Length, data=nest_df))) \n", "\n", "print(nested_lm)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that in this case, the first `data` argument of `map` refers to the name of our nested column in our dataset. However within the function, `data = ` is a built-in argument for the `lm` function.\n", "\n", "We can see we've added another column in which each cell contains the specified linear model. Let's see what that really looks like! (This code just pulls the top two lines of the lm object):" ] }, { "cell_type": "code", "execution_count": 183, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\t
$coefficients
\n", "\t\t
(Intercept)
4.21316822303424
Petal.Length
0.542292597103803
\n", "
\n", "\t
$residuals
\n", "\t\t
1
0.127622141020428
2
-0.0723778589795636
3
-0.218148599269184
4
-0.426607118689945
5
0.027622141020436
6
0.264934361889295
7
-0.372377858979564
8
-0.0266071186899444
9
-0.572377858979564
10
-0.126607118689944
11
0.373392881310056
12
-0.280836378400325
13
-0.172377858979564
14
-0.509690079848423
15
0.936080660441196
16
0.673392881310056
17
0.481851400730817
18
0.127622141020436
19
0.564934361889295
20
0.0733928813100553
21
0.264934361889295
22
0.0733928813100553
23
-0.155460820138043
24
-0.0350656381107053
25
-0.443524157531466
26
-0.0808363784003247
27
-0.0808363784003247
28
0.173392881310056
29
0.227622141020436
30
-0.380836378400324
31
-0.280836378400325
32
0.373392881310056
33
0.173392881310056
34
0.527622141020436
35
-0.126607118689944
36
0.136080660441197
37
0.581851400730816
38
-0.0723778589795637
39
-0.518148599269183
40
0.0733928813100553
41
0.0818514007308162
42
-0.418148599269184
43
-0.518148599269183
44
-0.0808363784003247
45
-0.143524157531466
46
-0.172377858979564
47
0.0191636215996749
48
-0.372377858979564
49
0.273392881310055
50
0.027622141020436
\n", "
\n", "
\n" ], "text/latex": [ "\\begin{description}\n", "\\item[\\$coefficients] \\begin{description*}\n", "\\item[(Intercept)] 4.21316822303424\n", "\\item[Petal.Length] 0.542292597103803\n", "\\end{description*}\n", "\n", "\\item[\\$residuals] \\begin{description*}\n", "\\item[1] 0.127622141020428\n", "\\item[2] -0.0723778589795636\n", "\\item[3] -0.218148599269184\n", "\\item[4] -0.426607118689945\n", "\\item[5] 0.027622141020436\n", "\\item[6] 0.264934361889295\n", "\\item[7] -0.372377858979564\n", "\\item[8] -0.0266071186899444\n", "\\item[9] -0.572377858979564\n", "\\item[10] -0.126607118689944\n", "\\item[11] 0.373392881310056\n", "\\item[12] -0.280836378400325\n", "\\item[13] -0.172377858979564\n", "\\item[14] -0.509690079848423\n", "\\item[15] 0.936080660441196\n", "\\item[16] 0.673392881310056\n", "\\item[17] 0.481851400730817\n", "\\item[18] 0.127622141020436\n", "\\item[19] 0.564934361889295\n", "\\item[20] 0.0733928813100553\n", "\\item[21] 0.264934361889295\n", "\\item[22] 0.0733928813100553\n", "\\item[23] -0.155460820138043\n", "\\item[24] -0.0350656381107053\n", "\\item[25] -0.443524157531466\n", "\\item[26] -0.0808363784003247\n", "\\item[27] -0.0808363784003247\n", "\\item[28] 0.173392881310056\n", "\\item[29] 0.227622141020436\n", "\\item[30] -0.380836378400324\n", "\\item[31] -0.280836378400325\n", "\\item[32] 0.373392881310056\n", "\\item[33] 0.173392881310056\n", "\\item[34] 0.527622141020436\n", "\\item[35] -0.126607118689944\n", "\\item[36] 0.136080660441197\n", "\\item[37] 0.581851400730816\n", "\\item[38] -0.0723778589795637\n", "\\item[39] -0.518148599269183\n", "\\item[40] 0.0733928813100553\n", "\\item[41] 0.0818514007308162\n", "\\item[42] -0.418148599269184\n", "\\item[43] -0.518148599269183\n", "\\item[44] -0.0808363784003247\n", "\\item[45] -0.143524157531466\n", "\\item[46] -0.172377858979564\n", "\\item[47] 0.0191636215996749\n", "\\item[48] -0.372377858979564\n", "\\item[49] 0.273392881310055\n", "\\item[50] 0.027622141020436\n", "\\end{description*}\n", "\n", "\\end{description}\n" ], "text/markdown": [ "$coefficients\n", ": (Intercept)\n", ": 4.21316822303424Petal.Length\n", ": 0.542292597103803\n", "\n", "\n", "$residuals\n", ": 1\n", ": 0.1276221410204282\n", ": -0.07237785897956363\n", ": -0.2181485992691844\n", ": -0.4266071186899455\n", ": 0.0276221410204366\n", ": 0.2649343618892957\n", ": -0.3723778589795648\n", ": -0.02660711868994449\n", ": -0.57237785897956410\n", ": -0.12660711868994411\n", ": 0.37339288131005612\n", ": -0.28083637840032513\n", ": -0.17237785897956414\n", ": -0.50969007984842315\n", ": 0.93608066044119616\n", ": 0.67339288131005617\n", ": 0.48185140073081718\n", ": 0.12762214102043619\n", ": 0.56493436188929520\n", ": 0.073392881310055321\n", ": 0.26493436188929522\n", ": 0.073392881310055323\n", ": -0.15546082013804324\n", ": -0.035065638110705325\n", ": -0.44352415753146626\n", ": -0.080836378400324727\n", ": -0.080836378400324728\n", ": 0.17339288131005629\n", ": 0.22762214102043630\n", ": -0.38083637840032431\n", ": -0.28083637840032532\n", ": 0.37339288131005633\n", ": 0.17339288131005634\n", ": 0.52762214102043635\n", ": -0.12660711868994436\n", ": 0.13608066044119737\n", ": 0.58185140073081638\n", ": -0.072377858979563739\n", ": -0.51814859926918340\n", ": 0.073392881310055341\n", ": 0.081851400730816242\n", ": -0.41814859926918443\n", ": -0.51814859926918344\n", ": -0.080836378400324745\n", ": -0.14352415753146646\n", ": -0.17237785897956447\n", ": 0.019163621599674948\n", ": -0.37237785897956449\n", ": 0.27339288131005550\n", ": 0.027622141020436\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "$coefficients\n", " (Intercept) Petal.Length \n", " 4.2131682 0.5422926 \n", "\n", "$residuals\n", " 1 2 3 4 5 6 \n", " 0.12762214 -0.07237786 -0.21814860 -0.42660712 0.02762214 0.26493436 \n", " 7 8 9 10 11 12 \n", "-0.37237786 -0.02660712 -0.57237786 -0.12660712 0.37339288 -0.28083638 \n", " 13 14 15 16 17 18 \n", "-0.17237786 -0.50969008 0.93608066 0.67339288 0.48185140 0.12762214 \n", " 19 20 21 22 23 24 \n", " 0.56493436 0.07339288 0.26493436 0.07339288 -0.15546082 -0.03506564 \n", " 25 26 27 28 29 30 \n", "-0.44352416 -0.08083638 -0.08083638 0.17339288 0.22762214 -0.38083638 \n", " 31 32 33 34 35 36 \n", "-0.28083638 0.37339288 0.17339288 0.52762214 -0.12660712 0.13608066 \n", " 37 38 39 40 41 42 \n", " 0.58185140 -0.07237786 -0.51814860 0.07339288 0.08185140 -0.41814860 \n", " 43 44 45 46 47 48 \n", "-0.51814860 -0.08083638 -0.14352416 -0.17237786 0.01916362 -0.37237786 \n", " 49 50 \n", " 0.27339288 0.02762214 \n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "nested_lm %>% \n", " pull(model_fit) %>% #tidyverse version of $ -- selecting model_fit column\n", " first() %>% #pulling first row\n", " head(2) #just top 2 lines of nested df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Super ugly, but there's (part of) our model! \n", "\n", "Now, using what we learned in our tutorial on data objects, we can extract interesting information from each of these nested models. Here we create yet another nested column, where each cell holds the coefficients for the respective model." ] }, { "cell_type": "code", "execution_count": 184, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[90m# A tibble: 4 × 5\u001b[39m\n", "\u001b[90m# Groups: Species, PetalType [4]\u001b[39m\n", " Species PetalType data model_fit coef \n", " \u001b[3m\u001b[90m\u001b[39m\u001b[23m \u001b[3m\u001b[90m\u001b[39m\u001b[23m \u001b[3m\u001b[90m\u001b[39m\u001b[23m \u001b[3m\u001b[90m\u001b[39m\u001b[23m \u001b[3m\u001b[90m\u001b[39m\u001b[23m \n", "\u001b[90m1\u001b[39m setosa short \u001b[90m\u001b[39m \u001b[90m\u001b[39m \u001b[90m\u001b[39m\n", "\u001b[90m2\u001b[39m versicolor long \u001b[90m\u001b[39m \u001b[90m\u001b[39m \u001b[90m\u001b[39m\n", "\u001b[90m3\u001b[39m versicolor short \u001b[90m\u001b[39m \u001b[90m\u001b[39m \u001b[90m\u001b[39m\n", "\u001b[90m4\u001b[39m virginica long \u001b[90m\u001b[39m \u001b[90m\u001b[39m \u001b[90m\u001b[39m\n" ] } ], "source": [ "nested_lm <- nested_lm %>% \n", " mutate(coef = map(model_fit, #now iterating over \"model_fit\" instead of \"data\"\n", " #a function to create data frame of coef names/values:\n", " function(fit) data.frame(name = names(fit$coefficients), \n", " beta = fit$coefficients)))\n", "print(nested_lm)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, we can unnest the columns we're interested in. " ] }, { "cell_type": "code", "execution_count": 185, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[90m# A tibble: 8 × 6\u001b[39m\n", "\u001b[90m# Groups: Species, PetalType [4]\u001b[39m\n", " Species PetalType data model_fit name beta\n", " \u001b[3m\u001b[90m\u001b[39m\u001b[23m \u001b[3m\u001b[90m\u001b[39m\u001b[23m \u001b[3m\u001b[90m\u001b[39m\u001b[23m \u001b[3m\u001b[90m\u001b[39m\u001b[23m \u001b[3m\u001b[90m\u001b[39m\u001b[23m \u001b[3m\u001b[90m\u001b[39m\u001b[23m\n", "\u001b[90m1\u001b[39m setosa short \u001b[90m\u001b[39m \u001b[90m\u001b[39m (Intercept) 4.21 \n", "\u001b[90m2\u001b[39m setosa short \u001b[90m\u001b[39m \u001b[90m\u001b[39m Petal.Length 0.542\n", "\u001b[90m3\u001b[39m versicolor long \u001b[90m\u001b[39m \u001b[90m\u001b[39m (Intercept) 2.28 \n", "\u001b[90m4\u001b[39m versicolor long \u001b[90m\u001b[39m \u001b[90m\u001b[39m Petal.Length 0.858\n", "\u001b[90m5\u001b[39m versicolor short \u001b[90m\u001b[39m \u001b[90m\u001b[39m (Intercept) 2.30 \n", "\u001b[90m6\u001b[39m versicolor short \u001b[90m\u001b[39m \u001b[90m\u001b[39m Petal.Length 0.865\n", "\u001b[90m7\u001b[39m virginica long \u001b[90m\u001b[39m \u001b[90m\u001b[39m (Intercept) 1.06 \n", "\u001b[90m8\u001b[39m virginica long \u001b[90m\u001b[39m \u001b[90m\u001b[39m Petal.Length 0.996\n" ] } ], "source": [ "nested_lm <- nested_lm %>% \n", " unnest(coef)\n", "\n", "print(nested_lm)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A few things to notice here. First, we went from a 4 x 6 tibble to an 8 x 6 tibble, because each Species/PetalType combination now has two rows instead of just one. Second, our `data` and `model_fit` columns are still nested. And we can clearly see that the link between Petal.Length and Sepal.Length differs based on which Species/PetalType combo we're looking at!\n", "\n", "You can find additional information on this approach here: http://omaymas.github.io/Climate_Change_ExpAnalysis/" ] }, { "cell_type": "markdown", "metadata": { "id": "Nzshj3o60ZAc" }, "source": [ "---\n", "# Restructuring data.frames: long to wide, wide to long, and merging" ] }, { "cell_type": "markdown", "metadata": { "id": "7KCb-yDtnyUJ" }, "source": [ "Recall that **long data** means we have one row for each observation, while **wide data** has one row for each subject.\n", "\n", "In this section we'll use the `dplyr` functions `pivot_longer` (formerly `gather`) and `pivot_wider` (formerly `spread`) to switch between short and long forms of the data. We'll also try out combining data.frames using the `*_join` family of functions. \n", "\n", "The `iris` data set has multiple measurements per row, so it is currently in the \"wide\" format. To put it in long format, we can make each row only have one measurement, and then add a variable that specifies whether that measurment is for \"sepal\" or \"petal\", \"length\" or \"width\". \n", "\n", "We'll start by making a new duplicate of the `iris` dataset so we don't have to deal with all the messy variables we created. We'll aslo add an ID, `flower.num` so we can keep things in order while we restructure." ] }, { "cell_type": "code", "execution_count": 186, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 207 }, "executionInfo": { "elapsed": 285, "status": "ok", "timestamp": 1611099739020, "user": { "displayName": "Patience Stevens", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gi-_9ZqhIFhAv1oMehJNvNuIKSTyrFQHzjxQKhx=s64", "userId": "01994571539255174942" }, "user_tz": 300 }, "id": "aRWGmwp9rkgI", "outputId": "843ab4f4-b87c-4ae8-ea44-6d38c4cd3b48", "scrolled": false }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
A data.frame: 6 × 6
Sepal.LengthSepal.WidthPetal.LengthPetal.WidthSpeciesflower.num
<dbl><dbl><dbl><dbl><fct><int>
15.13.51.40.2setosa1
24.93.01.40.2setosa2
34.73.21.30.2setosa3
44.63.11.50.2setosa4
55.03.61.40.2setosa5
65.43.91.70.4setosa6
\n" ], "text/latex": [ "A data.frame: 6 × 6\n", "\\begin{tabular}{r|llllll}\n", " & Sepal.Length & Sepal.Width & Petal.Length & Petal.Width & Species & flower.num\\\\\n", " & & & & & & \\\\\n", "\\hline\n", "\t1 & 5.1 & 3.5 & 1.4 & 0.2 & setosa & 1\\\\\n", "\t2 & 4.9 & 3.0 & 1.4 & 0.2 & setosa & 2\\\\\n", "\t3 & 4.7 & 3.2 & 1.3 & 0.2 & setosa & 3\\\\\n", "\t4 & 4.6 & 3.1 & 1.5 & 0.2 & setosa & 4\\\\\n", "\t5 & 5.0 & 3.6 & 1.4 & 0.2 & setosa & 5\\\\\n", "\t6 & 5.4 & 3.9 & 1.7 & 0.4 & setosa & 6\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "A data.frame: 6 × 6\n", "\n", "| | Sepal.Length <dbl> | Sepal.Width <dbl> | Petal.Length <dbl> | Petal.Width <dbl> | Species <fct> | flower.num <int> |\n", "|---|---|---|---|---|---|---|\n", "| 1 | 5.1 | 3.5 | 1.4 | 0.2 | setosa | 1 |\n", "| 2 | 4.9 | 3.0 | 1.4 | 0.2 | setosa | 2 |\n", "| 3 | 4.7 | 3.2 | 1.3 | 0.2 | setosa | 3 |\n", "| 4 | 4.6 | 3.1 | 1.5 | 0.2 | setosa | 4 |\n", "| 5 | 5.0 | 3.6 | 1.4 | 0.2 | setosa | 5 |\n", "| 6 | 5.4 | 3.9 | 1.7 | 0.4 | setosa | 6 |\n", "\n" ], "text/plain": [ " Sepal.Length Sepal.Width Petal.Length Petal.Width Species flower.num\n", "1 5.1 3.5 1.4 0.2 setosa 1 \n", "2 4.9 3.0 1.4 0.2 setosa 2 \n", "3 4.7 3.2 1.3 0.2 setosa 3 \n", "4 4.6 3.1 1.5 0.2 setosa 4 \n", "5 5.0 3.6 1.4 0.2 setosa 5 \n", "6 5.4 3.9 1.7 0.4 setosa 6 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "newdat <- iris # new duplicate\n", "newdat$flower.num <- 1:nrow(newdat) # add ID\n", "head(newdat)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `pivot_longer()`\n", "\n", "`pivot_longer` takes the arguments:\n", "```\n", "pivot_longer(data, cols, names_to = \"names\", values_to = \"values\"\n", "```\n", "Where:\n", "* `data` is (always!) your data object\n", "* `cols` are the columns you would like to put in long format\n", "* `names_to` specifies the new name of your column containing the rest of your variable names (formerly \"key\" in `gather`)\n", "* `values_to` specifies the name of the column containing the actual values\n", "\n", "It's easier to just see it:" ] }, { "cell_type": "code", "execution_count": 187, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
A tibble: 6 × 4
Speciesflower.numiris_attributevalue
<fct><int><chr><dbl>
setosa1Sepal.Length5.1
setosa1Sepal.Width 3.5
setosa1Petal.Length1.4
setosa1Petal.Width 0.2
setosa2Sepal.Length4.9
setosa2Sepal.Width 3.0
\n" ], "text/latex": [ "A tibble: 6 × 4\n", "\\begin{tabular}{llll}\n", " Species & flower.num & iris\\_attribute & value\\\\\n", " & & & \\\\\n", "\\hline\n", "\t setosa & 1 & Sepal.Length & 5.1\\\\\n", "\t setosa & 1 & Sepal.Width & 3.5\\\\\n", "\t setosa & 1 & Petal.Length & 1.4\\\\\n", "\t setosa & 1 & Petal.Width & 0.2\\\\\n", "\t setosa & 2 & Sepal.Length & 4.9\\\\\n", "\t setosa & 2 & Sepal.Width & 3.0\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "A tibble: 6 × 4\n", "\n", "| Species <fct> | flower.num <int> | iris_attribute <chr> | value <dbl> |\n", "|---|---|---|---|\n", "| setosa | 1 | Sepal.Length | 5.1 |\n", "| setosa | 1 | Sepal.Width | 3.5 |\n", "| setosa | 1 | Petal.Length | 1.4 |\n", "| setosa | 1 | Petal.Width | 0.2 |\n", "| setosa | 2 | Sepal.Length | 4.9 |\n", "| setosa | 2 | Sepal.Width | 3.0 |\n", "\n" ], "text/plain": [ " Species flower.num iris_attribute value\n", "1 setosa 1 Sepal.Length 5.1 \n", "2 setosa 1 Sepal.Width 3.5 \n", "3 setosa 1 Petal.Length 1.4 \n", "4 setosa 1 Petal.Width 0.2 \n", "5 setosa 2 Sepal.Length 4.9 \n", "6 setosa 2 Sepal.Width 3.0 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "newdat <- newdat %>%\n", " pivot_longer(cols = c(Sepal.Length, Sepal.Width, #concatenate to select multiple\n", " Petal.Length, Petal.Width),\n", " names_to = \"iris_attribute\",\n", " values_to = \"value\")\n", "head(newdat)" ] }, { "cell_type": "markdown", "metadata": { "id": "lTkYLiTKzgvM" }, "source": [ "We can see that `iris_attribute` provides the labels for what `value` actually measures. Also notice that the columns we did not include in `pivot_longer`, i.e., Species and flower.num, just repeat.\n", "\n", "Now this data set is in a long format, which is a tidier format for answering analysis questions (\"Are petals longer than they are wide?\") and for visualization. \n", "\n", "\n", "### `pivot_wider()`\n", "\n", "We can also easily put it back in \"wide\" format using `pivot_wider`, which uses the structure:\n", "```\n", "pivot_wider(data, names_from = \"names\", values_from = \"values\")\n", "```\n", "\n", "As you can see, `names_from` asks which column our variable labels can be found in, and `values_from` asks which column the values are in." ] }, { "cell_type": "code", "execution_count": 188, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 207 }, "executionInfo": { "elapsed": 304, "status": "ok", "timestamp": 1611099742110, "user": { "displayName": "Patience Stevens", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gi-_9ZqhIFhAv1oMehJNvNuIKSTyrFQHzjxQKhx=s64", "userId": "01994571539255174942" }, "user_tz": 300 }, "id": "LE2Q-0FTz9Sb", "outputId": "6ef4b907-cda8-4dbe-c793-110bc50dab5f" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
A tibble: 6 × 6
Speciesflower.numSepal.LengthSepal.WidthPetal.LengthPetal.Width
<fct><int><dbl><dbl><dbl><dbl>
setosa15.13.51.40.2
setosa24.93.01.40.2
setosa34.73.21.30.2
setosa44.63.11.50.2
setosa55.03.61.40.2
setosa65.43.91.70.4
\n" ], "text/latex": [ "A tibble: 6 × 6\n", "\\begin{tabular}{llllll}\n", " Species & flower.num & Sepal.Length & Sepal.Width & Petal.Length & Petal.Width\\\\\n", " & & & & & \\\\\n", "\\hline\n", "\t setosa & 1 & 5.1 & 3.5 & 1.4 & 0.2\\\\\n", "\t setosa & 2 & 4.9 & 3.0 & 1.4 & 0.2\\\\\n", "\t setosa & 3 & 4.7 & 3.2 & 1.3 & 0.2\\\\\n", "\t setosa & 4 & 4.6 & 3.1 & 1.5 & 0.2\\\\\n", "\t setosa & 5 & 5.0 & 3.6 & 1.4 & 0.2\\\\\n", "\t setosa & 6 & 5.4 & 3.9 & 1.7 & 0.4\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "A tibble: 6 × 6\n", "\n", "| Species <fct> | flower.num <int> | Sepal.Length <dbl> | Sepal.Width <dbl> | Petal.Length <dbl> | Petal.Width <dbl> |\n", "|---|---|---|---|---|---|\n", "| setosa | 1 | 5.1 | 3.5 | 1.4 | 0.2 |\n", "| setosa | 2 | 4.9 | 3.0 | 1.4 | 0.2 |\n", "| setosa | 3 | 4.7 | 3.2 | 1.3 | 0.2 |\n", "| setosa | 4 | 4.6 | 3.1 | 1.5 | 0.2 |\n", "| setosa | 5 | 5.0 | 3.6 | 1.4 | 0.2 |\n", "| setosa | 6 | 5.4 | 3.9 | 1.7 | 0.4 |\n", "\n" ], "text/plain": [ " Species flower.num Sepal.Length Sepal.Width Petal.Length Petal.Width\n", "1 setosa 1 5.1 3.5 1.4 0.2 \n", "2 setosa 2 4.9 3.0 1.4 0.2 \n", "3 setosa 3 4.7 3.2 1.3 0.2 \n", "4 setosa 4 4.6 3.1 1.5 0.2 \n", "5 setosa 5 5.0 3.6 1.4 0.2 \n", "6 setosa 6 5.4 3.9 1.7 0.4 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "newdat <- newdat %>%\n", " pivot_wider(names_from = \"iris_attribute\", values_from = \"value\")\n", "head(newdat)" ] }, { "cell_type": "markdown", "metadata": { "id": "lmghfOw60ZAh" }, "source": [ "### `*_join()`\n", "The last functions we'll cover in this tutorial are the `*_join()` functions. \n", "\n", "Imagine that you saved your data so that personal information such as age was saved separately from your participants' response data. However, now you want to see if age impacts your effect size, and you'd like to add age as a variable in your main dataset. As long as both your response dataset and your personal information dataset have the participant ID in them, you should be able to add the participants' ages to the dataset easily using `*_join()`.\n", "\n", "Here, the * indicates that there are multiple types of join functions. All of these functions take the format:\n", "```\n", "*_join(x, y, by = \"ID\")\n", "```\n", "where x and y are two dataframes to join, and `by` indicates which variable(s) to match on.\n", "\n", "However, the join functions differ based on which rows they try to match:\n", "* inner_join(): includes all rows that are in *both* x and y\n", "* left_join(): includes all rows in x\n", "* right_join(): includes all rows in y\n", "* full_join(): includes all rows in either x *or* y\n", "\n", "Learn more with `?join`\n", "\n", "We can illustrate this by simulating some participant data where ages and responses are stored in separate dfs." ] }, { "cell_type": "code", "execution_count": 189, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 347 }, "executionInfo": { "elapsed": 321, "status": "ok", "timestamp": 1611100691444, "user": { "displayName": "Patience Stevens", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gi-_9ZqhIFhAv1oMehJNvNuIKSTyrFQHzjxQKhx=s64", "userId": "01994571539255174942" }, "user_tz": 300 }, "id": "tmWGxsgYDagC", "outputId": "919c5fe5-b24a-4a49-b5e2-c9a0216e90dc", "scrolled": false }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\n", "
A data.frame: 3 × 3
nameagefirstlang
<chr><dbl><chr>
1p0118English
2p0221Chinese
3p0323English
\n" ], "text/latex": [ "A data.frame: 3 × 3\n", "\\begin{tabular}{r|lll}\n", " & name & age & firstlang\\\\\n", " & & & \\\\\n", "\\hline\n", "\t1 & p01 & 18 & English\\\\\n", "\t2 & p02 & 21 & Chinese\\\\\n", "\t3 & p03 & 23 & English\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "A data.frame: 3 × 3\n", "\n", "| | name <chr> | age <dbl> | firstlang <chr> |\n", "|---|---|---|---|\n", "| 1 | p01 | 18 | English |\n", "| 2 | p02 | 21 | Chinese |\n", "| 3 | p03 | 23 | English |\n", "\n" ], "text/plain": [ " name age firstlang\n", "1 p01 18 English \n", "2 p02 21 Chinese \n", "3 p03 23 English " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
A data.frame: 4 × 2
nameresponse
<chr><dbl>
1p010
2p011
3p021
4p020
\n" ], "text/latex": [ "A data.frame: 4 × 2\n", "\\begin{tabular}{r|ll}\n", " & name & response\\\\\n", " & & \\\\\n", "\\hline\n", "\t1 & p01 & 0\\\\\n", "\t2 & p01 & 1\\\\\n", "\t3 & p02 & 1\\\\\n", "\t4 & p02 & 0\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "A data.frame: 4 × 2\n", "\n", "| | name <chr> | response <dbl> |\n", "|---|---|---|\n", "| 1 | p01 | 0 |\n", "| 2 | p01 | 1 |\n", "| 3 | p02 | 1 |\n", "| 4 | p02 | 0 |\n", "\n" ], "text/plain": [ " name response\n", "1 p01 0 \n", "2 p01 1 \n", "3 p02 1 \n", "4 p02 0 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# participant info\n", "personal <- data.frame(name = c(\"p01\", \"p02\", \"p03\"),\n", " age = c(18, 21, 23), \n", " firstlang = c(\"English\", \"Chinese\", \"English\"))\n", "\n", "# response database\n", "response <- data.frame(name= c(\"p01\",\"p01\",\"p02\",\"p02\"),\n", " response=c(0,1,1,0))\n", "head(personal)\n", "head(response)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notice that we have personal data for p03, but not their response data.\n", "\n", "Using `left_join()` we retain p03 in the data set:" ] }, { "cell_type": "code", "execution_count": 190, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
A data.frame: 5 × 4
nameagefirstlangresponse
<chr><dbl><chr><dbl>
1p0118English 0
2p0118English 1
3p0221Chinese 1
4p0221Chinese 0
5p0323EnglishNA
\n" ], "text/latex": [ "A data.frame: 5 × 4\n", "\\begin{tabular}{r|llll}\n", " & name & age & firstlang & response\\\\\n", " & & & & \\\\\n", "\\hline\n", "\t1 & p01 & 18 & English & 0\\\\\n", "\t2 & p01 & 18 & English & 1\\\\\n", "\t3 & p02 & 21 & Chinese & 1\\\\\n", "\t4 & p02 & 21 & Chinese & 0\\\\\n", "\t5 & p03 & 23 & English & NA\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "A data.frame: 5 × 4\n", "\n", "| | name <chr> | age <dbl> | firstlang <chr> | response <dbl> |\n", "|---|---|---|---|---|\n", "| 1 | p01 | 18 | English | 0 |\n", "| 2 | p01 | 18 | English | 1 |\n", "| 3 | p02 | 21 | Chinese | 1 |\n", "| 4 | p02 | 21 | Chinese | 0 |\n", "| 5 | p03 | 23 | English | NA |\n", "\n" ], "text/plain": [ " name age firstlang response\n", "1 p01 18 English 0 \n", "2 p01 18 English 1 \n", "3 p02 21 Chinese 1 \n", "4 p02 21 Chinese 0 \n", "5 p03 23 English NA " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "personal %>% \n", " left_join(response, by = \"name\") %>% #piped \"personal\" in, so only one df here\n", " head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "But using `right_join()` they are dropped:" ] }, { "cell_type": "code", "execution_count": 191, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
A data.frame: 4 × 4
nameagefirstlangresponse
<chr><dbl><chr><dbl>
1p0118English0
2p0118English1
3p0221Chinese1
4p0221Chinese0
\n" ], "text/latex": [ "A data.frame: 4 × 4\n", "\\begin{tabular}{r|llll}\n", " & name & age & firstlang & response\\\\\n", " & & & & \\\\\n", "\\hline\n", "\t1 & p01 & 18 & English & 0\\\\\n", "\t2 & p01 & 18 & English & 1\\\\\n", "\t3 & p02 & 21 & Chinese & 1\\\\\n", "\t4 & p02 & 21 & Chinese & 0\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "A data.frame: 4 × 4\n", "\n", "| | name <chr> | age <dbl> | firstlang <chr> | response <dbl> |\n", "|---|---|---|---|---|\n", "| 1 | p01 | 18 | English | 0 |\n", "| 2 | p01 | 18 | English | 1 |\n", "| 3 | p02 | 21 | Chinese | 1 |\n", "| 4 | p02 | 21 | Chinese | 0 |\n", "\n" ], "text/plain": [ " name age firstlang response\n", "1 p01 18 English 0 \n", "2 p01 18 English 1 \n", "3 p02 21 Chinese 1 \n", "4 p02 21 Chinese 0 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "personal %>% \n", " right_join(response, by = \"name\") %>% #piped \"personal\" in, so only one df here\n", " head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Try out `inner_join` and `full_join` to see how they differ." ] }, { "cell_type": "markdown", "metadata": { "id": "A1GrvZiMiSE6" }, "source": [ "*Notebook authored by Ven Popov and edited by Krista Bond, Charles Wu, Patience Stevens, Amy Sentis, and Fiona Horner.*" ] } ], "metadata": { "colab": { "name": "data-as-objects-and-architectures.ipynb", "provenance": [] }, "kernelspec": { "display_name": "R", "language": "R", "name": "ir" }, "language_info": { "codemirror_mode": "r", "file_extension": ".r", "mimetype": "text/x-r-source", "name": "R", "pygments_lexer": "r", "version": "4.2.0" } }, "nbformat": 4, "nbformat_minor": 1 }