From dcfcc88daa8d27d9592f9d88bf45beb6d96bf8d5 Mon Sep 17 00:00:00 2001 From: Quarto GHA Workflow Runner Date: Thu, 22 Aug 2024 15:14:21 +0000 Subject: [PATCH] Built site for gh-pages --- .nojekyll | 2 +- images/wrangle-operators.png | Bin 90373 -> 0 bytes index.html | 43 +++++++++++++++++++++-------------- search.json | 24 +++++++++---------- sitemap.xml | 12 +++++----- wrangle.html | 28 +++++++++++++++++------ 6 files changed, 66 insertions(+), 43 deletions(-) delete mode 100644 images/wrangle-operators.png diff --git a/.nojekyll b/.nojekyll index e727309..9f55594 100644 --- a/.nojekyll +++ b/.nojekyll @@ -1 +1 @@ -ccbe185a \ No newline at end of file +c544bed4 \ No newline at end of file diff --git a/images/wrangle-operators.png b/images/wrangle-operators.png deleted file mode 100644 index cb3147779137f1548a2b726591c8b44792771d32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90373 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 diff --git a/index.html b/index.html index 3f0ce56..d093614 100644 --- a/index.html +++ b/index.html @@ -241,12 +241,14 @@

On this page

  • Welcome!
  • -
  • Programs to Install +
  • Workshop Preparation
  • -
  • Penguin Data
  • +
  • Example Data - Penguins
  • Websites to Visit
    • Supplemental Material
    • @@ -284,30 +286,37 @@

      Welcome!

      Hex logo for the Tidyverse R package

      To maximize the value of this workshop to you, we recommend that you take the following steps before the day of the workshop. If anything is unclear, feel free to reach out to us; our contact information can be found here

      -
      -

      Programs to Install

      -
      -

      R & RStudio

      -

      Install R and its more convenient (in our opinion) user-interface: RStudio.

      -

      If you already have R, check that you have at least version 4.0.0 by running the following code:

      +
      +

      Workshop Preparation

      +

      For those of you with a dedicated IT team that has sole power to install software on your computer: you may need to contact them before the workshop to do the installation bits of the prep steps we outline below.

      +
      +

      1. Install R

      +

      Install R. If you already have R, check that you have at least version 4.0.0 by running the following code:

      version$version.string

      If your version starts with a 3 (e.g., the above code returns “R version 3…”), please update R to make sure all packages behave as expected.

      -
      -

      R Packages

      +
      +

      2. Install RStudio

      +

      Once you have R (ver. ≥4.0), install RStudio. If you already have RStudio installed, you may want to make sure that you’re using a recent version to take advantage of some quality of life improvements that are broadly useful.

      +
      +
      +

      3. Install Some R Packages

      Install the tidyverse and palmerpenguins R packages using the following code:

      -
      install.packages(c("tidyverse", "palmerpenguins"))
      -library(tidyverse)
      -library(palmerpenguins)
      +
      install.packages("librarian")
      +librarian::shelf(tidyverse, palmerpenguins)

      Please run the above code even if you already have these packages to update these packages and ensure that your code aligns with the examples and challenges introduced during the workshop.

      +
      +

      4. Celebrate!

      +

      After following all the previous preparation steps, your setup should now be complete.

      +
      -
      -

      Penguin Data

      +
      +

      Example Data - Penguins

      The data we’ll be using for this workshop comes from the palmerpenguins package, maintained by Allison Horst. The “penguins” dataset from this package contains size measurements for adult foraging penguins near Palmer Station, Antarctica. Data were collected and made available by Dr. Kristen Gorman and the Palmer Station Long Term Ecological Research (LTER) Program. Let’s take a look at it!

      penguins
      diff --git a/search.json b/search.json index f20e2d8..c298dc6 100644 --- a/search.json +++ b/search.json @@ -59,7 +59,7 @@ "href": "wrangle.html#what-are-tidy-data", "title": "Wrangle", "section": "What are Tidy Data?", - "text": "What are Tidy Data?\nWhat are some common things you like to do with your data? Maybe remove rows or columns, do calculations and add the results as new columns? These operations (and others) are called “data wrangling”. The data we get to work with are rarely, if ever, in the format we need to do our analyses and data wrangling can help bridge that gap. dplyr and tidyr are two R packages from the tidyverse that provide a fairly complete and extremely powerful set of functions for us to do virtually all needed wrangling quickly. Here we introduce some commonly used functions from these two packages.\nWe can use glimpse from the dplyr package to look at part of the data while also getting some relevant structural information (i.e., what type of data are in each column, etc.).\n\n# install.packages(\"tidyverse\", \"palmerpenguins\")\nlibrary(tidyverse)\nlibrary(palmerpenguins)\n\ndplyr::glimpse(penguins)\n\nRows: 344\nColumns: 8\n$ species <fct> Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adel…\n$ island <fct> Torgersen, Torgersen, Torgersen, Torgersen, Torgerse…\n$ bill_length_mm <dbl> 39.1, 39.5, 40.3, NA, 36.7, 39.3, 38.9, 39.2, 34.1, …\n$ bill_depth_mm <dbl> 18.7, 17.4, 18.0, NA, 19.3, 20.6, 17.8, 19.6, 18.1, …\n$ flipper_length_mm <int> 181, 186, 195, NA, 193, 190, 181, 195, 193, 190, 186…\n$ body_mass_g <int> 3750, 3800, 3250, NA, 3450, 3650, 3625, 4675, 3475, …\n$ sex <fct> male, female, female, NA, female, male, female, male…\n$ year <int> 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007…", + "text": "What are Tidy Data?\nWhat are some common things you like to do with your data? Maybe remove rows or columns, do calculations and add the results as new columns? These operations (and others) are called “data wrangling”. The data we get to work with are rarely, if ever, in the format we need to do our analyses and data wrangling can help bridge that gap. dplyr and tidyr are two R packages from the Tidyverse that provide a fairly complete and extremely powerful set of functions for us to do virtually all needed wrangling quickly. Here we introduce some commonly used functions from these two packages.\nWe can use glimpse from the dplyr package to look at part of the data while also getting some relevant structural information (i.e., what type of data are in each column, etc.).\n\n# install.packages(\"tidyverse\", \"palmerpenguins\")\nlibrary(tidyverse)\nlibrary(palmerpenguins)\n\ndplyr::glimpse(penguins)\n\nRows: 344\nColumns: 8\n$ species <fct> Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adel…\n$ island <fct> Torgersen, Torgersen, Torgersen, Torgersen, Torgerse…\n$ bill_length_mm <dbl> 39.1, 39.5, 40.3, NA, 36.7, 39.3, 38.9, 39.2, 34.1, …\n$ bill_depth_mm <dbl> 18.7, 17.4, 18.0, NA, 19.3, 20.6, 17.8, 19.6, 18.1, …\n$ flipper_length_mm <int> 181, 186, 195, NA, 193, 190, 181, 195, 193, 190, 186…\n$ body_mass_g <int> 3750, 3800, 3250, NA, 3450, 3650, 3625, 4675, 3475, …\n$ sex <fct> male, female, female, NA, female, male, female, male…\n$ year <int> 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007…", "crumbs": [ "Modules", "Wrangle" @@ -70,7 +70,7 @@ "href": "wrangle.html#selecting-columns", "title": "Wrangle", "section": "Selecting Columns", - "text": "Selecting Columns\nTo start off, how do we do a fundamental action like selecting the columns we want? dplyr’s select function provides us with a straightforward way to do just that. We only need to provide the column names!\n\nNote that even if you select just one column, a dataframe will be returned. Whereas if you use the $ operator you get a vector (e.g., data$column returns a vector, not a dataframe).\n\nselect Example: Including & Excluding\n\n\n\n\n\n\nExample\n\n\n\nTo select only the species, island, and body_mass_g columns, we can use the following code:\n\n# Provide the name of the data and then the columns that you want!\npenguins_selected <- dplyr::select(.data = penguins, species, island, body_mass_g)\n\n# Look at the product\ndplyr::glimpse(penguins_selected)\n\nRows: 344\nColumns: 3\n$ species <fct> Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Ad…\n$ island <fct> Torgersen, Torgersen, Torgersen, Torgersen, Torgersen, Tor…\n$ body_mass_g <int> 3750, 3800, 3250, NA, 3450, 3650, 3625, 4675, 3475, 4250, …\n\n\nIf we want to remove specific columns, we can use the - operator.\n\n# Put a \"-\" in front of each column you would like to remove from your dataframe\npenguins_selected <- dplyr::select(.data = penguins, -flipper_length_mm, -sex)\n\n# Look at the product\ndplyr::glimpse(penguins_selected)\n\nRows: 344\nColumns: 6\n$ species <fct> Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie,…\n$ island <fct> Torgersen, Torgersen, Torgersen, Torgersen, Torgersen, …\n$ bill_length_mm <dbl> 39.1, 39.5, 40.3, NA, 36.7, 39.3, 38.9, 39.2, 34.1, 42.…\n$ bill_depth_mm <dbl> 18.7, 17.4, 18.0, NA, 19.3, 20.6, 17.8, 19.6, 18.1, 20.…\n$ body_mass_g <int> 3750, 3800, 3250, NA, 3450, 3650, 3625, 4675, 3475, 425…\n$ year <int> 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2…\n\n\n\n\n\n\nselect Example: Selecting with Helper Functions\n\n\n\n\n\n\nExample\n\n\n\nIf we want to select the columns that contain length measurements, we can manually type bill_length_mm and flipper_length_mm, but there’s actually an easier way using the contains function, also from the dplyr package. Enter a string that matches what you’re looking for among the column names.\n\n# Enter a matching string inside of a `select` call\npenguins_selected <- dplyr::select(.data = penguins, dplyr::contains(\"length\"))\n\n# Look at the product\ndplyr::glimpse(penguins_selected)\n\nRows: 344\nColumns: 2\n$ bill_length_mm <dbl> 39.1, 39.5, 40.3, NA, 36.7, 39.3, 38.9, 39.2, 34.1, …\n$ flipper_length_mm <int> 181, 186, 195, NA, 193, 190, 181, 195, 193, 190, 186…\n\n\n\n\n\n\nselect Example: Selecting a Range of Columns\n\n\n\n\n\n\nExample\n\n\n\nNow what if we wanted all the columns from the first column species to the sixth column body_mass_g? We can use a colon, :, between the first (leftmost) and last (rightmost) columns in the range that we want to include.\n\n# Use a colon to indicate a range of columns you want to select\npenguins_selected <- dplyr::select(.data = penguins, species:body_mass_g)\n\n# Look at the product\ndplyr::glimpse(penguins_selected)\n\nRows: 344\nColumns: 6\n$ species <fct> Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adel…\n$ island <fct> Torgersen, Torgersen, Torgersen, Torgersen, Torgerse…\n$ bill_length_mm <dbl> 39.1, 39.5, 40.3, NA, 36.7, 39.3, 38.9, 39.2, 34.1, …\n$ bill_depth_mm <dbl> 18.7, 17.4, 18.0, NA, 19.3, 20.6, 17.8, 19.6, 18.1, …\n$ flipper_length_mm <int> 181, 186, 195, NA, 193, 190, 181, 195, 193, 190, 186…\n$ body_mass_g <int> 3750, 3800, 3250, NA, 3450, 3650, 3625, 4675, 3475, …\n\n\nConveniently selecting a range of columns can be especially useful when you have a big dataframe and don’t want to exhaustively list every column by name.", + "text": "Selecting Columns\nTo start off, how do we do a fundamental action like selecting the columns we want? dplyr’s select function provides us with a straightforward way to do just that. We only need to provide the column names!\n\n\n\nNote that even if you select just one column, a dataframe will be returned. Whereas if you use the $ operator you get a vector (e.g., data$column returns a vector, not a dataframe).\n\nselect Example: Including & Excluding\n\n\n\n\n\n\nExample\n\n\n\nTo select only the species, island, and body_mass_g columns, we can use the following code:\n\n# Provide the name of the data and then the columns that you want!\npenguins_selected <- dplyr::select(.data = penguins, species, island, body_mass_g)\n\n# Look at the product\ndplyr::glimpse(penguins_selected)\n\nRows: 344\nColumns: 3\n$ species <fct> Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Ad…\n$ island <fct> Torgersen, Torgersen, Torgersen, Torgersen, Torgersen, Tor…\n$ body_mass_g <int> 3750, 3800, 3250, NA, 3450, 3650, 3625, 4675, 3475, 4250, …\n\n\nIf we want to remove specific columns, we can use the - operator.\n\n# Put a \"-\" in front of each column you would like to remove from your dataframe\npenguins_selected <- dplyr::select(.data = penguins, -flipper_length_mm, -sex)\n\n# Look at the product\ndplyr::glimpse(penguins_selected)\n\nRows: 344\nColumns: 6\n$ species <fct> Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie,…\n$ island <fct> Torgersen, Torgersen, Torgersen, Torgersen, Torgersen, …\n$ bill_length_mm <dbl> 39.1, 39.5, 40.3, NA, 36.7, 39.3, 38.9, 39.2, 34.1, 42.…\n$ bill_depth_mm <dbl> 18.7, 17.4, 18.0, NA, 19.3, 20.6, 17.8, 19.6, 18.1, 20.…\n$ body_mass_g <int> 3750, 3800, 3250, NA, 3450, 3650, 3625, 4675, 3475, 425…\n$ year <int> 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2…\n\n\n\n\n\n\nselect Example: Selecting with Helper Functions\n\n\n\n\n\n\nExample\n\n\n\nIf we want to select the columns that contain length measurements, we can manually type bill_length_mm and flipper_length_mm, but there’s actually an easier way using the contains function, also from the dplyr package. Enter a string that matches what you’re looking for among the column names.\n\n# Enter a matching string inside of a `select` call\npenguins_selected <- dplyr::select(.data = penguins, dplyr::contains(\"length\"))\n\n# Look at the product\ndplyr::glimpse(penguins_selected)\n\nRows: 344\nColumns: 2\n$ bill_length_mm <dbl> 39.1, 39.5, 40.3, NA, 36.7, 39.3, 38.9, 39.2, 34.1, …\n$ flipper_length_mm <int> 181, 186, 195, NA, 193, 190, 181, 195, 193, 190, 186…\n\n\n\n\n\n\nselect Example: Selecting a Range of Columns\n\n\n\n\n\n\nExample\n\n\n\nNow what if we wanted all the columns from the first column species to the sixth column body_mass_g? We can use a colon, :, between the first (leftmost) and last (rightmost) columns in the range that we want to include.\n\n# Use a colon to indicate a range of columns you want to select\npenguins_selected <- dplyr::select(.data = penguins, species:body_mass_g)\n\n# Look at the product\ndplyr::glimpse(penguins_selected)\n\nRows: 344\nColumns: 6\n$ species <fct> Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adel…\n$ island <fct> Torgersen, Torgersen, Torgersen, Torgersen, Torgerse…\n$ bill_length_mm <dbl> 39.1, 39.5, 40.3, NA, 36.7, 39.3, 38.9, 39.2, 34.1, …\n$ bill_depth_mm <dbl> 18.7, 17.4, 18.0, NA, 19.3, 20.6, 17.8, 19.6, 18.1, …\n$ flipper_length_mm <int> 181, 186, 195, NA, 193, 190, 181, 195, 193, 190, 186…\n$ body_mass_g <int> 3750, 3800, 3250, NA, 3450, 3650, 3625, 4675, 3475, …\n\n\nConveniently selecting a range of columns can be especially useful when you have a big dataframe and don’t want to exhaustively list every column by name.", "crumbs": [ "Modules", "Wrangle" @@ -81,7 +81,7 @@ "href": "wrangle.html#subsetting-rows", "title": "Wrangle", "section": "Subsetting Rows", - "text": "Subsetting Rows\nInstead of selecting certain columns, how can we get a subset of rows that meet certain conditions? For example, in the diagram below, how can we filter for rows that contain a diamond shape? We can use dplyr’s handy filter function along with logical and boolean operators!\n\nFor reference, here are the operators we can use to specify our conditions with filter.\n\nYou may have noticed that filter accepts the same operators that base R’s subset function does. This is no accident and filter is one of the more accessible tidyverse functions because of the syntax it shares with its base R equivalent.\nTo get familiar with these operators, let’s see some examples!\n\nfilter Example: Exactly Equal\n\n\n\n\n\n\nExample\n\n\n\nTo make a subset of our data that only contains information on Chinstrap penguins, we would use the == operator for “exactly equal to”\n\n# Get all the rows where the species is \"Chinstrap\" \npenguins_filtered <- dplyr::filter(.data = penguins, species == \"Chinstrap\")\n\nhead(penguins_filtered)\n\n# A tibble: 6 × 8\n species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g\n <fct> <fct> <dbl> <dbl> <int> <int>\n1 Chinstrap Dream 46.5 17.9 192 3500\n2 Chinstrap Dream 50 19.5 196 3900\n3 Chinstrap Dream 51.3 19.2 193 3650\n4 Chinstrap Dream 45.4 18.7 188 3525\n5 Chinstrap Dream 52.7 19.8 197 3725\n6 Chinstrap Dream 45.2 17.8 198 3950\n# ℹ 2 more variables: sex <fct>, year <int>\n\n\nNote that we need to write the value we’re looking for as a character string bookended by quotation marks.\n\n\n\n\nfilter Example: Either / Or\n\n\n\n\n\n\nExample\n\n\n\nWhat if we wanted to get all the rows where the penguin species is “Chinstrap” or “Gentoo”? In other words, we want all the rows where either condition is true. There are two options to do this. The first option is to use the “or” operator (|) between each of the conditions.\n\n# Get all the rows where the species is \"Chinstrap\" or \"Gentoo\"\npenguins_filtered <- dplyr::filter(.data = penguins,\n species == \"Chinstrap\" | species == \"Gentoo\")\n\nunique(penguins_filtered$species)\n\n[1] Gentoo Chinstrap\nLevels: Adelie Chinstrap Gentoo\n\n\nThis method works fine for a few options but begins to get cumbersome when you have many possible conditions that you’d like to retain. In these cases you can use the %in% operator followed by a vector of values that you want to include in your filter.\n\n# Get all the rows where the species is \"Chinstrap\" or \"Gentoo\"\npenguins_filtered <- dplyr::filter(.data = penguins,\n species %in% c(\"Chinstrap\", \"Gentoo\"))\n\nunique(penguins_filtered$species)\n\n[1] Gentoo Chinstrap\nLevels: Adelie Chinstrap Gentoo\n\n\n\n\n\n\nfilter Example: Multiple Conditions\n\n\n\n\n\n\nExample\n\n\n\nWe can also keep rows where both conditions are met by using the & operator to specify multiple conditions that must all be true. To keep only the rows where the species is “Adelie” and the island is “Dream”, we can use the following code:\n\n# Get all the rows where the species is \"Adelie\" and the island is \"Dream\"\npenguins_filtered <- dplyr::filter(.data = penguins,\n species == \"Adelie\" & island == \"Dream\")\n\ndplyr::glimpse(penguins_filtered)\n\nRows: 56\nColumns: 8\n$ species <fct> Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adel…\n$ island <fct> Dream, Dream, Dream, Dream, Dream, Dream, Dream, Dre…\n$ bill_length_mm <dbl> 39.5, 37.2, 39.5, 40.9, 36.4, 39.2, 38.8, 42.2, 37.6…\n$ bill_depth_mm <dbl> 16.7, 18.1, 17.8, 18.9, 17.0, 21.1, 20.0, 18.5, 19.3…\n$ flipper_length_mm <int> 178, 178, 188, 184, 195, 196, 190, 180, 181, 184, 18…\n$ body_mass_g <int> 3250, 3900, 3300, 3900, 3325, 4150, 3950, 3550, 3300…\n$ sex <fct> female, male, female, male, female, male, male, fema…\n$ year <int> 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007…\n\n\n\n\n\n\nfilter Example: Greater Than / Less Than\n\n\n\n\n\n\nExample\n\n\n\nWhen subsetting by numeric columns, we can use greater than (>) and less than (<) to capture the range of possible values that meet that criteria. If you want to include an “or equal to” clause, just add an equal sign to the right of the greater/less than sign (e.g., >= or <=).\nFor instance, we can subset the data for only penguins whose bills are longer than 50 millimeters.\n\n# Filter based on bill length\npenguins_filtered <- dplyr::filter(.data = penguins, bill_length_mm > 50)\n\nsort(penguins_filtered$bill_length_mm)\n\n [1] 50.1 50.1 50.2 50.2 50.2 50.3 50.4 50.4 50.5 50.5 50.5 50.5 50.5 50.6 50.7\n[16] 50.7 50.8 50.8 50.8 50.8 50.9 50.9 51.0 51.1 51.1 51.3 51.3 51.3 51.3 51.4\n[31] 51.5 51.5 51.7 51.9 52.0 52.0 52.0 52.1 52.2 52.2 52.5 52.7 52.8 53.4 53.5\n[46] 54.2 54.3 55.1 55.8 55.9 58.0 59.6\n\n\nNote that when filtering for numeric columns we do not need the quotation marks around the number(s) we use to filter.\n\n\n\n\nfilter Example: Exclusion Criteria\n\n\n\n\n\n\nExample\n\n\n\nSometimes it’s faster to subset the rows that do not meet a condition, rather than listing everything that we do want to keep. This is where the != operator (or “not equal to”) becomes useful. More generally, the exclamation mark indicates negation in the operator.\n\n# Get all the rows where the species is NOT \"Chinstrap\"\npenguins_filtered <- dplyr::filter(.data = penguins, species != \"Chinstrap\")\n\ndplyr::glimpse(penguins_filtered)\n\nRows: 276\nColumns: 8\n$ species <fct> Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adel…\n$ island <fct> Torgersen, Torgersen, Torgersen, Torgersen, Torgerse…\n$ bill_length_mm <dbl> 39.1, 39.5, 40.3, NA, 36.7, 39.3, 38.9, 39.2, 34.1, …\n$ bill_depth_mm <dbl> 18.7, 17.4, 18.0, NA, 19.3, 20.6, 17.8, 19.6, 18.1, …\n$ flipper_length_mm <int> 181, 186, 195, NA, 193, 190, 181, 195, 193, 190, 186…\n$ body_mass_g <int> 3750, 3800, 3250, NA, 3450, 3650, 3625, 4675, 3475, …\n$ sex <fct> male, female, female, NA, female, male, female, male…\n$ year <int> 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007…\n\n\n\n\n\n\nChallenge: filter\n\n\n\n\n\n\nYour Turn!\n\n\n\nUsing filter, how would you get all of the rows that do not have any NA values in the sex column?", + "text": "Subsetting Rows\nInstead of selecting certain columns, how can we get a subset of rows that meet certain conditions? For example, in the diagram below, how can we filter for rows that contain a diamond shape? We can use dplyr’s handy filter function along with logical and boolean operators!\n\n\n\nFor reference, here are the operators we can use to specify our conditions with filter.\n\n== – two items are exactly equal to one another\n!= – two items are not equal to one another\n</> – one item is less/greater than the other\n<=/>= – one item is less/greater than or equal to the other\n| – one statement or another is TRUE\n& – both statements are TRUE\n%in% – a value is in a set of other values\n\nYou may have noticed that filter accepts the same operators that base R’s subset function does. This is no accident and filter is one of the more accessible Tidyverse functions because the syntax it shares with its base R equivalent.\nTo get familiar with these operators, let’s see some examples!\n\nfilter Example: Exactly Equal\n\n\n\n\n\n\nExample\n\n\n\nTo make a subset of our data that only contains information on Chinstrap penguins, we would use the == operator for “exactly equal to”\n\n# Get all the rows where the species is \"Chinstrap\" \npenguins_filtered <- dplyr::filter(.data = penguins, species == \"Chinstrap\")\n\nhead(penguins_filtered)\n\n# A tibble: 6 × 8\n species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g\n <fct> <fct> <dbl> <dbl> <int> <int>\n1 Chinstrap Dream 46.5 17.9 192 3500\n2 Chinstrap Dream 50 19.5 196 3900\n3 Chinstrap Dream 51.3 19.2 193 3650\n4 Chinstrap Dream 45.4 18.7 188 3525\n5 Chinstrap Dream 52.7 19.8 197 3725\n6 Chinstrap Dream 45.2 17.8 198 3950\n# ℹ 2 more variables: sex <fct>, year <int>\n\n\nNote that we need to write the value we’re looking for as a character string bookended by quotation marks.\n\n\n\n\nfilter Example: Either / Or\n\n\n\n\n\n\nExample\n\n\n\nWhat if we wanted to get all the rows where the penguin species is “Chinstrap” or “Gentoo”? In other words, we want all the rows where either condition is true. There are two options to do this. The first option is to use the “or” operator (|) between each of the conditions.\n\n# Get all the rows where the species is \"Chinstrap\" or \"Gentoo\"\npenguins_filtered <- dplyr::filter(.data = penguins,\n species == \"Chinstrap\" | species == \"Gentoo\")\n\nunique(penguins_filtered$species)\n\n[1] Gentoo Chinstrap\nLevels: Adelie Chinstrap Gentoo\n\n\nThis method works fine for a few options but begins to get cumbersome when you have many possible conditions that you’d like to retain. In these cases you can use the %in% operator followed by a vector of values that you want to include in your filter.\n\n# Get all the rows where the species is \"Chinstrap\" or \"Gentoo\"\npenguins_filtered <- dplyr::filter(.data = penguins,\n species %in% c(\"Chinstrap\", \"Gentoo\"))\n\nunique(penguins_filtered$species)\n\n[1] Gentoo Chinstrap\nLevels: Adelie Chinstrap Gentoo\n\n\n\n\n\n\nfilter Example: Multiple Conditions\n\n\n\n\n\n\nExample\n\n\n\nWe can also keep rows where both conditions are met by using the & operator to specify multiple conditions that must all be true. To keep only the rows where the species is “Adelie” and the island is “Dream”, we can use the following code:\n\n# Get all the rows where the species is \"Adelie\" and the island is \"Dream\"\npenguins_filtered <- dplyr::filter(.data = penguins,\n species == \"Adelie\" & island == \"Dream\")\n\ndplyr::glimpse(penguins_filtered)\n\nRows: 56\nColumns: 8\n$ species <fct> Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adel…\n$ island <fct> Dream, Dream, Dream, Dream, Dream, Dream, Dream, Dre…\n$ bill_length_mm <dbl> 39.5, 37.2, 39.5, 40.9, 36.4, 39.2, 38.8, 42.2, 37.6…\n$ bill_depth_mm <dbl> 16.7, 18.1, 17.8, 18.9, 17.0, 21.1, 20.0, 18.5, 19.3…\n$ flipper_length_mm <int> 178, 178, 188, 184, 195, 196, 190, 180, 181, 184, 18…\n$ body_mass_g <int> 3250, 3900, 3300, 3900, 3325, 4150, 3950, 3550, 3300…\n$ sex <fct> female, male, female, male, female, male, male, fema…\n$ year <int> 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007…\n\n\n\n\n\n\nfilter Example: Greater Than / Less Than\n\n\n\n\n\n\nExample\n\n\n\nWhen subsetting by numeric columns, we can use greater than (>) and less than (<) to capture the range of possible values that meet that criteria. If you want to include an “or equal to” clause, just add an equal sign to the right of the greater/less than sign (e.g., >= or <=).\nFor instance, we can subset the data for only penguins whose bills are longer than 50 millimeters.\n\n# Filter based on bill length\npenguins_filtered <- dplyr::filter(.data = penguins, bill_length_mm > 50)\n\nsort(penguins_filtered$bill_length_mm)\n\n [1] 50.1 50.1 50.2 50.2 50.2 50.3 50.4 50.4 50.5 50.5 50.5 50.5 50.5 50.6 50.7\n[16] 50.7 50.8 50.8 50.8 50.8 50.9 50.9 51.0 51.1 51.1 51.3 51.3 51.3 51.3 51.4\n[31] 51.5 51.5 51.7 51.9 52.0 52.0 52.0 52.1 52.2 52.2 52.5 52.7 52.8 53.4 53.5\n[46] 54.2 54.3 55.1 55.8 55.9 58.0 59.6\n\n\nNote that when filtering for numeric columns we do not need the quotation marks around the number(s) we use to filter.\n\n\n\n\nfilter Example: Exclusion Criteria\n\n\n\n\n\n\nExample\n\n\n\nSometimes it’s faster to subset the rows that do not meet a condition, rather than listing everything that we do want to keep. This is where the != operator (or “not equal to”) becomes useful. More generally, the exclamation mark indicates negation in the operator.\n\n# Get all the rows where the species is NOT \"Chinstrap\"\npenguins_filtered <- dplyr::filter(.data = penguins, species != \"Chinstrap\")\n\ndplyr::glimpse(penguins_filtered)\n\nRows: 276\nColumns: 8\n$ species <fct> Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adel…\n$ island <fct> Torgersen, Torgersen, Torgersen, Torgersen, Torgerse…\n$ bill_length_mm <dbl> 39.1, 39.5, 40.3, NA, 36.7, 39.3, 38.9, 39.2, 34.1, …\n$ bill_depth_mm <dbl> 18.7, 17.4, 18.0, NA, 19.3, 20.6, 17.8, 19.6, 18.1, …\n$ flipper_length_mm <int> 181, 186, 195, NA, 193, 190, 181, 195, 193, 190, 186…\n$ body_mass_g <int> 3750, 3800, 3250, NA, 3450, 3650, 3625, 4675, 3475, …\n$ sex <fct> male, female, female, NA, female, male, female, male…\n$ year <int> 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007…\n\n\n\n\n\n\nChallenge: filter\n\n\n\n\n\n\nYour Turn!\n\n\n\nUsing filter, how would you get all of the rows that do not have any NA values in the sex column?", "crumbs": [ "Modules", "Wrangle" @@ -92,7 +92,7 @@ "href": "wrangle.html#making-and-modifying-columns", "title": "Wrangle", "section": "Making and Modifying Columns", - "text": "Making and Modifying Columns\nAside from selecting columns and subsetting rows, we may want to create new columns in our data. For instance, in the diagram below, we have a dataframe that only contains column A, and then we add new columns B and C. We can use dplyr’s mutate function to add a new column, while keeping the existing columns.\n\nThe general syntax to add a new column to your dataframe is as follows:\n\nyour_data_v2 <- dplyr::mutate(.data = your_data, new_column_name = what_it_contains)\n\n\nmutate Example: Making New Columns\n\n\n\n\n\n\nExample\n\n\n\nIf we wanted to add a new column that has the penguin’s body mass in kilograms, we can do some arithmetic on the body_mass_g column and store the result in a new column.\n\n# Create a new column with the penguins' body mass in kilograms\npenguins_mutated <- dplyr::mutate(.data = penguins, body_mass_kg = body_mass_g / 1000)\n\ndplyr::glimpse(penguins_mutated)\n\nRows: 344\nColumns: 9\n$ species <fct> Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adel…\n$ island <fct> Torgersen, Torgersen, Torgersen, Torgersen, Torgerse…\n$ bill_length_mm <dbl> 39.1, 39.5, 40.3, NA, 36.7, 39.3, 38.9, 39.2, 34.1, …\n$ bill_depth_mm <dbl> 18.7, 17.4, 18.0, NA, 19.3, 20.6, 17.8, 19.6, 18.1, …\n$ flipper_length_mm <int> 181, 186, 195, NA, 193, 190, 181, 195, 193, 190, 186…\n$ body_mass_g <int> 3750, 3800, 3250, NA, 3450, 3650, 3625, 4675, 3475, …\n$ sex <fct> male, female, female, NA, female, male, female, male…\n$ year <int> 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007…\n$ body_mass_kg <dbl> 3.750, 3.800, 3.250, NA, 3.450, 3.650, 3.625, 4.675,…\n\n\n\n\n\n\nmutate Example: Overwriting Existing Columns\n\n\n\n\n\n\nExample\n\n\n\nAdditionally, mutate can be used to overwrite an existing column. If we give the new column the same name as an existing column, the existing column will be replaced. As you can see, island is currently a factor. To change its class to a character, we would need to overwrite the column.\n\n# Check current format of the `island` column\nclass(penguins$island)\n\n[1] \"factor\"\n\n# Modify the existing island column\npenguins_mutated <- dplyr::mutate(.data = penguins, island = as.character(island))\n\n# the `island` column is now a character!\nclass(penguins_mutated$island)\n\n[1] \"character\"\n\n\nNow island is a character column!\n\n\n\n\nConditional Operations\nSometimes in data wrangling we’ll want to generate a new column where the contents of the column are dependent upon an existing column but we have many separate “if X then Y” type statements. Such statements are called “conditional” statements in programming. You may already be familiar with base R’s ifelse function for handling cases where you have an either/or condition.\nIn the tidyverse–specifically dplyr–we have case_when for handling multiple conditions in an efficient and relatively straightforward way! Why are we talking about case_when here? Because you can use case_when inside of a mutate to create a new column based on the conditions that you specify.\nHere is what the general syntax for this operation looks like:\n\nyour_data_v2 <- dplyr::mutate(.data = your_data,\n new_column_name = dplyr::case_when(\n condition1 ~ value_for_condition1,\n condition2 ~ value_for_condition2,\n condition3 ~ value_for_condition3,\n ...\n TRUE ~ value_if_no_conditions_are_met))\n\nLet’s look at an example to make this somewhat more tangible.\n\n\nmutate + case_when Example: Creating a New Column Conditionally\n\n\n\n\n\n\nExample\n\n\n\nSuppose we want to add a new column called flipper_rank that contains the following:\n\n“short” if flipper_length_mm is < 190 mm\n“long” if flipper_length_mm is >= 190 mm\n\n\n# Enter your conditions on the left side and the values on the right side of the tilde\npenguins_mutated <- dplyr::mutate(.data = penguins,\n flipper_rank = dplyr::case_when(\n flipper_length_mm < 190 ~ \"short\",\n flipper_length_mm >= 190 ~ \"long\")\n)\n\ndplyr::glimpse(penguins_mutated)\n\nRows: 344\nColumns: 9\n$ species <fct> Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adel…\n$ island <fct> Torgersen, Torgersen, Torgersen, Torgersen, Torgerse…\n$ bill_length_mm <dbl> 39.1, 39.5, 40.3, NA, 36.7, 39.3, 38.9, 39.2, 34.1, …\n$ bill_depth_mm <dbl> 18.7, 17.4, 18.0, NA, 19.3, 20.6, 17.8, 19.6, 18.1, …\n$ flipper_length_mm <int> 181, 186, 195, NA, 193, 190, 181, 195, 193, 190, 186…\n$ body_mass_g <int> 3750, 3800, 3250, NA, 3450, 3650, 3625, 4675, 3475, …\n$ sex <fct> male, female, female, NA, female, male, female, male…\n$ year <int> 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007…\n$ flipper_rank <chr> \"short\", \"short\", \"long\", NA, \"long\", \"long\", \"short…\n\n\n\n\n\n\nChallenge: mutate + case_when\n\n\n\n\n\n\nYour Turn!\n\n\n\nUsing mutate and case_when, create a new column called size_bin that contains the following:\n\n“large” if body mass is greater than 4500 grams\n“medium” if body mass is greater than 3000 grams, and less than or equal to 4500 grams\n“small” if body mass is less than or equal to 3000 grams\n\n\n\n\n\nSplitting a Column into Multiple Columns\nAnother relatively common task in data wrangling involves splitting the contents of one column into several columns. To demonstrate, let’s first make a new column that contains the full scientific names for these penguins using mutate and case_when.\n\n# Remember that conditions are on the left side and the values are on the right side of the tilde\npenguins_v1 <- dplyr::mutate(.data = penguins, \n scientific_name = dplyr::case_when(\n species == \"Adelie\" ~ \"Pygoscelis_adeliae\",\n species == \"Chinstrap\" ~ \"Pygoscelis_antarcticus\",\n species == \"Gentoo\" ~ \"Pygoscelis_papua\"))\n\ndplyr::glimpse(penguins_v1)\n\nRows: 344\nColumns: 9\n$ species <fct> Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adel…\n$ island <fct> Torgersen, Torgersen, Torgersen, Torgersen, Torgerse…\n$ bill_length_mm <dbl> 39.1, 39.5, 40.3, NA, 36.7, 39.3, 38.9, 39.2, 34.1, …\n$ bill_depth_mm <dbl> 18.7, 17.4, 18.0, NA, 19.3, 20.6, 17.8, 19.6, 18.1, …\n$ flipper_length_mm <int> 181, 186, 195, NA, 193, 190, 181, 195, 193, 190, 186…\n$ body_mass_g <int> 3750, 3800, 3250, NA, 3450, 3650, 3625, 4675, 3475, …\n$ sex <fct> male, female, female, NA, female, male, female, male…\n$ year <int> 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007…\n$ scientific_name <chr> \"Pygoscelis_adeliae\", \"Pygoscelis_adeliae\", \"Pygosce…\n\n\nIf we want to split the scientific name into genus and specific epithet, we can use the separate_wider_delim function from the tidyr package.\n\n\nseparate_wider_delim Example: Splitting a Column Apart\n\n\n\n\n\n\nExample\n\n\n\nUsing our new scientific name column, suppose we want to split it so that scientific_name becomes two columns: genus and epithet. Using tidyr’s separate_wider_delim function we can do this in a single step!\n\n# Indicate the column you want to split, the separator, and the new column names!\npenguins_separated <- tidyr::separate_wider_delim(data = penguins_v1,\n cols = scientific_name,\n delim = \"_\",\n names = c(\"genus\", \"epithet\"))\n\ndplyr::glimpse(penguins_separated)\n\nRows: 344\nColumns: 10\n$ species <fct> Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adel…\n$ island <fct> Torgersen, Torgersen, Torgersen, Torgersen, Torgerse…\n$ bill_length_mm <dbl> 39.1, 39.5, 40.3, NA, 36.7, 39.3, 38.9, 39.2, 34.1, …\n$ bill_depth_mm <dbl> 18.7, 17.4, 18.0, NA, 19.3, 20.6, 17.8, 19.6, 18.1, …\n$ flipper_length_mm <int> 181, 186, 195, NA, 193, 190, 181, 195, 193, 190, 186…\n$ body_mass_g <int> 3750, 3800, 3250, NA, 3450, 3650, 3625, 4675, 3475, …\n$ sex <fct> male, female, female, NA, female, male, female, male…\n$ year <int> 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007…\n$ genus <chr> \"Pygoscelis\", \"Pygoscelis\", \"Pygoscelis\", \"Pygosceli…\n$ epithet <chr> \"adeliae\", \"adeliae\", \"adeliae\", \"adeliae\", \"adeliae…", + "text": "Making and Modifying Columns\nAside from selecting columns and subsetting rows, we may want to create new columns in our data. For instance, in the diagram below, we have a dataframe that only contains column A, and then we add new columns B and C. We can use dplyr’s mutate function to add a new column, while keeping the existing columns.\n\n\n\nThe general syntax to add a new column to your dataframe is as follows:\n\nyour_data_v2 <- dplyr::mutate(.data = your_data, new_column_name = what_it_contains)\n\n\nmutate Example: Making New Columns\n\n\n\n\n\n\nExample\n\n\n\nIf we wanted to add a new column that has the penguin’s body mass in kilograms, we can do some arithmetic on the body_mass_g column and store the result in a new column.\n\n# Create a new column with the penguins' body mass in kilograms\npenguins_mutated <- dplyr::mutate(.data = penguins, body_mass_kg = body_mass_g / 1000)\n\ndplyr::glimpse(penguins_mutated)\n\nRows: 344\nColumns: 9\n$ species <fct> Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adel…\n$ island <fct> Torgersen, Torgersen, Torgersen, Torgersen, Torgerse…\n$ bill_length_mm <dbl> 39.1, 39.5, 40.3, NA, 36.7, 39.3, 38.9, 39.2, 34.1, …\n$ bill_depth_mm <dbl> 18.7, 17.4, 18.0, NA, 19.3, 20.6, 17.8, 19.6, 18.1, …\n$ flipper_length_mm <int> 181, 186, 195, NA, 193, 190, 181, 195, 193, 190, 186…\n$ body_mass_g <int> 3750, 3800, 3250, NA, 3450, 3650, 3625, 4675, 3475, …\n$ sex <fct> male, female, female, NA, female, male, female, male…\n$ year <int> 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007…\n$ body_mass_kg <dbl> 3.750, 3.800, 3.250, NA, 3.450, 3.650, 3.625, 4.675,…\n\n\n\n\n\n\nmutate Example: Overwriting Existing Columns\n\n\n\n\n\n\nExample\n\n\n\nAdditionally, mutate can be used to overwrite an existing column. If we give the new column the same name as an existing column, the existing column will be replaced. As you can see, island is currently a factor. To change its class to a character, we would need to overwrite the column.\n\n# Check current format of the `island` column\nclass(penguins$island)\n\n[1] \"factor\"\n\n# Modify the existing island column\npenguins_mutated <- dplyr::mutate(.data = penguins, island = as.character(island))\n\n# the `island` column is now a character!\nclass(penguins_mutated$island)\n\n[1] \"character\"\n\n\nNow island is a character column!\n\n\n\n\nConditional Operations\nSometimes in data wrangling we’ll want to generate a new column where the contents of the column are dependent upon an existing column but we have many separate “if X then Y” type statements. Such statements are called “conditional” statements in programming. You may already be familiar with base R’s ifelse function for handling cases where you have an either/or condition.\nIn the Tidyverse–specifically dplyr–we have case_when for handling multiple conditions in an efficient and relatively straightforward way! Why are we talking about case_when here? Because you can use case_when inside of a mutate to create a new column based on the conditions that you specify.\nHere is what the general syntax for this operation looks like:\n\nyour_data_v2 <- dplyr::mutate(.data = your_data,\n new_column_name = dplyr::case_when(\n condition1 ~ value_for_condition1,\n condition2 ~ value_for_condition2,\n condition3 ~ value_for_condition3,\n ...\n TRUE ~ value_if_no_conditions_are_met))\n\nLet’s look at an example to make this somewhat more tangible.\n\n\nmutate + case_when Example: Creating a New Column Conditionally\n\n\n\n\n\n\nExample\n\n\n\nSuppose we want to add a new column called flipper_rank that contains the following:\n\n“short” if flipper_length_mm is < 190 mm\n“long” if flipper_length_mm is >= 190 mm\n\n\n# Enter your conditions on the left side and the values on the right side of the tilde\npenguins_mutated <- dplyr::mutate(.data = penguins,\n flipper_rank = dplyr::case_when(\n flipper_length_mm < 190 ~ \"short\",\n flipper_length_mm >= 190 ~ \"long\")\n)\n\ndplyr::glimpse(penguins_mutated)\n\nRows: 344\nColumns: 9\n$ species <fct> Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adel…\n$ island <fct> Torgersen, Torgersen, Torgersen, Torgersen, Torgerse…\n$ bill_length_mm <dbl> 39.1, 39.5, 40.3, NA, 36.7, 39.3, 38.9, 39.2, 34.1, …\n$ bill_depth_mm <dbl> 18.7, 17.4, 18.0, NA, 19.3, 20.6, 17.8, 19.6, 18.1, …\n$ flipper_length_mm <int> 181, 186, 195, NA, 193, 190, 181, 195, 193, 190, 186…\n$ body_mass_g <int> 3750, 3800, 3250, NA, 3450, 3650, 3625, 4675, 3475, …\n$ sex <fct> male, female, female, NA, female, male, female, male…\n$ year <int> 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007…\n$ flipper_rank <chr> \"short\", \"short\", \"long\", NA, \"long\", \"long\", \"short…\n\n\n\n\n\n\nChallenge: mutate + case_when\n\n\n\n\n\n\nYour Turn!\n\n\n\nUsing mutate and case_when, create a new column called size_bin that contains the following:\n\n“large” if body mass is greater than 4500 grams\n“medium” if body mass is greater than 3000 grams, and less than or equal to 4500 grams\n“small” if body mass is less than or equal to 3000 grams\n\n\n\n\n\nSplitting a Column into Multiple Columns\nAnother relatively common task in data wrangling involves splitting the contents of one column into several columns. To demonstrate, let’s first make a new column that contains the full scientific names for these penguins using mutate and case_when.\n\n# Remember that conditions are on the left side and the values are on the right side of the tilde\npenguins_v1 <- dplyr::mutate(.data = penguins, \n scientific_name = dplyr::case_when(\n species == \"Adelie\" ~ \"Pygoscelis_adeliae\",\n species == \"Chinstrap\" ~ \"Pygoscelis_antarcticus\",\n species == \"Gentoo\" ~ \"Pygoscelis_papua\"))\n\ndplyr::glimpse(penguins_v1)\n\nRows: 344\nColumns: 9\n$ species <fct> Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adel…\n$ island <fct> Torgersen, Torgersen, Torgersen, Torgersen, Torgerse…\n$ bill_length_mm <dbl> 39.1, 39.5, 40.3, NA, 36.7, 39.3, 38.9, 39.2, 34.1, …\n$ bill_depth_mm <dbl> 18.7, 17.4, 18.0, NA, 19.3, 20.6, 17.8, 19.6, 18.1, …\n$ flipper_length_mm <int> 181, 186, 195, NA, 193, 190, 181, 195, 193, 190, 186…\n$ body_mass_g <int> 3750, 3800, 3250, NA, 3450, 3650, 3625, 4675, 3475, …\n$ sex <fct> male, female, female, NA, female, male, female, male…\n$ year <int> 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007…\n$ scientific_name <chr> \"Pygoscelis_adeliae\", \"Pygoscelis_adeliae\", \"Pygosce…\n\n\nIf we want to split the scientific name into genus and specific epithet, we can use the separate_wider_delim function from the tidyr package.\n\n\nseparate_wider_delim Example: Splitting a Column Apart\n\n\n\n\n\n\nExample\n\n\n\nUsing our new scientific name column, suppose we want to split it so that scientific_name becomes two columns: genus and epithet. Using tidyr’s separate_wider_delim function we can do this in a single step!\n\n# Indicate the column you want to split, the separator, and the new column names!\npenguins_separated <- tidyr::separate_wider_delim(data = penguins_v1,\n cols = scientific_name,\n delim = \"_\",\n names = c(\"genus\", \"epithet\"))\n\ndplyr::glimpse(penguins_separated)\n\nRows: 344\nColumns: 10\n$ species <fct> Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adel…\n$ island <fct> Torgersen, Torgersen, Torgersen, Torgersen, Torgerse…\n$ bill_length_mm <dbl> 39.1, 39.5, 40.3, NA, 36.7, 39.3, 38.9, 39.2, 34.1, …\n$ bill_depth_mm <dbl> 18.7, 17.4, 18.0, NA, 19.3, 20.6, 17.8, 19.6, 18.1, …\n$ flipper_length_mm <int> 181, 186, 195, NA, 193, 190, 181, 195, 193, 190, 186…\n$ body_mass_g <int> 3750, 3800, 3250, NA, 3450, 3650, 3625, 4675, 3475, …\n$ sex <fct> male, female, female, NA, female, male, female, male…\n$ year <int> 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007…\n$ genus <chr> \"Pygoscelis\", \"Pygoscelis\", \"Pygoscelis\", \"Pygosceli…\n$ epithet <chr> \"adeliae\", \"adeliae\", \"adeliae\", \"adeliae\", \"adeliae…", "crumbs": [ "Modules", "Wrangle" @@ -307,21 +307,21 @@ ] }, { - "objectID": "index.html#programs-to-install", - "href": "index.html#programs-to-install", + "objectID": "index.html#workshop-preparation", + "href": "index.html#workshop-preparation", "title": "Overview", - "section": "Programs to Install", - "text": "Programs to Install\n\nR & RStudio\nInstall R and its more convenient (in our opinion) user-interface: RStudio.\nIf you already have R, check that you have at least version 4.0.0 by running the following code:\n\nversion$version.string\n\nIf your version starts with a 3 (e.g., the above code returns “R version 3…”), please update R to make sure all packages behave as expected.\n\n\nR Packages\nInstall the tidyverse and palmerpenguins R packages using the following code:\n\ninstall.packages(c(\"tidyverse\", \"palmerpenguins\"))\nlibrary(tidyverse)\nlibrary(palmerpenguins)\n\nPlease run the above code even if you already have these packages to update these packages and ensure that your code aligns with the examples and challenges introduced during the workshop.", + "section": "Workshop Preparation", + "text": "Workshop Preparation\nFor those of you with a dedicated IT team that has sole power to install software on your computer: you may need to contact them before the workshop to do the installation bits of the prep steps we outline below.\n\n1. Install R\nInstall R. If you already have R, check that you have at least version 4.0.0 by running the following code:\n\nversion$version.string\n\nIf your version starts with a 3 (e.g., the above code returns “R version 3…”), please update R to make sure all packages behave as expected.\n\n\n2. Install RStudio\nOnce you have R (ver. ≥4.0), install RStudio. If you already have RStudio installed, you may want to make sure that you’re using a recent version to take advantage of some quality of life improvements that are broadly useful.\n\n\n3. Install Some R Packages\nInstall the tidyverse and palmerpenguins R packages using the following code:\n\ninstall.packages(\"librarian\")\nlibrarian::shelf(tidyverse, palmerpenguins)\n\nPlease run the above code even if you already have these packages to update these packages and ensure that your code aligns with the examples and challenges introduced during the workshop.\n\n\n4. Celebrate!\nAfter following all the previous preparation steps, your setup should now be complete.", "crumbs": [ "Workshop Home" ] }, { - "objectID": "index.html#penguin-data", - "href": "index.html#penguin-data", + "objectID": "index.html#example-data---penguins", + "href": "index.html#example-data---penguins", "title": "Overview", - "section": "Penguin Data", - "text": "Penguin Data\nThe data we’ll be using for this workshop comes from the palmerpenguins package, maintained by Allison Horst. The “penguins” dataset from this package contains size measurements for adult foraging penguins near Palmer Station, Antarctica. Data were collected and made available by Dr. Kristen Gorman and the Palmer Station Long Term Ecological Research (LTER) Program. Let’s take a look at it!\n\npenguins\n\n# A tibble: 344 × 8\n species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g\n <fct> <fct> <dbl> <dbl> <int> <int>\n 1 Adelie Torgersen 39.1 18.7 181 3750\n 2 Adelie Torgersen 39.5 17.4 186 3800\n 3 Adelie Torgersen 40.3 18 195 3250\n 4 Adelie Torgersen NA NA NA NA\n 5 Adelie Torgersen 36.7 19.3 193 3450\n 6 Adelie Torgersen 39.3 20.6 190 3650\n 7 Adelie Torgersen 38.9 17.8 181 3625\n 8 Adelie Torgersen 39.2 19.6 195 4675\n 9 Adelie Torgersen 34.1 18.1 193 3475\n10 Adelie Torgersen 42 20.2 190 4250\n# ℹ 334 more rows\n# ℹ 2 more variables: sex <fct>, year <int>\n\n\nThe “penguins” dataset has 344 rows and 8 columns.\nThe columns are as follows:\n\nspecies: a factor denoting penguin species (Adélie, Chinstrap and Gentoo)\nisland: a factor denoting island in Palmer Archipelago, Antarctica (Biscoe, Dream or Torgersen)\nbill_length_mm: a number denoting bill length (millimeters)\nbill_depth_mm: a number denoting bill depth (millimeters)\nflipper_length_mm: an integer denoting flipper length (millimeters)\nbody_mass_g: an integer denoting body mass (grams)\nsex: a factor denoting penguin sex (female, male)\nyear: an integer denoting the study year (2007, 2008, or 2009)\n\nThis dataset is an example of tidy data, which means that each variable is in its own column and each observation is in its own row. Generally speaking, functions from packages in the Tidyverse expect tidy data though they can be used in some cases to help get data into tidy format! Regardless, the penguins dataset is what we’ll use for all examples in this workshop so be sure that you install the palmerpenguins R package. The examples on this page were adapted from Allison Horst’s dplyr tutorial!", + "section": "Example Data - Penguins", + "text": "Example Data - Penguins\nThe data we’ll be using for this workshop comes from the palmerpenguins package, maintained by Allison Horst. The “penguins” dataset from this package contains size measurements for adult foraging penguins near Palmer Station, Antarctica. Data were collected and made available by Dr. Kristen Gorman and the Palmer Station Long Term Ecological Research (LTER) Program. Let’s take a look at it!\n\npenguins\n\n# A tibble: 344 × 8\n species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g\n <fct> <fct> <dbl> <dbl> <int> <int>\n 1 Adelie Torgersen 39.1 18.7 181 3750\n 2 Adelie Torgersen 39.5 17.4 186 3800\n 3 Adelie Torgersen 40.3 18 195 3250\n 4 Adelie Torgersen NA NA NA NA\n 5 Adelie Torgersen 36.7 19.3 193 3450\n 6 Adelie Torgersen 39.3 20.6 190 3650\n 7 Adelie Torgersen 38.9 17.8 181 3625\n 8 Adelie Torgersen 39.2 19.6 195 4675\n 9 Adelie Torgersen 34.1 18.1 193 3475\n10 Adelie Torgersen 42 20.2 190 4250\n# ℹ 334 more rows\n# ℹ 2 more variables: sex <fct>, year <int>\n\n\nThe “penguins” dataset has 344 rows and 8 columns.\nThe columns are as follows:\n\nspecies: a factor denoting penguin species (Adélie, Chinstrap and Gentoo)\nisland: a factor denoting island in Palmer Archipelago, Antarctica (Biscoe, Dream or Torgersen)\nbill_length_mm: a number denoting bill length (millimeters)\nbill_depth_mm: a number denoting bill depth (millimeters)\nflipper_length_mm: an integer denoting flipper length (millimeters)\nbody_mass_g: an integer denoting body mass (grams)\nsex: a factor denoting penguin sex (female, male)\nyear: an integer denoting the study year (2007, 2008, or 2009)\n\nThis dataset is an example of tidy data, which means that each variable is in its own column and each observation is in its own row. Generally speaking, functions from packages in the Tidyverse expect tidy data though they can be used in some cases to help get data into tidy format! Regardless, the penguins dataset is what we’ll use for all examples in this workshop so be sure that you install the palmerpenguins R package. The examples on this page were adapted from Allison Horst’s dplyr tutorial!", "crumbs": [ "Workshop Home" ] diff --git a/sitemap.xml b/sitemap.xml index 52f0eb1..d4a699f 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -2,26 +2,26 @@ https://lter.github.io/workshop-tidyverse/join.html - 2024-08-22T15:02:18.488Z + 2024-08-22T15:14:04.379Z https://lter.github.io/workshop-tidyverse/wrangle.html - 2024-08-22T15:02:18.488Z + 2024-08-22T15:14:04.379Z https://lter.github.io/workshop-tidyverse/reshape.html - 2024-08-22T15:02:18.488Z + 2024-08-22T15:14:04.379Z https://lter.github.io/workshop-tidyverse/summarize.html - 2024-08-22T15:02:18.488Z + 2024-08-22T15:14:04.379Z https://lter.github.io/workshop-tidyverse/visualize.html - 2024-08-22T15:02:18.488Z + 2024-08-22T15:14:04.379Z https://lter.github.io/workshop-tidyverse/index.html - 2024-08-22T15:02:18.488Z + 2024-08-22T15:14:04.379Z diff --git a/wrangle.html b/wrangle.html index e3be1a3..04bcd74 100644 --- a/wrangle.html +++ b/wrangle.html @@ -305,7 +305,7 @@

      Module Learning

      What are Tidy Data?

      -

      What are some common things you like to do with your data? Maybe remove rows or columns, do calculations and add the results as new columns? These operations (and others) are called “data wrangling”. The data we get to work with are rarely, if ever, in the format we need to do our analyses and data wrangling can help bridge that gap. dplyr and tidyr are two R packages from the tidyverse that provide a fairly complete and extremely powerful set of functions for us to do virtually all needed wrangling quickly. Here we introduce some commonly used functions from these two packages.

      +

      What are some common things you like to do with your data? Maybe remove rows or columns, do calculations and add the results as new columns? These operations (and others) are called “data wrangling”. The data we get to work with are rarely, if ever, in the format we need to do our analyses and data wrangling can help bridge that gap. dplyr and tidyr are two R packages from the Tidyverse that provide a fairly complete and extremely powerful set of functions for us to do virtually all needed wrangling quickly. Here we introduce some commonly used functions from these two packages.

      We can use glimpse from the dplyr package to look at part of the data while also getting some relevant structural information (i.e., what type of data are in each column, etc.).

      # install.packages("tidyverse", "palmerpenguins")
      @@ -330,7 +330,9 @@ 

      What are Tidy Data?

      Selecting Columns

      To start off, how do we do a fundamental action like selecting the columns we want? dplyr’s select function provides us with a straightforward way to do just that. We only need to provide the column names!

      -

      +

      +Graphic of a dataframe with columns labeled 'A', 'B', and 'C' being pare down to just the 'A' column +

      Note that even if you select just one column, a dataframe will be returned. Whereas if you use the $ operator you get a vector (e.g., data$column returns a vector, not a dataframe).

      select Example: Including & Excluding

      @@ -447,10 +449,20 @@

      Subsetting Rows

      Instead of selecting certain columns, how can we get a subset of rows that meet certain conditions? For example, in the diagram below, how can we filter for rows that contain a diamond shape? We can use dplyr’s handy filter function along with logical and boolean operators!

      -

      +

      +Graphic of a table with only an 'A' column and rows with different shapes getting subsetted to only the row with a diamond +

      For reference, here are the operators we can use to specify our conditions with filter.

      -

      -

      You may have noticed that filter accepts the same operators that base R’s subset function does. This is no accident and filter is one of the more accessible tidyverse functions because of the syntax it shares with its base R equivalent.

      +
        +
      • == – two items are exactly equal to one another
      • +
      • != – two items are not equal to one another
      • +
      • </> – one item is less/greater than the other
      • +
      • <=/>= – one item is less/greater than or equal to the other
      • +
      • | – one statement or another is TRUE
      • +
      • &both statements are TRUE
      • +
      • %in% – a value is in a set of other values
      • +
      +

      You may have noticed that filter accepts the same operators that base R’s subset function does. This is no accident and filter is one of the more accessible Tidyverse functions because the syntax it shares with its base R equivalent.

      To get familiar with these operators, let’s see some examples!

      filter Example: Exactly Equal

      @@ -645,7 +657,9 @@

      Challenge: filter

      Making and Modifying Columns

      Aside from selecting columns and subsetting rows, we may want to create new columns in our data. For instance, in the diagram below, we have a dataframe that only contains column A, and then we add new columns B and C. We can use dplyr’s mutate function to add a new column, while keeping the existing columns.

      -

      +

      +Graphic of a table with an 'A' column gaining a 'B' and 'C' column +

      The general syntax to add a new column to your dataframe is as follows:

      your_data_v2 <- dplyr::mutate(.data = your_data, new_column_name = what_it_contains)
      @@ -720,7 +734,7 @@

      Conditional Operations

      Sometimes in data wrangling we’ll want to generate a new column where the contents of the column are dependent upon an existing column but we have many separate “if X then Y” type statements. Such statements are called “conditional” statements in programming. You may already be familiar with base R’s ifelse function for handling cases where you have an either/or condition.

      -

      In the tidyverse–specifically dplyr–we have case_when for handling multiple conditions in an efficient and relatively straightforward way! Why are we talking about case_when here? Because you can use case_when inside of a mutate to create a new column based on the conditions that you specify.

      +

      In the Tidyverse–specifically dplyr–we have case_when for handling multiple conditions in an efficient and relatively straightforward way! Why are we talking about case_when here? Because you can use case_when inside of a mutate to create a new column based on the conditions that you specify.

      Here is what the general syntax for this operation looks like:

      your_data_v2 <- dplyr::mutate(.data = your_data,