{
"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",
"A data.frame: 6 × 5\n",
"\n",
"\t | Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species |
\n",
"\t | <dbl> | <dbl> | <dbl> | <dbl> | <fct> |
\n",
"\n",
"\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",
"\n",
"
\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",
"A data.frame: 6 × 6\n",
"\n",
"\t | Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species | centered_SepLen |
\n",
"\t | <dbl> | <dbl> | <dbl> | <dbl> | <fct> | <dbl> |
\n",
"\n",
"\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",
"\n",
"
\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",
"A data.frame: 6 × 8\n",
"\n",
"\t | Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species | centered_SepLen | PetLen_zscores | n_flowers |
\n",
"\t | <dbl> | <dbl> | <dbl> | <dbl> | <fct> | <dbl> | <dbl> | <int> |
\n",
"\n",
"\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",
"\n",
"
\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",
"A data.frame: 1 × 6\n",
"\n",
"\tn_flowers | shortSepal_prop | setosa_prop | SepLen_mean | SepLen_sd | SepLen_se |
\n",
"\t<int> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> |
\n",
"\n",
"\n",
"\t150 | 0.5333333 | 0.3333333 | 5.843333 | 0.8280661 | 0.06761132 |
\n",
"\n",
"
\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",
"A data.frame: 6 × 8\n",
"\n",
"\t | Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species | centered_SepLen | PetLen_zscores | n_flowers |
\n",
"\t | <dbl> | <dbl> | <dbl> | <dbl> | <fct> | <dbl> | <dbl> | <int> |
\n",
"\n",
"\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",
"\n",
"
\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",
"A data.frame: 6 × 8\n",
"\n",
"\t | Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species | centered_SepLen | PetLen_zscores | n_flowers |
\n",
"\t | <dbl> | <dbl> | <dbl> | <dbl> | <fct> | <dbl> | <dbl> | <int> |
\n",
"\n",
"\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",
"\n",
"
\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",
"A data.frame: 6 × 8\n",
"\n",
"\t | Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species | centered_SepLen | PetLen_zscores | n_flowers |
\n",
"\t | <dbl> | <dbl> | <dbl> | <dbl> | <fct> | <dbl> | <dbl> | <int> |
\n",
"\n",
"\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",
"\n",
"
\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",
"A data.frame: 1 × 2\n",
"\n",
"\tSepLen_mean | SepLen_sd |
\n",
"\t<dbl> | <dbl> |
\n",
"\n",
"\n",
"\t5.936 | 0.5161711 |
\n",
"\n",
"
\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",
"A data.frame: 1 × 2\n",
"\n",
"\tSepLen_mean | SepLen_sd |
\n",
"\t<dbl> | <dbl> |
\n",
"\n",
"\n",
"\t6.588 | 0.6358796 |
\n",
"\n",
"
\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",
"A data.frame: 6 × 3\n",
"\n",
"\t | Species | Petal.Length | Petal.Width |
\n",
"\t | <fct> | <dbl> | <dbl> |
\n",
"\n",
"\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",
"\n",
"
\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",
"A data.frame: 6 × 6\n",
"\n",
"\t | Sepal.Length | Sepal.Width | Species | centered_SepLen | PetLen_zscores | n_flowers |
\n",
"\t | <dbl> | <dbl> | <fct> | <dbl> | <dbl> | <int> |
\n",
"\n",
"\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",
"\n",
"
\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",
"A data.frame: 6 × 8\n",
"\n",
"\t | Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species | centered_SepLen | PetLen_zscores | n_flowers |
\n",
"\t | <dbl> | <dbl> | <dbl> | <dbl> | <fct> | <dbl> | <dbl> | <int> |
\n",
"\n",
"\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",
"\n",
"
\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",
"A data.frame: 6 × 5\n",
"\n",
"\t | Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species |
\n",
"\t | <dbl> | <dbl> | <dbl> | <dbl> | <fct> |
\n",
"\n",
"\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",
"\n",
"
\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",
"A data.frame: 6 × 2\n",
"\n",
"\t | Petal.Length | Petal.Width |
\n",
"\t | <dbl> | <dbl> |
\n",
"\n",
"\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",
"\n",
"
\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",
"A data.frame: 6 × 8\n",
"\n",
"\t | Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species | centered_SepLen | PetLen_zscores | n_flowers |
\n",
"\t | <dbl> | <dbl> | <dbl> | <dbl> | <fct> | <dbl> | <dbl> | <int> |
\n",
"\n",
"\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",
"\n",
"
\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",
"A data.frame: 6 × 9\n",
"\n",
"\t | Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species | centered_SepLen | PetLen_zscores | n_flowers | PetalType |
\n",
"\t | <dbl> | <dbl> | <dbl> | <dbl> | <fct> | <dbl> | <dbl> | <int> | <chr> |
\n",
"\n",
"\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",
"\n",
"
\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",
"A data.frame: 6 × 10\n",
"\n",
"\t | Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Combined_var | Species | centered_SepLen | PetLen_zscores | n_flowers | PetalType |
\n",
"\t | <dbl> | <dbl> | <dbl> | <dbl> | <chr> | <fct> | <dbl> | <dbl> | <int> | <chr> |
\n",
"\n",
"\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",
"\n",
"
\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",
"A data.frame: 6 × 11\n",
"\n",
"\t | Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species1 | PetalType1 | Species | centered_SepLen | PetLen_zscores | n_flowers | PetalType |
\n",
"\t | <dbl> | <dbl> | <dbl> | <dbl> | <chr> | <chr> | <fct> | <dbl> | <dbl> | <int> | <chr> |
\n",
"\n",
"\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",
"\n",
"
\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",
"A grouped_df: 4 × 6\n",
"\n",
"\tSpecies | PetalType | SepLen_mean | SepLen_sd | SepWid_mean | SepWid_sd |
\n",
"\t<fct> | <chr> | <dbl> | <dbl> | <dbl> | <dbl> |
\n",
"\n",
"\n",
"\tsetosa | short | 5.006000 | 0.3524897 | 3.428000 | 0.3524897 |
\n",
"\tversicolor | long | 6.046512 | 0.4537405 | 2.823256 | 0.4537405 |
\n",
"\tversicolor | short | 5.257143 | 0.3309438 | 2.442857 | 0.3309438 |
\n",
"\tvirginica | long | 6.588000 | 0.6358796 | 2.974000 | 0.6358796 |
\n",
"\n",
"
\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",
"A grouped_df: 6 × 3\n",
"\n",
"\tSpecies | SepLen_centered_overall | SepLen_centered_byspecies |
\n",
"\t<fct> | <dbl> | <dbl> |
\n",
"\n",
"\n",
"\tsetosa | -0.7433333 | 0.094 |
\n",
"\tsetosa | -0.9433333 | -0.106 |
\n",
"\tsetosa | -1.1433333 | -0.306 |
\n",
"\tsetosa | -1.2433333 | -0.406 |
\n",
"\tsetosa | -0.8433333 | -0.006 |
\n",
"\tsetosa | -0.4433333 | 0.394 |
\n",
"\n",
"
\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",
"A data.frame: 6 × 6\n",
"\n",
"\t | Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species | PetalType |
\n",
"\t | <dbl> | <dbl> | <dbl> | <dbl> | <fct> | <chr> |
\n",
"\n",
"\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",
"\n",
"
\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",
"A tibble: 6 × 5\n",
"\n",
"\tSepal.Length | Sepal.Width | Petal.Length | Petal.Width | PetalType |
\n",
"\t<dbl> | <dbl> | <dbl> | <dbl> | <chr> |
\n",
"\n",
"\n",
"\t5.1 | 3.5 | 1.4 | 0.2 | short |
\n",
"\t4.9 | 3.0 | 1.4 | 0.2 | short |
\n",
"\t4.7 | 3.2 | 1.3 | 0.2 | short |
\n",
"\t4.6 | 3.1 | 1.5 | 0.2 | short |
\n",
"\t5.0 | 3.6 | 1.4 | 0.2 | short |
\n",
"\t5.4 | 3.9 | 1.7 | 0.4 | short |
\n",
"\n",
"
\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",
"A data.frame: 6 × 6\n",
"\n",
"\t | Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species | flower.num |
\n",
"\t | <dbl> | <dbl> | <dbl> | <dbl> | <fct> | <int> |
\n",
"\n",
"\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",
"\n",
"
\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",
"A tibble: 6 × 4\n",
"\n",
"\tSpecies | flower.num | iris_attribute | value |
\n",
"\t<fct> | <int> | <chr> | <dbl> |
\n",
"\n",
"\n",
"\tsetosa | 1 | Sepal.Length | 5.1 |
\n",
"\tsetosa | 1 | Sepal.Width | 3.5 |
\n",
"\tsetosa | 1 | Petal.Length | 1.4 |
\n",
"\tsetosa | 1 | Petal.Width | 0.2 |
\n",
"\tsetosa | 2 | Sepal.Length | 4.9 |
\n",
"\tsetosa | 2 | Sepal.Width | 3.0 |
\n",
"\n",
"
\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",
"A tibble: 6 × 6\n",
"\n",
"\tSpecies | flower.num | Sepal.Length | Sepal.Width | Petal.Length | Petal.Width |
\n",
"\t<fct> | <int> | <dbl> | <dbl> | <dbl> | <dbl> |
\n",
"\n",
"\n",
"\tsetosa | 1 | 5.1 | 3.5 | 1.4 | 0.2 |
\n",
"\tsetosa | 2 | 4.9 | 3.0 | 1.4 | 0.2 |
\n",
"\tsetosa | 3 | 4.7 | 3.2 | 1.3 | 0.2 |
\n",
"\tsetosa | 4 | 4.6 | 3.1 | 1.5 | 0.2 |
\n",
"\tsetosa | 5 | 5.0 | 3.6 | 1.4 | 0.2 |
\n",
"\tsetosa | 6 | 5.4 | 3.9 | 1.7 | 0.4 |
\n",
"\n",
"
\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",
"A data.frame: 3 × 3\n",
"\n",
"\t | name | age | firstlang |
\n",
"\t | <chr> | <dbl> | <chr> |
\n",
"\n",
"\n",
"\t1 | p01 | 18 | English |
\n",
"\t2 | p02 | 21 | Chinese |
\n",
"\t3 | p03 | 23 | English |
\n",
"\n",
"
\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",
"A data.frame: 4 × 2\n",
"\n",
"\t | name | response |
\n",
"\t | <chr> | <dbl> |
\n",
"\n",
"\n",
"\t1 | p01 | 0 |
\n",
"\t2 | p01 | 1 |
\n",
"\t3 | p02 | 1 |
\n",
"\t4 | p02 | 0 |
\n",
"\n",
"
\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",
"A data.frame: 5 × 4\n",
"\n",
"\t | name | age | firstlang | response |
\n",
"\t | <chr> | <dbl> | <chr> | <dbl> |
\n",
"\n",
"\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",
"\n",
"
\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",
"A data.frame: 4 × 4\n",
"\n",
"\t | name | age | firstlang | response |
\n",
"\t | <chr> | <dbl> | <chr> | <dbl> |
\n",
"\n",
"\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",
"\n",
"
\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
}