{ "cells": [ { "cell_type": "markdown", "metadata": { "raw_mimetype": "text/markdown", "slideshow": { "slide_type": "slide" } }, "source": [ "# In this workshop you will learn:\n", "- Basics of R (objects, variables, data classes, vectors)\n", "- How to write R functions\n", "- How to import and export your own files\n", "- How to install and load R and Bioconductor packages\n", "\n", "# What is R?\n", "- R is a language and environment for statistical computing and graphics (https://www.r-project.org/about.html). \n", "- It is free and can be tailored to your needs by installing and using specific packages (https://cran.r-project.org/web/packages/available_packages_by_name.html).\n", "- You can use R interactively (e.g., enter commands into the R console or R Studio https://rstudio.com/) or into new cells in your Jupyter notebook.\n", "- You can write and run R scripts or generate reports and documents using R notebooks (https://blog.rstudio.com/2016/10/05/r-notebooks/) and markdown files (https://rmarkdown.rstudio.com/)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Interacting with R\n", "- You can use R interactively and have it do some simple math:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/html": [ "1" ], "text/latex": [ "1" ], "text/markdown": [ "1" ], "text/plain": [ "[1] 1" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "2 - 1" ] }, { "cell_type": "markdown", "metadata": { "raw_mimetype": "text/markdown", "slideshow": { "slide_type": "slide" } }, "source": [ "- It is generally more useful to assign your values to **variables**, which are R objects.\n", "- You can assign values to R variables using the assignment operator **'<-'**, which assigns the value on the right to the variable on the left.\n", "- There are other operators as well (like the `=` sign) but I would suggest you stick with the `<-` operator for now.\n", "- Everything in R (including variables) is an object (https://cran.r-project.org/doc/manuals/r-release/R-lang.html#Objects)\n", "\n", "
\n", "Tip: We will use the words `object` and `variable` interchangably in this workshop.\n", "
\n", "\n", "Let's assign a variable called `a`:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "a <- 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "R won't print anything when you assign a value to a variable. We can look at the output of our assignment by typing `a`." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "1" ], "text/latex": [ "1" ], "text/markdown": [ "1" ], "text/plain": [ "[1] 1" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "a" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- R also comes with a `print()` function that we can use to look at our variables.\n", "- We will talk more about functions later in this workshop, but a **function** is a series of statements that work together to perform a specific task.\n", "- All functions need pieces of information (or **arguments**) to perform their particular function, these arguments can be required or optional. \n", "- `print()` takes a single required argument -- the thing you want to print.\n", "\n", "
\n", "Tip: You can use `?function` in R to learn more about a particular function (for example: `?print`).\n", "
\n", "\n", "- Let's print variable `a`:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1] 1\n" ] } ], "source": [ "print(a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can name our variables any combination of letters, numbers, or underscores (`_`) with a few exceptions:\n", "- R has a few reserved words that can't be used as variable names in R:\n", " - `if`, `else`, `repeat`, `while`, `function`, `for`, `in`\n", " - see the whole list of reserved words here: https://stat.ethz.ch/R-manual/R-devel/library/base/html/Reserved.html). \n", "- Variables can't start with a number or an underscore\n", "- You can technically use `.` in your variable names, but this is best avoided.\n", "\n", "For example:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "bar <- 11\n", "cat_1 <- 'cat' \n", "dog_ <- TRUE\n", "egg <- (1L)\n", "foo <- 2i" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now that we have assigned some values to variables, we can start using them:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1] 11\n" ] } ], "source": [ "print(bar)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1] 22\n" ] } ], "source": [ "print(bar * 2)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1] 1\n" ] } ], "source": [ "print(a)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1] 12\n" ] } ], "source": [ "print(a + bar)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Data classes\n", "\n", "- The variables you assign have some sort of data class associated with them.\n", "- Data classes impact how functions will interact with your variables.\n", "- R has 5 basic data classes, including:\n", "\n", "1. `character`, which is a character \n", "2. `numeric`, which can be `real` (a rounded number) or `decimal` (a number including a decimal point).\n", "3. `integer`, which can be a rounded number (but not a decimal) \n", "4. `logical`, which can be either `TRUE` or `FALSE`\n", "5. `complex`, allows you to use imaginary numbers \n", "\n", "- You can also have missing data, which we will also talk about later in this workshop.\n", "\n", "Let's look at the data classes of our variables we have just assigned:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "'numeric'" ], "text/latex": [ "'numeric'" ], "text/markdown": [ "'numeric'" ], "text/plain": [ "[1] \"numeric\"" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "'numeric'" ], "text/latex": [ "'numeric'" ], "text/markdown": [ "'numeric'" ], "text/plain": [ "[1] \"numeric\"" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "'character'" ], "text/latex": [ "'character'" ], "text/markdown": [ "'character'" ], "text/plain": [ "[1] \"character\"" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "'logical'" ], "text/latex": [ "'logical'" ], "text/markdown": [ "'logical'" ], "text/plain": [ "[1] \"logical\"" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "'integer'" ], "text/latex": [ "'integer'" ], "text/markdown": [ "'integer'" ], "text/plain": [ "[1] \"integer\"" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "'complex'" ], "text/latex": [ "'complex'" ], "text/markdown": [ "'complex'" ], "text/plain": [ "[1] \"complex\"" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "class(a)\n", "class(bar)\n", "class(cat_1)\n", "class(dog_)\n", "class(egg)\n", "class(foo)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- The `L` we included when we assigned `egg` tells R that this object is an integer.\n", "- The `i` we included when we assigned `foo` indicates an imaginary number, making `foo` complex data class object." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "#?class" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# R data structures\n", "- R objects can also contain more than one element.\n", "- Objects that contain more than one element are organized into different data structures.\n", "- Data structures in R include vectors (also referred to as 'atomic vectors' in R), lists, matrices, arrays, and data frames.\n", "\n", "### Vectors\n", "- Probably the simplest R object that contains more than one element is a **vector**. \n", "- You can create a vector using the concatenate function, `c()`, or directly assigning them. \n", "- The `c()` function will coerce all of the arguments to a common data type and combine them to form a vector. \n", "- Here's a few examples of how you can assign vectors:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "numeric_vector <- c(1,2,3,4,5) \n", "character_vector <- c('one', 'two', 'three', 'four', 'five') \n", "integer_vector <- (6:12) \n", "logical_vector <- c(TRUE, TRUE, FALSE)\n", "character_vector_2 <- c('a', 'pug', 'is', 'not', 'a', 'big', 'dog')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that I used `:` when assigning `integer_vector`, which just generates a list from 6 through 12." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1] 1 2 3 4 5\n", "[1] \"one\" \"two\" \"three\" \"four\" \"five\" \n", "[1] 6 7 8 9 10 11 12\n", "[1] TRUE TRUE FALSE\n", "[1] \"a\" \"pug\" \"is\" \"not\" \"a\" \"big\" \"dog\"\n" ] } ], "source": [ "print(numeric_vector)\n", "print(character_vector)\n", "print(integer_vector)\n", "print(logical_vector) \n", "print(character_vector_2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Vectors also have class:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1] \"numeric\"\n", "[1] \"character\"\n", "[1] \"integer\"\n", "[1] \"logical\"\n", "[1] \"character\"\n" ] } ], "source": [ "print(class(numeric_vector))\n", "print(class(character_vector))\n", "print(class(integer_vector))\n", "print(class(logical_vector)) \n", "print(class(character_vector_2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can combine vectors using `c()`" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "combined_vector <- c(numeric_vector, integer_vector)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " [1] 1 2 3 4 5 6 7 8 9 10 11 12\n" ] } ], "source": [ "print(combined_vector)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can use the `length()` function to see how long your vectors are:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1] 12\n" ] } ], "source": [ "print(length(combined_vector))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can also access elements of the vector based on the index (or its position in the vector):" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1] 2\n" ] } ], "source": [ "print(combined_vector[2])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can combine these operations, but note that R code evaluates from the inside out:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1] 12\n" ] } ], "source": [ "print(combined_vector[length(combined_vector)])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here, R is reading `length(combined_vector)` first. The value returned by the `length()` function is then used to access the last entry in the `combined_vector` vector." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can also name vector elements and then access them by their names:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " one two three four five \n", " 1 2 3 4 5 \n" ] } ], "source": [ "names(numeric_vector) <- c('one', 'two', 'three', 'four', 'five')\n", "print(numeric_vector)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "three \n", " 3 \n" ] } ], "source": [ "print(numeric_vector['three'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can use `-c` to remove vector elements:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " [1] 1 2 3 5 6 7 8 9 10 11 12\n" ] } ], "source": [ "print(combined_vector[-c(4)])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If a vector is numerical, we can also perform some math operations on the entire vector. Here, we can calculate the sum of a vector:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " [1] 1 2 3 4 5 6 7 8 9 10 11 12\n", "[1] 78\n" ] } ], "source": [ "print(combined_vector)\n", "print(sum(combined_vector))" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " [1] 0.01282051 0.02564103 0.03846154 0.05128205 0.06410256 0.07692308\n", " [7] 0.08974359 0.10256410 0.11538462 0.12820513 0.14102564 0.15384615\n" ] } ], "source": [ "print(combined_vector/sum(combined_vector))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Use the `round()` function to specify you only want 3 digits reported and assign it to a variable called `rounded`" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " [1] 0.013 0.026 0.038 0.051 0.064 0.077 0.090 0.103 0.115 0.128 0.141 0.154\n" ] } ], "source": [ "rounded <- round((combined_vector/sum(combined_vector)), digits = 3)\n", "print(rounded)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can also perform math operations on two vectors..." ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " [1] 1.013 2.026 3.038 4.051 5.064 6.077 7.090 8.103 9.115 10.128\n", "[11] 11.141 12.154\n" ] } ], "source": [ "print(rounded + combined_vector)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "but you'll get weird results if the vectors are different lengths:" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " [1] 1 2 3 4 5 6 7 8 9 10 11 12\n", " one two three four five \n", " 1 2 3 4 5 \n" ] } ], "source": [ "print(combined_vector)\n", "print(numeric_vector)" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Warning message in combined_vector + numeric_vector:\n", "“longer object length is not a multiple of shorter object length”" ] }, { "name": "stdout", "output_type": "stream", "text": [ " [1] 2 4 6 8 10 7 9 11 13 15 12 14\n" ] } ], "source": [ "print(combined_vector + numeric_vector)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It looks like R will give you an error message and then go back to the start of the shorter vector." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Coercing between classes**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's say you're trying to import some data into R, maybe a vector of measurements:" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/html": [ "'character'" ], "text/latex": [ "'character'" ], "text/markdown": [ "'character'" ], "text/plain": [ "[1] \"character\"" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "your_data <- c('6','5','3','2','11','0','9','9')\n", "class(your_data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You vector is a character vector because the elements of the vector are in quotes. You can coerce them back into numeric values using `as.numeric()`:" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1] 6 5 3 2 11 0 9 9\n" ] }, { "data": { "text/html": [ "'numeric'" ], "text/latex": [ "'numeric'" ], "text/markdown": [ "'numeric'" ], "text/plain": [ "[1] \"numeric\"" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "your_new_data <- as.numeric(your_data)\n", "print(your_new_data)\n", "class(your_new_data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What happens if we try to `as.numeric` things that aren't numbers?" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Warning message in eval(expr, envir, enclos):\n", "“NAs introduced by coercion”" ] }, { "data": { "text/html": [ "
    \n", "\t
  1. <NA>
  2. \n", "\t
  3. <NA>
  4. \n", "\t
  5. <NA>
  6. \n", "\t
  7. <NA>
  8. \n", "\t
  9. <NA>
  10. \n", "\t
  11. <NA>
  12. \n", "\t
  13. <NA>
  14. \n", "
\n" ], "text/latex": [ "\\begin{enumerate*}\n", "\\item \n", "\\item \n", "\\item \n", "\\item \n", "\\item \n", "\\item \n", "\\item \n", "\\end{enumerate*}\n" ], "text/markdown": [ "1. <NA>\n", "2. <NA>\n", "3. <NA>\n", "4. <NA>\n", "5. <NA>\n", "6. <NA>\n", "7. <NA>\n", "\n", "\n" ], "text/plain": [ "[1] NA NA NA NA NA NA NA" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "as.numeric(character_vector_2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "Example: <NA> indicates that these are missing values, so be careful when converting between classes.\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Missing values\n", "Missing values can result from things like inappropriate coersion, Excel turning everything into a date, encoding format problems, etc." ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Warning message in eval(expr, envir, enclos):\n", "“NAs introduced by coercion”" ] } ], "source": [ "here_is_a_vector <- as.numeric(c(4/61, 35/52, '19-May', 3/40))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can use the `is.na()` function to see if our vector has any `` values in it:" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
    \n", "\t
  1. FALSE
  2. \n", "\t
  3. FALSE
  4. \n", "\t
  5. TRUE
  6. \n", "\t
  7. FALSE
  8. \n", "
\n" ], "text/latex": [ "\\begin{enumerate*}\n", "\\item FALSE\n", "\\item FALSE\n", "\\item TRUE\n", "\\item FALSE\n", "\\end{enumerate*}\n" ], "text/markdown": [ "1. FALSE\n", "2. FALSE\n", "3. TRUE\n", "4. FALSE\n", "\n", "\n" ], "text/plain": [ "[1] FALSE FALSE TRUE FALSE" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "is.na(here_is_a_vector)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can combine this with the `table()` function to see some tabulated results from `is.na()`:" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\n", "FALSE TRUE \n", " 3 1 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "table(is.na(here_is_a_vector))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You might also encounter an `NaN`, which means 'not a number' and is the result of invalid math operations:" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/html": [ "NaN" ], "text/latex": [ "NaN" ], "text/markdown": [ "NaN" ], "text/plain": [ "[1] NaN" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "0/0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`NULL` is another one you might encounter, and it is the result of trying to query a parameter that is undefined for a specific object. For example, you can use the `names()` function to retrieve names assigned to an object. What happens when you try to use this function on an object you haven't named?" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "NULL" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "names(here_is_a_vector)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You might also see `Inf` or `-Inf` which are positive or negative infinity, which result from dividing by zero or operations that do not converge:" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/html": [ "Inf" ], "text/latex": [ "Inf" ], "text/markdown": [ "Inf" ], "text/plain": [ "[1] Inf" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "1/0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Matrices\n", "- A matrix in R is a collection of elements organized into rows and columns.\n", "- All columns must be the same data type and be the same length.\n", "- Generate a matrix using the following general format:\n", "\n", "```\n", "my_matrix <- matrix(\n", " vector, \n", " nrow = r, \n", " ncol = c, \n", " byrow = FALSE)\n", "```\n", "\n", "For example:" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " [,1] [,2] [,3] [,4]\n", "[1,] 1 4 7 10\n", "[2,] 2 5 8 11\n", "[3,] 3 6 9 12\n" ] } ], "source": [ "my_matrix <- matrix(\n", " c(1:12), \n", " nrow = 3, \n", " ncol = 4, \n", " byrow = FALSE)\n", "\n", "print(my_matrix)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the above code, we made `my_matrix`, we specified it should be populated by the vector `c(1:12)`, with 3 rows (`nrow = 3`) and 4 columns (`ncol = 4`) and be populated by column, not by row (`byrow = FALSE`)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can access the rows and columns by their numerical index using a `[row, column]` format.\n", "For example, here's how we access row 3 and column 4:" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/html": [ "12" ], "text/latex": [ "12" ], "text/markdown": [ "12" ], "text/plain": [ "[1] 12" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "my_matrix[3,4]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Access entire row 3:" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1] 3 6 9 12\n" ] } ], "source": [ "print(my_matrix[3,])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Access entire column 4:" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1] 10 11 12\n" ] } ], "source": [ "print(my_matrix[,4])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can also name the rows and columns and then access them by name. \n", "For example, lets name the rows and columns of `my_matrix`" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [], "source": [ "dimnames(my_matrix) <- list(\n", " c('row_1', 'row_2', 'row_3'), \n", " c('column_1', 'column_2', 'column_3', 'column_4'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can also name the rows and columns separately using `rownames()` and `colnames()` " ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [], "source": [ "rownames(my_matrix) <- c('row_1', 'row_2', 'row_3')\n", "colnames(my_matrix) <- c('column_1', 'column_2', 'column_3', 'column_4')" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " column_1 column_2 column_3 column_4\n", "row_1 1 4 7 10\n", "row_2 2 5 8 11\n", "row_3 3 6 9 12\n" ] } ], "source": [ "print(my_matrix)" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "column_1 column_2 column_3 column_4 \n", " 2 5 8 11 \n" ] } ], "source": [ "print(my_matrix['row_2',])" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "row_1 row_2 row_3 \n", " 4 5 6 \n" ] } ], "source": [ "print(my_matrix[,'column_2'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Arrays\n", "- An array can be similar to a matrix but they can have more than 2 dimensions (e.g., more than rows and columns)\n", "- So, an array with 1 dimension is similar to a vector and an array with 2 dimensions is similar to a matrix.\n", "- Generate an array with the following generic format:\n", "\n", "```\n", "my_array <- array(vector),dim = c(rows, columns, other_dims))\n", "```" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ ", , 1\n", "\n", " [,1]\n", " [1,] 1\n", " [2,] 2\n", " [3,] 3\n", " [4,] 4\n", " [5,] 5\n", " [6,] 6\n", " [7,] 7\n", " [8,] 8\n", " [9,] 9\n", "[10,] 10\n", "[11,] 11\n", "[12,] 12\n", "\n" ] } ], "source": [ "my_col_array <- array(\n", " c(1:12),\n", " dim = c(12,1,1))\n", "print(my_col_array)" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ ", , 1\n", "\n", " [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]\n", "[1,] 1 2 3 4 5 6 7 8 9 10 11 12\n", "\n" ] } ], "source": [ "my_row_array <- array(\n", " c(1:12),\n", " dim = c(1,12,1))\n", "print(my_row_array)" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ ", , 1\n", "\n", " [,1] [,2] [,3] [,4]\n", "[1,] 1 4 7 10\n", "[2,] 2 5 8 11\n", "[3,] 3 6 9 12\n", "\n" ] } ], "source": [ "my_array <- array(\n", " c(1:12),\n", " dim = c(3,4,1))\n", "print(my_array)" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ ", , 1\n", "\n", " [,1] [,2] [,3] [,4]\n", "[1,] 1 4 7 10\n", "[2,] 2 5 8 11\n", "[3,] 3 6 9 12\n", "\n", ", , 2\n", "\n", " [,1] [,2] [,3] [,4]\n", "[1,] 13 16 19 22\n", "[2,] 14 17 20 23\n", "[3,] 15 18 21 24\n", "\n" ] } ], "source": [ "another_array <- array(\n", " c(1:24),\n", " dim = c(3,4,2))\n", "print(another_array)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Access elements of arrays like this `[row, column, other_dims]`" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1] 6\n" ] } ], "source": [ "print(another_array[3,2,1])" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1] 18\n" ] } ], "source": [ "print(another_array[3,2,2])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can also give your array some `dimnames()`:" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ ", , matrix_1\n", "\n", " column_1 column_2 column_3 column_4\n", "row_1 1 4 7 10\n", "row_2 2 5 8 11\n", "row_3 3 6 9 12\n", "\n", ", , matrix_2\n", "\n", " column_1 column_2 column_3 column_4\n", "row_1 13 16 19 22\n", "row_2 14 17 20 23\n", "row_3 15 18 21 24\n", "\n" ] } ], "source": [ "dimnames(another_array) <- list(\n", " c('row_1', 'row_2', 'row_3'), \n", " c('column_1', 'column_2', 'column_3', 'column_4'),\n", " c('matrix_1', 'matrix_2'))\n", "print(another_array)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then access your array elements by name:" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1] 6\n" ] } ], "source": [ "print(another_array['row_3', 'column_2', 'matrix_1'])" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "column_1 column_2 column_3 column_4 \n", " 3 6 9 12 \n" ] } ], "source": [ "print(another_array['row_3',,'matrix_1'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Lists" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Lists in R are very flexible, they are collections of elements that can be different classes, structures, whatever. You can even have lists of lists.\n", "- You make lists using the `list()` function (or by coersion using `as.list()`." ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1]]\n", "[1] \"one\" \"two\" \"three\" \"four\" \"five\" \n", "\n", "[[2]]\n", ", , 1\n", "\n", " [,1] [,2] [,3] [,4]\n", "[1,] 1 4 7 10\n", "[2,] 2 5 8 11\n", "[3,] 3 6 9 12\n", "\n", "\n", "[[3]]\n", " column_1 column_2 column_3 column_4\n", "row_1 1 4 7 10\n", "row_2 2 5 8 11\n", "row_3 3 6 9 12\n", "\n" ] } ], "source": [ "my_list <- list(character_vector, my_array, my_matrix)\n", "print(my_list)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Use `[[]]` to access list elements:" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " column_1 column_2 column_3 column_4\n", "row_1 1 4 7 10\n", "row_2 2 5 8 11\n", "row_3 3 6 9 12\n" ] } ], "source": [ "print(my_list[[3]])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Add more brackets to access sub-elements of a list:" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1] 1\n" ] } ], "source": [ "print(my_list[[3]][1])" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "column_1 column_2 column_3 column_4 \n", " 1 4 7 10 \n" ] } ], "source": [ "print(my_list[[3]][1,])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Name the list elements:" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "$character_vector\n", "[1] \"one\" \"two\" \"three\" \"four\" \"five\" \n", "\n", "$my_array\n", ", , 1\n", "\n", " [,1] [,2] [,3] [,4]\n", "[1,] 1 4 7 10\n", "[2,] 2 5 8 11\n", "[3,] 3 6 9 12\n", "\n", "\n", "$my_matrix\n", " column_1 column_2 column_3 column_4\n", "row_1 1 4 7 10\n", "row_2 2 5 8 11\n", "row_3 3 6 9 12\n", "\n" ] } ], "source": [ "names(my_list) <- c('character_vector', 'my_array', 'my_matrix')\n", "print(my_list)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Use `unlist()` if you want to convert a list to a vector, let's make a new list (`list_1`)" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1]]\n", "[1] 1 2 3 4 5\n", "\n" ] } ], "source": [ "list_1 <- list(1:5)\n", "print(list_1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Use `str()` to look at the structure" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "List of 1\n", " $ : int [1:5] 1 2 3 4 5\n" ] } ], "source": [ "str(list_1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then `unlist()` and look at the structure" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1] 1 2 3 4 5\n", " int [1:5] 1 2 3 4 5\n" ] } ], "source": [ "print(unlist(list_1))\n", "str(unlist(list_1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Data Frames\n", "\n", "- A data frame is another way to organize a collection of rows and columns.\n", "- It is a collection of lists organized into columns.\n", "- It is similar to a matrix, except data frames allow different data types in different columns.\n", "- We can use the `data.frame()` function to create a data frame from vectors using the following format:\n", "\n", "```\n", "dataframe <- data.frame(column_1, column_2, column_3)\n", "```" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " c..a....b....c.. c.1..3..5. c.TRUE..TRUE..FALSE.\n", "1 a 1 TRUE\n", "2 b 3 TRUE\n", "3 c 5 FALSE\n" ] } ], "source": [ "example_df <- data.frame(\n", " c('a','b','c'), \n", " c(1, 3, 5), \n", " c(TRUE, TRUE, FALSE))\n", "\n", "print(example_df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Use `names()` or `colnames()` to name columns, `rownames()` to name rows, or `dimnames()` to assign both column and row names to the data frame:" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " letters numbers boolean\n", "first a 1 TRUE\n", "second b 3 TRUE\n", " c 5 FALSE\n" ] } ], "source": [ "colnames(example_df) <- c('letters', 'numbers', 'boolean')\n", "rownames(example_df) <- c('first', 'second', '')\n", "print(example_df)" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " _letters_ _numbers_ _boolean_\n", "first a 1 TRUE\n", "second b 3 TRUE\n", " c 5 FALSE\n" ] } ], "source": [ "names(example_df) <- c('_letters_', '_numbers_', '_boolean_')\n", "print(example_df)" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " __letters __numbers __boolean\n", "__first a 1 TRUE\n", "__second b 3 TRUE\n", "__third c 5 FALSE\n" ] } ], "source": [ "dimnames(example_df) <- list(c('__first', '__second', '__third'), c('__letters', '__numbers', '__boolean'))\n", "print(example_df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can use the `attributes()` and `str()` functions to get some information about our data frame:" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\t
$names
\n", "\t\t
    \n", "\t
  1. '__letters'
  2. \n", "\t
  3. '__numbers'
  4. \n", "\t
  5. '__boolean'
  6. \n", "
\n", "
\n", "\t
$class
\n", "\t\t
'data.frame'
\n", "\t
$row.names
\n", "\t\t
    \n", "\t
  1. '__first'
  2. \n", "\t
  3. '__second'
  4. \n", "\t
  5. '__third'
  6. \n", "
\n", "
\n", "
\n" ], "text/latex": [ "\\begin{description}\n", "\\item[\\$names] \\begin{enumerate*}\n", "\\item '\\_\\_letters'\n", "\\item '\\_\\_numbers'\n", "\\item '\\_\\_boolean'\n", "\\end{enumerate*}\n", "\n", "\\item[\\$class] 'data.frame'\n", "\\item[\\$row.names] \\begin{enumerate*}\n", "\\item '\\_\\_first'\n", "\\item '\\_\\_second'\n", "\\item '\\_\\_third'\n", "\\end{enumerate*}\n", "\n", "\\end{description}\n" ], "text/markdown": [ "$names\n", ": 1. '__letters'\n", "2. '__numbers'\n", "3. '__boolean'\n", "\n", "\n", "\n", "$class\n", ": 'data.frame'\n", "$row.names\n", ": 1. '__first'\n", "2. '__second'\n", "3. '__third'\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "$names\n", "[1] \"__letters\" \"__numbers\" \"__boolean\"\n", "\n", "$class\n", "[1] \"data.frame\"\n", "\n", "$row.names\n", "[1] \"__first\" \"__second\" \"__third\" \n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "attributes(example_df)" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "'data.frame':\t3 obs. of 3 variables:\n", " $ __letters: Factor w/ 3 levels \"a\",\"b\",\"c\": 1 2 3\n", " $ __numbers: num 1 3 5\n", " $ __boolean: logi TRUE TRUE FALSE\n" ] } ], "source": [ "str(example_df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Adding columns to a data frame" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's make a new example dataframe to work with:" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " c..Boo....Rex....Chuckles.. c.1..3..5. c..dog....dog....dog..\n", "1 Boo 1 dog\n", "2 Rex 3 dog\n", "3 Chuckles 5 dog\n" ] } ], "source": [ "patients_1 <- data.frame(\n", " c('Boo','Rex','Chuckles'), \n", " c(1, 3, 5), \n", " c('dog', 'dog', 'dog'))\n", "print(patients_1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Use `names()` or `colnames()` to name columns, `rownames()` to name rows, or `dimnames()` to assign both column and row names to the data frame.\n", "Here we will use `names()` to namethe columns:" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " name number_of_visits type\n", "1 Boo 1 dog\n", "2 Rex 3 dog\n", "3 Chuckles 5 dog\n" ] } ], "source": [ "names(patients_1) <- c('name', 'number_of_visits', 'type')\n", "print(patients_1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can use the column names to extract a single column using the notation `dataframe$column`, e.g.:" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1] Boo Rex Chuckles\n", "Levels: Boo Chuckles Rex\n" ] } ], "source": [ "print(patients_1$name)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `cbind()` function can be used to add more columns to a dataframe:" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " name number_of_visits type column_4\n", "1 Boo 1 dog 4\n", "2 Rex 3 dog 2\n", "3 Chuckles 5 dog 6\n" ] } ], "source": [ "column_4 <- c(4, 2, 6)\n", "patients_1 <- cbind(patients_1, column_4)\n", "print(patients_1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also rename individual columns of the dataframe using index notation, lets rename the 4th column we just added:" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " name number_of_visits type age_in_years\n", "1 Boo 1 dog 4\n", "2 Rex 3 dog 2\n", "3 Chuckles 5 dog 6\n" ] } ], "source": [ "colnames(patients_1)[4] <- 'age_in_years'\n", "print(patients_1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also use the `dataframe$column` notation to add a new column and name it at the same time:" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " name number_of_visits type age_in_years weight_in_pounds\n", "1 Boo 1 dog 4 35\n", "2 Rex 3 dog 2 75\n", "3 Chuckles 5 dog 6 15\n" ] } ], "source": [ "patients_1$weight_in_pounds <- c(35, 75, 15)\n", "print(patients_1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's use `str()` and `attributes()` functions to look at the structure and attributes of this data frame:" ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "'data.frame':\t3 obs. of 5 variables:\n", " $ name : Factor w/ 3 levels \"Boo\",\"Chuckles\",..: 1 3 2\n", " $ number_of_visits: num 1 3 5\n", " $ type : Factor w/ 1 level \"dog\": 1 1 1\n", " $ age_in_years : num 4 2 6\n", " $ weight_in_pounds: num 35 75 15\n" ] } ], "source": [ "str(patients_1)" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\t
$levels
\n", "\t\t
    \n", "\t
  1. 'Boo'
  2. \n", "\t
  3. 'Chuckles'
  4. \n", "\t
  5. 'Rex'
  6. \n", "
\n", "
\n", "\t
$class
\n", "\t\t
'factor'
\n", "
\n" ], "text/latex": [ "\\begin{description}\n", "\\item[\\$levels] \\begin{enumerate*}\n", "\\item 'Boo'\n", "\\item 'Chuckles'\n", "\\item 'Rex'\n", "\\end{enumerate*}\n", "\n", "\\item[\\$class] 'factor'\n", "\\end{description}\n" ], "text/markdown": [ "$levels\n", ": 1. 'Boo'\n", "2. 'Chuckles'\n", "3. 'Rex'\n", "\n", "\n", "\n", "$class\n", ": 'factor'\n", "\n", "\n" ], "text/plain": [ "$levels\n", "[1] \"Boo\" \"Chuckles\" \"Rex\" \n", "\n", "$class\n", "[1] \"factor\"\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "attributes(patients_1$name)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Notice that `patients_1$name` is a factor with three levels...**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Factors\n", "- In some situations, you might be dealing with categorical variable, which is known as a factor variable in R. \n", "- A factor is a type of variable that has a set number of distinct categories into which all observations fall, which are the levels.\n", "\n", "*Factor variables are important because R's default behavior when reading in text files is to convert that text into a factor variable rather than a character variable, which can often lead to weird behavior if the user is trying to e.g. search that text.*\n", "- In addition to `cbind()` for adding columns, there is another function in R called `rbind()`, which adds new rows to a data frame.\n", "- Let's see what happens when we try to add a new row to our data frame:" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Warning message in `[<-.factor`(`*tmp*`, ri, value = \"Fluffy\"):\n", "“invalid factor level, NA generated”" ] }, { "name": "stdout", "output_type": "stream", "text": [ " name number_of_visits type age_in_years weight_in_pounds\n", "1 Boo 1 dog 4 35\n", "2 Rex 3 dog 2 75\n", "3 Chuckles 5 dog 6 15\n", "4 2 dog 8 105\n" ] } ], "source": [ "patients_1_rbind <- rbind(patients_1, c('Fluffy', 2, 'dog', 8, 105))\n", "print(patients_1_rbind)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- The `patients_1$name` column is classed as a `factor`, and the factors levels are `Boo`, `Chuckles`, and `Rex`. \n", "- Recall that a factor is a type of variable that has a **set number of distinct categories into which all observations fall, which are the levels.**\n", "- R isn't sure what to do with the new level we are trying to add (`Fluffy`), so we have to turn those factors into strings." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can convert the `patients_1$name` column to a character as follows:" ] }, { "cell_type": "code", "execution_count": 79, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "'data.frame':\t3 obs. of 5 variables:\n", " $ name : chr \"Boo\" \"Rex\" \"Chuckles\"\n", " $ number_of_visits: num 1 3 5\n", " $ type : Factor w/ 1 level \"dog\": 1 1 1\n", " $ age_in_years : num 4 2 6\n", " $ weight_in_pounds: num 35 75 15\n" ] } ], "source": [ "patients_1$name <- as.character(patients_1$name)\n", "str(patients_1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can use `rbind()` to add a new row:" ] }, { "cell_type": "code", "execution_count": 80, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " name number_of_visits type age_in_years weight_in_pounds\n", "1 Boo 1 dog 4 35\n", "2 Rex 3 dog 2 75\n", "3 Chuckles 5 dog 6 15\n", "4 Fluffy 2 dog 8 105\n" ] } ], "source": [ "patients_1 <- rbind(patients_1, c('Fluffy', 2, 'dog', 8, 105))\n", "print(patients_1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Re-ordering factor levels\n", "- You might have ordinal data, like the following:" ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [], "source": [ "sizes <- factor(c('extra small', 'small', 'large', 'extra large', 'large', 'small', 'medium', 'medium', 'medium', 'medium', 'medium'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Use the `table()` function to look at the vector:" ] }, { "cell_type": "code", "execution_count": 82, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "sizes\n", "extra large extra small large medium small \n", " 1 1 2 5 2 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "table(sizes)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We might not necessarily want the factor levels in alphabetical order. You can re-order them like so:" ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "sizes_sorted\n", "extra small small medium large extra large \n", " 1 2 5 2 1 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sizes_sorted <- factor(sizes, levels = c('extra small', 'small', 'medium', 'large', 'extra large'))\n", "table(sizes_sorted)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can also use the `relevel()` function to specify that there's a single factor you'd like to use as the reference factor, which will now be the first factor:" ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "sizes_releveled\n", " medium extra large extra small large small \n", " 5 1 1 2 2 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sizes_releveled <- relevel(sizes, 'medium')\n", "table(sizes_releveled)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can also coerce a factor to a character:" ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [ { "data": { "text/html": [ "'character'" ], "text/latex": [ "'character'" ], "text/markdown": [ "'character'" ], "text/plain": [ "[1] \"character\"" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ " [1] \"extra small\" \"small\" \"large\" \"extra large\" \"large\" \n", " [6] \"small\" \"medium\" \"medium\" \"medium\" \"medium\" \n", "[11] \"medium\" \n" ] } ], "source": [ "character_vector <- as.character(sizes)\n", "class(character_vector)\n", "print(character_vector)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notice that print doesn't return the `Levels` and each element of the vector is now in quotes.\n", "It is also possible to convert a factor into a numeric vector if you want to:" ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " [1] extra small small large extra large large small \n", " [7] medium medium medium medium medium \n", "Levels: extra large extra small large medium small\n", " [1] 2 5 3 1 3 5 4 4 4 4 4\n" ] } ], "source": [ "print(sizes)\n", "numeric_vector <- as.numeric(sizes)\n", "print(numeric_vector)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This assigns numerical values based on alphabetical order of `sizes`" ] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " [1] extra small small large extra large large small \n", " [7] medium medium medium medium medium \n", "Levels: extra small small medium large extra large\n", " [1] 1 2 4 5 4 2 3 3 3 3 3\n" ] } ], "source": [ "print(sizes_sorted)\n", "ordered_numeric_vector <- as.numeric(sizes_sorted)\n", "print(ordered_numeric_vector)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This assigns numerical values based on the levels you set when you created `sizes_sorted`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Data frame merging\n", "Data is often spread across more than one file, reading each file into R will result in more than one data frame. If the data frames have some common identifying column, we can use that common ID to combine the data frames. \n", "\n", "For example:" ] }, { "cell_type": "code", "execution_count": 88, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " name number_of_visits type age_in_years weight_in_pounds\n", "1 Boo 1 dog 4 35\n", "2 Rex 3 dog 2 75\n", "3 Chuckles 5 dog 6 15\n", "4 Fluffy 2 dog 8 105\n" ] } ], "source": [ "print(patients_1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's make another data frame:" ] }, { "cell_type": "code", "execution_count": 89, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " name number_of_visits type age_in_years\n", "1 Fluffy 1 cat 1\n", "2 Smokey 1 dog 3\n", "3 Kitty 2 cat 5\n" ] } ], "source": [ "patients_2 <- data.frame(\n", " c('Fluffy', 'Smokey', 'Kitty'), \n", " c(1, 1, 2), \n", " c('cat', 'dog', 'cat'),\n", " c(1, 3, 5))\n", "colnames(patients_2) <- c('name', 'number_of_visits', 'type', 'age_in_years')\n", "print(patients_2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can use the `merge()` function to combine them:" ] }, { "cell_type": "code", "execution_count": 90, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " name number_of_visits type age_in_years weight_in_pounds\n", "1 Boo 1 dog 4 35\n", "2 Chuckles 5 dog 6 15\n", "3 Fluffy 1 cat 1 \n", "4 Fluffy 2 dog 8 105\n", "5 Kitty 2 cat 5 \n", "6 Rex 3 dog 2 75\n", "7 Smokey 1 dog 3 \n" ] } ], "source": [ "patients_df <- merge(patients_1, patients_2, all = TRUE)\n", "print(patients_df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Using `all = TRUE` will fill in blank values if needed (for example, the weight of any of the animals in `patients_2`).\n", "- You can also return only the first data frame specified using the `all.x = TRUE` argument" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " name number_of_visits type age_in_years weight_in_pounds\n", "1 Boo 1 dog 4 35\n", "2 Chuckles 5 dog 6 15\n", "3 Fluffy 2 dog 8 105\n", "4 Rex 3 dog 2 75\n" ] } ], "source": [ "patients_df <- merge(patients_1, patients_2, all.x = TRUE)\n", "print(patients_df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Similarly, return only the second data frame specified using the `all.y = TRUE` argument:" ] }, { "cell_type": "code", "execution_count": 92, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " name number_of_visits type age_in_years weight_in_pounds\n", "1 Fluffy 1 cat 1 \n", "2 Kitty 2 cat 5 \n", "3 Smokey 1 dog 3 \n" ] } ], "source": [ "patients_df <- merge(patients_1, patients_2, all.y = TRUE)\n", "print(patients_df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can also specify which columns to join on:" ] }, { "cell_type": "code", "execution_count": 93, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " name type number_of_visits age_in_years weight_in_pounds\n", "1 Boo dog 1 4 35\n", "2 Chuckles dog 5 6 15\n", "3 Fluffy dog 2 8 105\n", "4 Fluffy cat 1 1 \n", "5 Kitty cat 2 5 \n", "6 Rex dog 3 2 75\n", "7 Smokey dog 1 3 \n" ] } ], "source": [ "patients_df <- merge(patients_1, patients_2, by = c('name', 'type', 'number_of_visits', 'age_in_years'), all = TRUE)\n", "print(patients_df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Built-in functions\n", "- We have already used a few functions in this workshop (like print). \n", "- Functions are a series of statements that work together to form a specific task.\n", "- All functions need pieces of information (or arguments) to perform their particular function. \n", "- Sometimes arguments are required, sometimes arguments are optional -- for example, `print()` requires only one argument -- the thing you want to print.\n", "- R comes with some pre-loaded data sets -- you see the list by typing `print(data())`, but it is quite long.\n", "\n", "Load the `DNase` data and turn it into a data frame:\n" ] }, { "cell_type": "code", "execution_count": 94, "metadata": {}, "outputs": [], "source": [ "data(DNase)\n", "DNase <- data.frame(DNase)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's use the `dim()`, `nrow()`, and `ncol()` functions to get the number of rows (`nrow()`), number of columns (`nrow()`), and number of both rows and columns (`dim()`)" ] }, { "cell_type": "code", "execution_count": 95, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
    \n", "\t
  1. 176
  2. \n", "\t
  3. 3
  4. \n", "
\n" ], "text/latex": [ "\\begin{enumerate*}\n", "\\item 176\n", "\\item 3\n", "\\end{enumerate*}\n" ], "text/markdown": [ "1. 176\n", "2. 3\n", "\n", "\n" ], "text/plain": [ "[1] 176 3" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "dim(DNase)" ] }, { "cell_type": "code", "execution_count": 96, "metadata": {}, "outputs": [ { "data": { "text/html": [ "176" ], "text/latex": [ "176" ], "text/markdown": [ "176" ], "text/plain": [ "[1] 176" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "nrow(DNase)" ] }, { "cell_type": "code", "execution_count": 97, "metadata": {}, "outputs": [ { "data": { "text/html": [ "3" ], "text/latex": [ "3" ], "text/markdown": [ "3" ], "text/plain": [ "[1] 3" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ncol(DNase)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can use the `head()` function to look at the first few lines of the data frame:" ] }, { "cell_type": "code", "execution_count": 98, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
A data.frame: 6 × 3
Runconcdensity
<ord><dbl><dbl>
10.048828120.017
10.048828120.018
10.195312500.121
10.195312500.124
10.390625000.206
10.390625000.215
\n" ], "text/latex": [ "A data.frame: 6 × 3\n", "\\begin{tabular}{r|lll}\n", " Run & conc & density\\\\\n", " & & \\\\\n", "\\hline\n", "\t 1 & 0.04882812 & 0.017\\\\\n", "\t 1 & 0.04882812 & 0.018\\\\\n", "\t 1 & 0.19531250 & 0.121\\\\\n", "\t 1 & 0.19531250 & 0.124\\\\\n", "\t 1 & 0.39062500 & 0.206\\\\\n", "\t 1 & 0.39062500 & 0.215\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "A data.frame: 6 × 3\n", "\n", "| Run <ord> | conc <dbl> | density <dbl> |\n", "|---|---|---|\n", "| 1 | 0.04882812 | 0.017 |\n", "| 1 | 0.04882812 | 0.018 |\n", "| 1 | 0.19531250 | 0.121 |\n", "| 1 | 0.19531250 | 0.124 |\n", "| 1 | 0.39062500 | 0.206 |\n", "| 1 | 0.39062500 | 0.215 |\n", "\n" ], "text/plain": [ " Run conc density\n", "1 1 0.04882812 0.017 \n", "2 1 0.04882812 0.018 \n", "3 1 0.19531250 0.121 \n", "4 1 0.19531250 0.124 \n", "5 1 0.39062500 0.206 \n", "6 1 0.39062500 0.215 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "head(DNase)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can use the `n` argument to look at a different number of lines" ] }, { "cell_type": "code", "execution_count": 99, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\n", "
A data.frame: 3 × 3
Runconcdensity
<ord><dbl><dbl>
10.048828120.017
10.048828120.018
10.195312500.121
\n" ], "text/latex": [ "A data.frame: 3 × 3\n", "\\begin{tabular}{r|lll}\n", " Run & conc & density\\\\\n", " & & \\\\\n", "\\hline\n", "\t 1 & 0.04882812 & 0.017\\\\\n", "\t 1 & 0.04882812 & 0.018\\\\\n", "\t 1 & 0.19531250 & 0.121\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "A data.frame: 3 × 3\n", "\n", "| Run <ord> | conc <dbl> | density <dbl> |\n", "|---|---|---|\n", "| 1 | 0.04882812 | 0.017 |\n", "| 1 | 0.04882812 | 0.018 |\n", "| 1 | 0.19531250 | 0.121 |\n", "\n" ], "text/plain": [ " Run conc density\n", "1 1 0.04882812 0.017 \n", "2 1 0.04882812 0.018 \n", "3 1 0.19531250 0.121 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "head(DNase, n = 3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can use the `tail()` function to look at the last few lines of the data frame:" ] }, { "cell_type": "code", "execution_count": 100, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
A data.frame: 5 × 3
Runconcdensity
<ord><dbl><dbl>
17211 3.1250.980
17311 6.2501.421
17411 6.2501.385
1751112.5001.715
1761112.5001.721
\n" ], "text/latex": [ "A data.frame: 5 × 3\n", "\\begin{tabular}{r|lll}\n", " & Run & conc & density\\\\\n", " & & & \\\\\n", "\\hline\n", "\t172 & 11 & 3.125 & 0.980\\\\\n", "\t173 & 11 & 6.250 & 1.421\\\\\n", "\t174 & 11 & 6.250 & 1.385\\\\\n", "\t175 & 11 & 12.500 & 1.715\\\\\n", "\t176 & 11 & 12.500 & 1.721\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "A data.frame: 5 × 3\n", "\n", "| | Run <ord> | conc <dbl> | density <dbl> |\n", "|---|---|---|---|\n", "| 172 | 11 | 3.125 | 0.980 |\n", "| 173 | 11 | 6.250 | 1.421 |\n", "| 174 | 11 | 6.250 | 1.385 |\n", "| 175 | 11 | 12.500 | 1.715 |\n", "| 176 | 11 | 12.500 | 1.721 |\n", "\n" ], "text/plain": [ " Run conc density\n", "172 11 3.125 0.980 \n", "173 11 6.250 1.421 \n", "174 11 6.250 1.385 \n", "175 11 12.500 1.715 \n", "176 11 12.500 1.721 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "tail(DNase, n = 5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The summary function, which can be applied to either a vector or a data frame (in the latter case, R applies it separately to each column in the data frame) yields a variety of summary statistics about each variable. " ] }, { "cell_type": "code", "execution_count": 101, "metadata": {}, "outputs": [ { "data": { "text/plain": [ " Run conc density \n", " 10 :16 Min. : 0.04883 Min. :0.0110 \n", " 11 :16 1st Qu.: 0.34180 1st Qu.:0.1978 \n", " 9 :16 Median : 1.17188 Median :0.5265 \n", " 1 :16 Mean : 3.10669 Mean :0.7192 \n", " 4 :16 3rd Qu.: 3.90625 3rd Qu.:1.1705 \n", " 8 :16 Max. :12.50000 Max. :2.0030 \n", " (Other):80 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "summary(DNase)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`summary()` is informative for numerical data, but not so helpful for factor data, as in the `Run` column. \n", "Let's make a smaller subset of the `DNase` data to work with:" ] }, { "cell_type": "code", "execution_count": 102, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
A data.frame: 20 × 3
Runconcdensity
<ord><dbl><dbl>
1 0.048828120.017
1 0.048828120.018
1 0.195312500.121
1 0.195312500.124
1 0.390625000.206
1 0.390625000.215
1 0.781250000.377
1 0.781250000.374
1 1.562500000.614
1 1.562500000.609
1 3.125000001.019
1 3.125000001.001
1 6.250000001.334
1 6.250000001.364
112.500000001.730
112.500000001.710
2 0.048828120.045
2 0.048828120.050
2 0.195312500.137
2 0.195312500.123
\n" ], "text/latex": [ "A data.frame: 20 × 3\n", "\\begin{tabular}{r|lll}\n", " Run & conc & density\\\\\n", " & & \\\\\n", "\\hline\n", "\t 1 & 0.04882812 & 0.017\\\\\n", "\t 1 & 0.04882812 & 0.018\\\\\n", "\t 1 & 0.19531250 & 0.121\\\\\n", "\t 1 & 0.19531250 & 0.124\\\\\n", "\t 1 & 0.39062500 & 0.206\\\\\n", "\t 1 & 0.39062500 & 0.215\\\\\n", "\t 1 & 0.78125000 & 0.377\\\\\n", "\t 1 & 0.78125000 & 0.374\\\\\n", "\t 1 & 1.56250000 & 0.614\\\\\n", "\t 1 & 1.56250000 & 0.609\\\\\n", "\t 1 & 3.12500000 & 1.019\\\\\n", "\t 1 & 3.12500000 & 1.001\\\\\n", "\t 1 & 6.25000000 & 1.334\\\\\n", "\t 1 & 6.25000000 & 1.364\\\\\n", "\t 1 & 12.50000000 & 1.730\\\\\n", "\t 1 & 12.50000000 & 1.710\\\\\n", "\t 2 & 0.04882812 & 0.045\\\\\n", "\t 2 & 0.04882812 & 0.050\\\\\n", "\t 2 & 0.19531250 & 0.137\\\\\n", "\t 2 & 0.19531250 & 0.123\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "A data.frame: 20 × 3\n", "\n", "| Run <ord> | conc <dbl> | density <dbl> |\n", "|---|---|---|\n", "| 1 | 0.04882812 | 0.017 |\n", "| 1 | 0.04882812 | 0.018 |\n", "| 1 | 0.19531250 | 0.121 |\n", "| 1 | 0.19531250 | 0.124 |\n", "| 1 | 0.39062500 | 0.206 |\n", "| 1 | 0.39062500 | 0.215 |\n", "| 1 | 0.78125000 | 0.377 |\n", "| 1 | 0.78125000 | 0.374 |\n", "| 1 | 1.56250000 | 0.614 |\n", "| 1 | 1.56250000 | 0.609 |\n", "| 1 | 3.12500000 | 1.019 |\n", "| 1 | 3.12500000 | 1.001 |\n", "| 1 | 6.25000000 | 1.334 |\n", "| 1 | 6.25000000 | 1.364 |\n", "| 1 | 12.50000000 | 1.730 |\n", "| 1 | 12.50000000 | 1.710 |\n", "| 2 | 0.04882812 | 0.045 |\n", "| 2 | 0.04882812 | 0.050 |\n", "| 2 | 0.19531250 | 0.137 |\n", "| 2 | 0.19531250 | 0.123 |\n", "\n" ], "text/plain": [ " Run conc density\n", "1 1 0.04882812 0.017 \n", "2 1 0.04882812 0.018 \n", "3 1 0.19531250 0.121 \n", "4 1 0.19531250 0.124 \n", "5 1 0.39062500 0.206 \n", "6 1 0.39062500 0.215 \n", "7 1 0.78125000 0.377 \n", "8 1 0.78125000 0.374 \n", "9 1 1.56250000 0.614 \n", "10 1 1.56250000 0.609 \n", "11 1 3.12500000 1.019 \n", "12 1 3.12500000 1.001 \n", "13 1 6.25000000 1.334 \n", "14 1 6.25000000 1.364 \n", "15 1 12.50000000 1.730 \n", "16 1 12.50000000 1.710 \n", "17 2 0.04882812 0.045 \n", "18 2 0.04882812 0.050 \n", "19 2 0.19531250 0.137 \n", "20 2 0.19531250 0.123 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "DNase_subset <- DNase[1:20, ]\n", "DNase_subset" ] }, { "cell_type": "markdown", "metadata": {}, "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also sort our data. Let's look at the `conc` column:" ] }, { "cell_type": "code", "execution_count": 103, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " [1] 0.04882812 0.04882812 0.19531250 0.19531250 0.39062500 0.39062500\n", " [7] 0.78125000 0.78125000 1.56250000 1.56250000 3.12500000 3.12500000\n", "[13] 6.25000000 6.25000000 12.50000000 12.50000000 0.04882812 0.04882812\n", "[19] 0.19531250 0.19531250\n" ] } ], "source": [ "print(DNase_subset$conc)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Use the `order()` function to figure out the ascending rankings of the values" ] }, { "cell_type": "code", "execution_count": 104, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
    \n", "\t
  1. 1
  2. \n", "\t
  3. 2
  4. \n", "\t
  5. 17
  6. \n", "\t
  7. 18
  8. \n", "\t
  9. 3
  10. \n", "\t
  11. 4
  12. \n", "\t
  13. 19
  14. \n", "\t
  15. 20
  16. \n", "\t
  17. 5
  18. \n", "\t
  19. 6
  20. \n", "\t
  21. 7
  22. \n", "\t
  23. 8
  24. \n", "\t
  25. 9
  26. \n", "\t
  27. 10
  28. \n", "\t
  29. 11
  30. \n", "\t
  31. 12
  32. \n", "\t
  33. 13
  34. \n", "\t
  35. 14
  36. \n", "\t
  37. 15
  38. \n", "\t
  39. 16
  40. \n", "
\n" ], "text/latex": [ "\\begin{enumerate*}\n", "\\item 1\n", "\\item 2\n", "\\item 17\n", "\\item 18\n", "\\item 3\n", "\\item 4\n", "\\item 19\n", "\\item 20\n", "\\item 5\n", "\\item 6\n", "\\item 7\n", "\\item 8\n", "\\item 9\n", "\\item 10\n", "\\item 11\n", "\\item 12\n", "\\item 13\n", "\\item 14\n", "\\item 15\n", "\\item 16\n", "\\end{enumerate*}\n" ], "text/markdown": [ "1. 1\n", "2. 2\n", "3. 17\n", "4. 18\n", "5. 3\n", "6. 4\n", "7. 19\n", "8. 20\n", "9. 5\n", "10. 6\n", "11. 7\n", "12. 8\n", "13. 9\n", "14. 10\n", "15. 11\n", "16. 12\n", "17. 13\n", "18. 14\n", "19. 15\n", "20. 16\n", "\n", "\n" ], "text/plain": [ " [1] 1 2 17 18 3 4 19 20 5 6 7 8 9 10 11 12 13 14 15 16" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "order(DNase_subset$conc)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can assign this ordering to a vector:" ] }, { "cell_type": "code", "execution_count": 105, "metadata": {}, "outputs": [], "source": [ "reorder_vector <- order(DNase_subset$conc)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And use it to reorder our data frame:" ] }, { "cell_type": "code", "execution_count": 106, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
A data.frame: 20 × 3
Runconcdensity
<ord><dbl><dbl>
11 0.048828120.017
21 0.048828120.018
172 0.048828120.045
182 0.048828120.050
31 0.195312500.121
41 0.195312500.124
192 0.195312500.137
202 0.195312500.123
51 0.390625000.206
61 0.390625000.215
71 0.781250000.377
81 0.781250000.374
91 1.562500000.614
101 1.562500000.609
111 3.125000001.019
121 3.125000001.001
131 6.250000001.334
141 6.250000001.364
15112.500000001.730
16112.500000001.710
\n" ], "text/latex": [ "A data.frame: 20 × 3\n", "\\begin{tabular}{r|lll}\n", " & Run & conc & density\\\\\n", " & & & \\\\\n", "\\hline\n", "\t1 & 1 & 0.04882812 & 0.017\\\\\n", "\t2 & 1 & 0.04882812 & 0.018\\\\\n", "\t17 & 2 & 0.04882812 & 0.045\\\\\n", "\t18 & 2 & 0.04882812 & 0.050\\\\\n", "\t3 & 1 & 0.19531250 & 0.121\\\\\n", "\t4 & 1 & 0.19531250 & 0.124\\\\\n", "\t19 & 2 & 0.19531250 & 0.137\\\\\n", "\t20 & 2 & 0.19531250 & 0.123\\\\\n", "\t5 & 1 & 0.39062500 & 0.206\\\\\n", "\t6 & 1 & 0.39062500 & 0.215\\\\\n", "\t7 & 1 & 0.78125000 & 0.377\\\\\n", "\t8 & 1 & 0.78125000 & 0.374\\\\\n", "\t9 & 1 & 1.56250000 & 0.614\\\\\n", "\t10 & 1 & 1.56250000 & 0.609\\\\\n", "\t11 & 1 & 3.12500000 & 1.019\\\\\n", "\t12 & 1 & 3.12500000 & 1.001\\\\\n", "\t13 & 1 & 6.25000000 & 1.334\\\\\n", "\t14 & 1 & 6.25000000 & 1.364\\\\\n", "\t15 & 1 & 12.50000000 & 1.730\\\\\n", "\t16 & 1 & 12.50000000 & 1.710\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "A data.frame: 20 × 3\n", "\n", "| | Run <ord> | conc <dbl> | density <dbl> |\n", "|---|---|---|---|\n", "| 1 | 1 | 0.04882812 | 0.017 |\n", "| 2 | 1 | 0.04882812 | 0.018 |\n", "| 17 | 2 | 0.04882812 | 0.045 |\n", "| 18 | 2 | 0.04882812 | 0.050 |\n", "| 3 | 1 | 0.19531250 | 0.121 |\n", "| 4 | 1 | 0.19531250 | 0.124 |\n", "| 19 | 2 | 0.19531250 | 0.137 |\n", "| 20 | 2 | 0.19531250 | 0.123 |\n", "| 5 | 1 | 0.39062500 | 0.206 |\n", "| 6 | 1 | 0.39062500 | 0.215 |\n", "| 7 | 1 | 0.78125000 | 0.377 |\n", "| 8 | 1 | 0.78125000 | 0.374 |\n", "| 9 | 1 | 1.56250000 | 0.614 |\n", "| 10 | 1 | 1.56250000 | 0.609 |\n", "| 11 | 1 | 3.12500000 | 1.019 |\n", "| 12 | 1 | 3.12500000 | 1.001 |\n", "| 13 | 1 | 6.25000000 | 1.334 |\n", "| 14 | 1 | 6.25000000 | 1.364 |\n", "| 15 | 1 | 12.50000000 | 1.730 |\n", "| 16 | 1 | 12.50000000 | 1.710 |\n", "\n" ], "text/plain": [ " Run conc density\n", "1 1 0.04882812 0.017 \n", "2 1 0.04882812 0.018 \n", "17 2 0.04882812 0.045 \n", "18 2 0.04882812 0.050 \n", "3 1 0.19531250 0.121 \n", "4 1 0.19531250 0.124 \n", "19 2 0.19531250 0.137 \n", "20 2 0.19531250 0.123 \n", "5 1 0.39062500 0.206 \n", "6 1 0.39062500 0.215 \n", "7 1 0.78125000 0.377 \n", "8 1 0.78125000 0.374 \n", "9 1 1.56250000 0.614 \n", "10 1 1.56250000 0.609 \n", "11 1 3.12500000 1.019 \n", "12 1 3.12500000 1.001 \n", "13 1 6.25000000 1.334 \n", "14 1 6.25000000 1.364 \n", "15 1 12.50000000 1.730 \n", "16 1 12.50000000 1.710 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "DNase_subset[reorder_vector, ]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Data frames can be classified into two broad categories: wide format and long format. All data frames shown so far have been presented in wide format. A wide format data frame has each row describe a sample and each column describe a feature. Here is a short example of a data frame in wide format, tabulating counts for three genes in three patients:" ] }, { "cell_type": "code", "execution_count": 107, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\n", "
A data.frame: 3 × 4
idgene.1gene.2gene.3
<fct><dbl><dbl><dbl>
A150
B161
C270
\n" ], "text/latex": [ "A data.frame: 3 × 4\n", "\\begin{tabular}{r|llll}\n", " id & gene.1 & gene.2 & gene.3\\\\\n", " & & & \\\\\n", "\\hline\n", "\t A & 1 & 5 & 0\\\\\n", "\t B & 1 & 6 & 1\\\\\n", "\t C & 2 & 7 & 0\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "A data.frame: 3 × 4\n", "\n", "| id <fct> | gene.1 <dbl> | gene.2 <dbl> | gene.3 <dbl> |\n", "|---|---|---|---|\n", "| A | 1 | 5 | 0 |\n", "| B | 1 | 6 | 1 |\n", "| C | 2 | 7 | 0 |\n", "\n" ], "text/plain": [ " id gene.1 gene.2 gene.3\n", "1 A 1 5 0 \n", "2 B 1 6 1 \n", "3 C 2 7 0 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "wide_df <- data.frame(c(\"A\", \"B\", \"C\"), c(1, 1, 2), c(5, 6, 7), c(0, 1, 0))\n", "colnames(wide_df) <- c(\"id\", \"gene.1\", \"gene.2\", \"gene.3\")\n", "wide_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Long format stacks features on top of one another; each row is the combination of a sample and a feature. One column exists to denote the feature in question, and another column exists to denote that feature' value:" ] }, { "cell_type": "code", "execution_count": 108, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
A data.frame: 9 × 3
idgenecount
<fct><fct><dbl>
Agene.11
Agene.25
Agene.30
Bgene.11
Bgene.26
Bgene.31
Cgene.12
Cgene.27
Cgene.30
\n" ], "text/latex": [ "A data.frame: 9 × 3\n", "\\begin{tabular}{r|lll}\n", " id & gene & count\\\\\n", " & & \\\\\n", "\\hline\n", "\t A & gene.1 & 1\\\\\n", "\t A & gene.2 & 5\\\\\n", "\t A & gene.3 & 0\\\\\n", "\t B & gene.1 & 1\\\\\n", "\t B & gene.2 & 6\\\\\n", "\t B & gene.3 & 1\\\\\n", "\t C & gene.1 & 2\\\\\n", "\t C & gene.2 & 7\\\\\n", "\t C & gene.3 & 0\\\\\n", "\\end{tabular}\n" ], "text/markdown": [ "\n", "A data.frame: 9 × 3\n", "\n", "| id <fct> | gene <fct> | count <dbl> |\n", "|---|---|---|\n", "| A | gene.1 | 1 |\n", "| A | gene.2 | 5 |\n", "| A | gene.3 | 0 |\n", "| B | gene.1 | 1 |\n", "| B | gene.2 | 6 |\n", "| B | gene.3 | 1 |\n", "| C | gene.1 | 2 |\n", "| C | gene.2 | 7 |\n", "| C | gene.3 | 0 |\n", "\n" ], "text/plain": [ " id gene count\n", "1 A gene.1 1 \n", "2 A gene.2 5 \n", "3 A gene.3 0 \n", "4 B gene.1 1 \n", "5 B gene.2 6 \n", "6 B gene.3 1 \n", "7 C gene.1 2 \n", "8 C gene.2 7 \n", "9 C gene.3 0 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "long_df <- data.frame(c(\"A\", \"A\", \"A\", \"B\", \"B\", \"B\", \"C\", \"C\", \"C\"), c(\"gene.1\", \"gene.2\", \"gene.3\", \"gene.1\", \"gene.2\", \"gene.3\", \"gene.1\", \"gene.2\", \"gene.3\"), c(1, 5, 0, 1, 6, 1, 2, 7, 0))\n", "colnames(long_df) <- c(\"id\", \"gene\", \"count\")\n", "long_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "These formats both contain the exact same data but represent it in different ways. Various functions exist to convert between wide and long format but these are beyond the scope of today's discussion. You can look up the `reshape2` or `tidyr` packages if you're interested in learning more about converting between long and wide formats -- alternatively, check out our tidyverse workshop." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# User defined functions\n", "- In addition to the already available functions in R, you can also create your own functions. \n", "- Generally, if you find yourself re-writing the same pieces of code over and over again, it might be time to write a function. \n", "\n", "Functions take the following basic format:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```\n", "myfunction <- function(argument_name){\n", " stuff <- this is the body of the function(\n", " it contains statements that use argument_names\n", " to do things and make stuff)\n", " return(stuff)\n", "}\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "More formally, R functions are broken up into 3 pieces:\n", "1. formals() - the list of arguments\n", "2. body() - code inside the function\n", "3. environment() - how the function finds the values associated with function names" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here's an example of a function called `roll()` that rolls any number of 6-sided dice:" ] }, { "cell_type": "code", "execution_count": 109, "metadata": {}, "outputs": [], "source": [ "roll <- function(number_of_dice){\n", " rolled_dice <- sample(\n", " x = 6, \n", " size = number_of_dice, \n", " replace = TRUE)\n", " return(rolled_dice)\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- The built-in R function `sample()` is nested inside our `roll()` function.\n", "- `roll()` uses the argument `number_of_dice` as the `size`, `x` is the number of sides on the die, which we have hard-coded as `6`, and `replace = TRUE` means that we are sampling the space of all potential die roll outcomes with replacement.\n", "- Lastly, we tell the function what it should return (`rolled_dice`).\n", "\n", "To call that function and print the output:" ] }, { "cell_type": "code", "execution_count": 110, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " [1] 4 4 4 3 3 4 6 2 3 2\n" ] } ], "source": [ "print(roll(number_of_dice = 10))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lets look at the `formals()`" ] }, { "cell_type": "code", "execution_count": 111, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "$number_of_dice\n", "\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "formals(roll)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What about `body()`?" ] }, { "cell_type": "code", "execution_count": 112, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{\n", " rolled_dice <- sample(x = 6, size = number_of_dice, replace = TRUE)\n", " return(rolled_dice)\n", "}" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "body(roll)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What about `environment()`?" ] }, { "cell_type": "code", "execution_count": 113, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "environment(roll)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So, the function itself is called `roll`, it takes the argument or formals `number_of_dice` and the body of the function uses the built-in `sample` function in R to simulate dice rolls (use ?sample to learn more about the `sample()` function). " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Anonymous functions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- You can also have something called an **anonymous function**, where you write the function but don't assign it to an object.\n", "- The general format is:\n", "```\n", "(function(\n", " argument_name) \n", " statements that use argument_name to create an object\n", " )(\n", " argument_name = argument)\n", "```" ] }, { "cell_type": "code", "execution_count": 114, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
    \n", "\t
  1. 2
  2. \n", "\t
  3. 6
  4. \n", "\t
  5. 1
  6. \n", "\t
  7. 3
  8. \n", "\t
  9. 5
  10. \n", "
\n" ], "text/latex": [ "\\begin{enumerate*}\n", "\\item 2\n", "\\item 6\n", "\\item 1\n", "\\item 3\n", "\\item 5\n", "\\end{enumerate*}\n" ], "text/markdown": [ "1. 2\n", "2. 6\n", "3. 1\n", "4. 3\n", "5. 5\n", "\n", "\n" ], "text/plain": [ "[1] 2 6 1 3 5" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "(function(\n", " anonymous_dice) \n", " sample(\n", " x = 6, \n", " size = anonymous_dice, \n", " replace = TRUE)\n", " )(\n", " anonymous_dice = 5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## More on user defined functions\n", "- We can also have functions that take more than one argument. \n", "- Lets say we want to roll different numbers of dice (`number_of_dice`) and we want to change the size of the dice we roll (`number_of_sides`)." ] }, { "cell_type": "code", "execution_count": 115, "metadata": {}, "outputs": [], "source": [ "roll <- function(\n", " number_of_dice, \n", " number_of_sides){\n", " rolled_dice <- sample(\n", " x = number_of_sides, \n", " size = number_of_dice, \n", " replace = TRUE)\n", " return(rolled_dice)\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- The new `roll()` uses the `sample()` function again, but this time it uses the `number_of_dice` and `number_of_sides`" ] }, { "cell_type": "code", "execution_count": 116, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1] 15 6 1 12 9\n" ] } ], "source": [ "print(roll(number_of_dice = 5, number_of_sides = 20))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Lets say we want to roll different numbers of dice (`number_of_dice`) and we want to change the size of the dice we roll (`number_of_sides`) as well as tweak the number of times we roll the dice (`number_of_rolls`).\n", "- We can use `replicate()` and `sample()`" ] }, { "cell_type": "code", "execution_count": 117, "metadata": {}, "outputs": [], "source": [ "roll <- function(\n", " number_of_rolls, \n", " number_of_sides, \n", " number_of_dice){\n", " rolled_dice <- replicate(\n", " number_of_rolls, \n", " sample(\n", " x = number_of_sides, \n", " size = number_of_dice, \n", " replace = TRUE))\n", " return(rolled_dice)\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- So, in the above function we use `number_of_dice`, `number_of_sides`, and `number_of_rolls` as arguments. \n", "- The `sample()` function takes the arguments `number_of_sides` and `number_of_dice`\n", "- The `replicate()` function is takine `number_of_rolls` as an argument." ] }, { "cell_type": "code", "execution_count": 118, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]\n", "[1,] 12 15 13 2 4 4 4 13 9 9\n", "[2,] 15 16 16 10 17 18 13 18 19 11\n", "[3,] 10 7 9 18 15 3 2 5 2 17\n", "[4,] 10 9 2 14 7 13 5 4 5 16\n", "[5,] 10 7 16 20 7 17 10 16 10 12\n" ] } ], "source": [ "rolled_dice <- roll(number_of_rolls = 10, number_of_sides = 20, number_of_dice = 5)\n", "print(rolled_dice)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can use `colSums()` or `rowSums()` to calculate the sum of the columns and rows:" ] }, { "cell_type": "code", "execution_count": 119, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " [1] 57 54 56 64 50 55 34 56 45 65\n" ] } ], "source": [ "print(colSums(rolled_dice))" ] }, { "cell_type": "code", "execution_count": 120, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1] 85 153 88 85 125\n" ] } ], "source": [ "print(rowSums(rolled_dice))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can make `rolled_dice` into an **anonymous function**:" ] }, { "cell_type": "code", "execution_count": 121, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " [,1] [,2] [,3] [,4] [,5]\n", " [1,] 13 11 18 15 9\n", " [2,] 3 14 9 13 3\n", " [3,] 14 2 7 5 11\n", " [4,] 15 19 13 2 20\n", " [5,] 16 2 14 15 3\n", " [6,] 16 19 5 17 16\n", " [7,] 17 14 13 10 17\n", " [8,] 10 9 13 10 11\n", " [9,] 5 16 3 19 6\n", "[10,] 2 10 14 10 8\n" ] } ], "source": [ "print(\n", " (function(\n", " number_of_dice, \n", " number_of_sides, \n", " number_of_rolls) \n", " replicate(\n", " number_of_dice, \n", " sample(\n", " 1:number_of_sides, \n", " number_of_rolls, \n", " replace = TRUE))\n", " )(\n", " number_of_dice = 5, \n", " number_of_rolls = 10, \n", " number_of_sides = 20))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lets make another anonymous function that makes a boxplot of our dice rolls:" ] }, { "cell_type": "code", "execution_count": 122, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0gAAANICAYAAAD958/bAAAEGWlDQ1BrQ0dDb2xvclNwYWNl\nR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi\n6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lp\nurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZP\nC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q4\n4WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23B\naIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys\n2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y\n5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrl\nSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98\nhTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7C\nlP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmK\nPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZf\nsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJ\nxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19\nzn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNC\nUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU\n97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KT\nYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyA\ngccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/\nqwBnjX8BoJ98VQNcC+8AAEAASURBVHgB7d0NtGxnWRjgG8i9hJ+QCIISklAURFpI+Q8XRCta\nLRJFNGLR6gpNYqom2DS2dEG8Se4KFXQFFhqkiD+hFmgxCrFXAlVMkQKaEGJBKiiaEEIIUP4E\nEskNuX2/sE+4czlnzp6Zvfd8P8+31ss5M7P3933v884J570zs8+OHQYBAgQIECBAgAABAgQI\nECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI\nECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI\nECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI\nECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI\nECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI\nECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI\nECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI\nECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI\nECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI\nECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI\nECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI\nECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI\nECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI\nECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI\nECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI\nECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI\nECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI\nECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI\nECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI\nECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI\nECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI\nECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI\nECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI\nECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI\nECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI\nECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI\nECCQvcBh2e+wnQ0+LlLd2U66MiVAgAABAgQIEKhI4NbI5eoa8tEg5VHF1BxdlcdW7IIAAQIE\nCBAgQIDAUgLpd9rim6TDl0rdSUMLbLxydGRMnLpvgwABAgQIECBAgEApArtio5+PSF+LHxqk\n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\nAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAYQOD/\nA20qNOl5h0lDAAAAAElFTkSuQmCC", "text/plain": [ "plot without title" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "(function(number_of_dice, \n", " number_of_sides, \n", " number_of_rolls) \n", " boxplot((\n", " replicate(\n", " number_of_dice, \n", " sample(\n", " 1:number_of_sides, \n", " number_of_rolls, \n", " replace = TRUE))))\n", " )(\n", " number_of_dice = 5, \n", " number_of_rolls = 10, \n", " number_of_sides = 20)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can give the boxplot a title:" ] }, { "cell_type": "code", "execution_count": 123, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0gAAANICAYAAAD958/bAAAEGWlDQ1BrQ0dDb2xvclNwYWNl\nR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi\n6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lp\nurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZP\nC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q4\n4WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23B\naIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys\n2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y\n5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrl\nSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98\nhTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7C\nlP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmK\nPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZf\nsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJ\nxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19\nzn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNC\nUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU\n97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KT\nYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyA\ngccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/\nqwBnjX8BoJ98VQNcC+8AAEAASURBVHgB7N0JvHRXVSD6hAyQMCQyEzIQZpEgYyAgCGKDCBpQ\nhgYV0xDgEVAEtOnGEJIY2+EZ0ij6FESDNvgaoxKNhhmRJqHDpCAt8ICMJBhkMkwZyPfWSuqE\nk0rVvVV1z6k6Z+///v3WV6fOsM9e/111v7NuDXe33TQCBAgQIECAAAECBAgQIECAAAECBAgQ\nIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ\nIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ\nIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ\nIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ\nIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ\nIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ\nIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ\nIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ\nIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ\nIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ\nIECAAAECBAgQIECAAAECBAgQIECAAIFZArvPWmkdAQKjFbh5jPzQ1ug/1louafEukcxNJwn9\n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\n9o9H5HPpnhHvjWi2/fdYXqQ9J3Zqjsnbl7YOyvn9xtT2u7S2P2Zq2x6tbe2fa/8Y65vHYj6m\n/0/ruPe0juk6t+nn9qyfhavObw57q/znPd8+3cq9i5+HLT6LBAgQIEBgPALTBVL+trLdnh53\n2hcoebGT7dkRzfrvxPLtc2WrfTCWm+0nttZPXxTk/em2at/T/bTvz7sguCB2asb5nljOz03s\nPznwpnG752R5mZu8wHxoxAFTBx0b95tznTO1bd7daa+HT+2Yv4lvv5L0C63tb4zl5nznxXJe\n3Lbb98ad9qtLz21vjOWfjmiOn76dNW/TBVIWJO2WRVK+etD09UutjfPmZyc5HNI6V54zi6NF\n2t1jp2aMedsUQO1j39Ta5+L2hli+sLXtuVPb5t19VuuYLMiOi7hPxO4R2bI4mdVW9dkrOmvn\nePJU569pbc9i8MDW9nxct499ZGtbO/ffa63PxcdHNMflY3bfXLlNOzO2N8e8e8a+p7S25353\nae3zmKlte0y25eO+6TNvp59TR8a6LERPisifh80cdJ3b9HN71nNq1fmNYa9UIPXx8zDHohEo\nXuBGxWcoQQJ1C3x8Kv0vTd1vLrLv3lp/XizfP+JHW5G/iWzaXZuFGbdvnrGuq75ndH2DVe9q\nrXlkLP9FROacBV5ewB8WsWzLC9yzJgc9JW5/KyJfPTpxsi5vGsfWqm0Xvx175G++2+1f407+\nBrxp7QvERzUr4/ZPIi5v3c/Ff4l4f2vd97eWc/F/RPzZ1Lq8+zcR0xe/07vlhWfu1275Fqb2\n+bZ6XDTH7TSHpp9lbh/Z2jmL/z9q3W8WX9csxO0dIm7Tur/K4nvjoCxWs+UrVSdE5FsYL414\nU0QWF+1XjuLuNa0rn3y8t1u+eti0vGi+qLkTt19uLedi81jeN5bv2NqW893+mbBn3L9ysv0m\ncdsuuiarb3Bz59aat7eWm8W3NQtL3N6jtW/Ob/sxmZtOj8hXvo6NyJ9P+VjuI7fo9notzzXd\nuprf6X7n3e/j5+G8c1lPoCiB/AGnESBQrsD5U6ldMXV/98n9u7XW50XM37buTy+2L5ra274Z\nd/Iiarp10fd0n/Puvyg25G/qs8Br2o1i4YGTeGXcZm7Pjbg4YpH2hNjppIjpgqN9bP5WftmW\nxVBerE239rgOmWzM35a3X9U7d/qgyf3Pxe0jJsv3mrHPz8e6J0fs1dp2fGt53mLO6/RjJ/dt\nX2gfOu/gyfquctjmNDfY3L5w/3xsnZVHurVb2r23vWLJ5c/G/kdHvD4i827arWMhX8XNSNOX\nRfxRRLYufdoFUfbdFDK5/NX8p9VmeeTmu0Y0Px/y/ivyny1a/lz49Bbbc9OdWtsvaS03i+3H\nfrNuu9scZ9PS9Ormzha3feTWPt2sn4Vdzm/7XFst9/HzcKvz2UagGIE9i8lEIgQIzBLI/6jb\nbdYFeW5vXyRdGvfzt93z2oVzNkyfq9mti76bvra7/ffY4fCIIyOeFfGDETeLaLf87f2bIh7Z\nXjln+WdjffsiN1+Re3vE30fcO+LXIrItclF27Z7f/bd5699311y7tG9rRV7wZftOxNcjbp53\nojW319777r/7fXdxZrGaBVK7OMrdT454dMRWOXxPbM9Cc3qftu1XYvtWrasctjrHrG3tgmAR\nt+yjcZ/V36Lr3hA7/n1EvqXviRH3jGi3LJb+MCKL3fdEdOnTLoii6+sV4u3nY26b16b3Ozt2\nzMfgvLZr3obW+nyM3G5y/xat9c3iTZuFJW7bxeC859R0d33k1j7HrJ+FXc5v+1xbLXf983Cr\nc9lGoCgBBVJR0ykZAisLfK515FWx/CMR0xfDrV1mLl4+c+31/7bKqn3P6Xrm6rwQeUvEX0bk\nz7gsmB4TkcXOnSKy/WDErSK+lHe2aC+Pbfmb32y/G/HCa5au/eew1nKec9mWxcyhEedOHdh+\nxa09L+fFfs05HzR1TN7Ncd6vtT6LuXY7Iu5kPtPtkbHiFyN+c3pD6346fl/EdJ/tsX6mtf+8\nxfNiw05yaPebBdsi7bzWTlno3SXis611ufjA1v28eP506/5OFs+Pg3854r9GHBDxqIifiDgy\nIudr98n998RttvMiuvLJ/nbSzouDd0XkGLP9ScTvX7O0+j/p3hRI+dmh6Zav3C3b2nN14zj4\nThHnRTTtzrFwcsQ/R3wi4oyI8yK6zi26vK7N+1l4Xuyx7vnt8ufhdQlaIFC6wKL/wZTuID8C\ntQu8vwWQF3I/2LqfF3JnRXwg4vURPxoxq2XxM6t10fesfqfXfX+sOD3ikxH5G9wHROSYcuzH\nRzwjot32bt+ZsXzrWHf31vq8sGq3R7TurPrLpuOjj+YCNLvLC+e8gG/aR5qFuM2Cr2lPj4Us\neNrtF+LOnSYr8uLvbZPlvMlXev40Iucy24cj3nrN0rX//Erc3Ld1f9bicbGyPdZHxv12QfbR\nWQdNrdtJDtOPr+3mrzl1OnyjuRO3ebG8V+v+bWL52Nb9d8by9Cswrc0LLaZnPu7zlai/mhxx\ncdy+MeInI941WZc37bHsxKfVZSeL345e8nHStHzMtdtT404WPH8d8WsR+RjbrrUfz0+Lne/U\nOuAmsfzi1v1FF7PwybE27ZeahcntS+L2iRE5x/9PRD6O+sgtur2u5TlmtXXOb9c/D2flYx0B\nAgQIEBiFwONilHlx3MT0oLPwabblbfN2rrzw/Vhr2/mx/DMRj47I3xy3j2kXBse0tp0by7Pa\nqn3P6qtZd1YsNGPKi9FsmUtekDbr88LpP0Xkb6qfEvGOiGbbp2J5u7ZH7JCFVnPM2bH8kElk\nodisz9v2b7Hj7tzW9mqO/9vY+zkRJ0V8K6JZf04sp13T8jfvOe5me17k/X5EXhDmRXizPm9/\nN6LdXhd3mu2Xx3L+FvugiK+11n8ilvMitWnPjIXmmOb27bHuuREnRlzW2v6Psdz+hdus+Yld\nrnn1YNUcbtE6X44nC5nfinhyxHYtL7ybHPI2L/zzgjkv7C+KaLZ9PZbvFNFuF8adZnvmvkj7\nz7FTc0zeZlGWz5vDI3K+cg6a7U+P5aatOsdZZDX95e0PNx1Obl/Z2p6Pq3bLeWsf+9jWxizm\n2tv+IO4/MiIfr5+PaLa9O5YXaXeMndrPqfPj/ssjnh+Rc9L019zeJdY17TGx0KzP23x+Ni0f\nj+1tfxP3XxZxRkQWu82234nlpnWdW/u5fW5zkqnbVec3u9kq/1nPt33jmC5/Hk6l4i4BAgQI\nEBiPwKoFUmaYryBcENFcTMy6PSV3bLVFLgpy91X6bp3mBouzLghyp3xrYBYOs8berMuL0yx0\nFmmvip2a46Zv21Z5zkV+g972+oc4Jgur6X7z/mURR0RMt7zA+njErGOadXmxevPWgUdO7f+K\n1rbnTW17dWtbu0D6Rqz/zNS+zfmyqMiL/3abNz+5zyo5NH1nIdact7nNOVqkvTB2ujqiOW76\nNvN42oyOVimQstB86xbnas79ltinXQTn6Vfx6atAyrHlY6IZ76zbS2L7PSIWbdPFarvP06KT\nr0Y06xYtkPaJY85pHdcc3779SGxvf8ap69zaz+1z41zz2irzm30tWyDlMV3/PMw+NQIECBAg\nMDqBnRRImextIvLViPZFSl5knBeRFwDTbdGLgjxu2b6nz9W+v9UF+INix9MjvhPRvkDK5fyN\n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\neh4GR0aq+dvD7eJ76iGpMtMfjqw/OfU4ODvuf3+VGpL2ClJdj4EfjXQ/HdH8P5C/GHlfxKER\nGgECBAgQIECgaoE7Rvb5jVX7V60geQJ1Ctwh0s5Xj/IbDTUCBAgQIECAAAECBAgQIECAAAEC\nBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEC\nBAgQIECAAAECBAgQIECAAAEC/387dCwAAAAAMMjfehI7CyEDBgwYMGDAgAEDBgwYMGDAgAED\nBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\nBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\nBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\nBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\nBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\nBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\nBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\nBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\nBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\nBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\nBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\nBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\nBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\nBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\nBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\nBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\nBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\nBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\nBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\nBgwYMGDAgIFhIAv3hDOmJw5NAAAAAElFTkSuQmCC", "text/plain": [ "Plot with title “here is a boxplot of some dice rolls”" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "(function(number_of_dice, \n", " number_of_sides, \n", " number_of_rolls) \n", " boxplot((\n", " replicate(\n", " number_of_dice, \n", " sample(\n", " 1:number_of_sides, \n", " number_of_rolls, \n", " replace = TRUE))), \n", " main = 'here is a boxplot of some dice rolls')\n", " )(\n", " number_of_dice = 5, \n", " number_of_rolls = 10, \n", " number_of_sides = 20)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can use `paste()` to pass the function arguments as parts of the title for the figure, by adding `main = paste('the ' , number_of_dice, ' ', number_of_sides, '-sided dice were rolled ', number_of_rolls, ' times', sep='')`" ] }, { "cell_type": "code", "execution_count": 124, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0gAAANICAYAAAD958/bAAAEGWlDQ1BrQ0dDb2xvclNwYWNl\nR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi\n6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lp\nurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZP\nC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q4\n4WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23B\naIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys\n2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y\n5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrl\nSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98\nhTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7C\nlP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmK\nPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZf\nsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJ\nxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19\nzn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNC\nUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU\n97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KT\nYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyA\ngccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/\nqwBnjX8BoJ98VQNcC+8AAEAASURBVHgB7N0J3CxXWSBuQpILZIEAsgUIGXaURMIixMiqIkgQ\nBhBFRw2SgLIpMoKD/gMJ4IIDiBJFcAkgOGpE0KvCILJJCIRNlhEE4SZACCCEJXtC7v99ky6s\nr9Nff71Vd9U5z/n93lv7qXOe00u9X3fXvcY1FAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIAAgUkC+0xaaR0BAhsTuG2c+YDR2b8Y04wSy42iU4dHfDni7Igr\n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\nTrrAz2Oy/rwwzr/+pslBESeNIs3eHLF7FN+I6Swlz9eU/EvpO5uF0fSLMf3XiHuOrc/F27fW\n7Yn5u7aWczbdMynNcturJt/+BCYX5z3fqIqJk3Y//u+EPd4U6zJpnqfcobVzJoDvai3nbH66\nltEui5i0jx+f/2SsyMfWd0XcMOIeER+NuFdElhyvHJt8LN0/4rcjHhLRlL+Jmbz4y7Kqtv3l\nVdV9+98unr/frnw0M37OXH2/0bac5Pj8SWu5mX1FzDxmtHCzmN4o4suj5Xkni/p18dict+25\n/yKvR4ucZ95j/iMO+GrroPyDVruc3l6I+fa++Wl1UxYdn7dEBceNKrlfTDPyfesDEX8fkc/x\nD0YoBAYlIEEa1HBpbGUCZ03o76WtdfuM5vPiuZnPVf/faP12k5vHhrz4nlYyiciLy4zx8k+x\n4qKI64w2fOf4DjssPyu2P7+1z4djPpOs9gVIbs5Pp5qSr1X7RuSFXFOaBDGXvzBamfvdajQ/\nPskL0byYOD7ijyOyvqZ8R8zkhWBGJkvPjJh0wRirt5TDW0vZ3uZiurX6Gue0F1rzt2vN50Vg\nXkxsV3LMshx+5b9X/TPv+VqHXm328NaaxrK1ats+tPcZn8/HZVPSNC+adiqLmOxUZyY5mSBl\n+eGI60fsyoUomejnY/3+EfeOyMdP7tOU1zUzMV1F2y6MetKiXdJp1c/fdv2Tzpnbb9Ha6fMx\n335taTZ9upkZTfO5/vaxdbMuLup3eOsEq3pstqqceXaR16OZK19ix/GE6LKxur42tjxpnHOX\nRcfnF+LYIyPaf+C5ZiznH3cynh2Rr22Pj9jutTA2KQT6JZBvBgoBAv0UyAub8TLpAnz8De/d\ncdD54we2lifV0dq842wmR5+IuMtoz/zL/Kzlf8WOz2/tnF8pfHDEeHKUu+SnL+2S5/lSa0Um\nNU2Z5433lXHQ2yJ+LuLhEXeMaJes948iPhPx1vaGCfPtdl93wvZcdeA269vjlv361232y9Wf\nHW1b5nxTqr/S/yajHSb1Y7s+TKuzfeF2yLQdW9sWMWkdPnH2b2Ltr4225GPtgNZeb4n5XRGZ\nIB0U8ciIIyKy5Ccl/3Ll3FX/rKJtk57T7XrzTKt+/k46Z56nfeF8cK6YUK43tm48uRvbPHWx\n3c9ZH+9ZYT7mV/3YnNrQbTZ29Xq0zelmXj2eEI0f2HYf39Zebu83z/h8Iyr5noiHRfxsxH0j\n8rnULg+JhddG3K+90jyBPgtIkPo8OtpWukD+lW0VZU9UkklP81foV8X8yyKWKZk8ZOKQn1y8\nKSIThnZp//X5k+0NU+Z/LLb9emt7/iX62IjtkrnPtfbN2e+MyDfuLJnEtBOzJoHI7U/KHSaU\ndgJyVmz/1YhM2A6NyAvkR0Tkm3x+spSWubxTgpSfSDXl+jFz04hzmxUxzTEeT8Caze2/zl8e\nKx8UsdOnLMucrznvpGnW21yE3mnCDmk/b/n31gHXivnDI/ZENOXWMfPCiI9GfCxid8QiJnHY\n1PKB2Hp2xGERd4vIx06WvNj/UES+DzZJezONVVf+8P1bOTMqq2jbJU1lrememF/187dV/TUm\nnTO372ntlI/d20S0H1+5+e75z6jkBXR7TJv1s04X9evisTlrm9v7LfJ61D5+p/l8rdhkWXR8\nss35PHl9xOsi8vmUCdMDI34m4vCILPeNyNfs5uvQuU4hQIAAAQJXCrwi/s2LoYxJX6l6T2v7\nc2J+vLw1VjTHv6C18czW+re31ufsoyPyIuNvI34jYvyve7HqaiX/2tecJy/4r93a41GtbVfE\n/J1b27abvW1s+GZEU2debBwWkX+hHo/2hcI7WsecFvNNyU8Emrr2xHwmNbOU58ZO74rIi+M3\nTDggk8Gm3naSmW/2zfqcNufLhCgvHJttecHfLj8VC822nL66tTH/qtredv/Wtqz/9IgzIv44\n4ocjsixzvqtqmPzv78Xqpi15AXN4a7cc+49GNNtzepvW9mxns+25rfV5MXRRa9sprW05+9LW\ntvNiPs+ziEkctmP5ndijaWMz/cvRUfl4++qE7Q8abW8mi7btia269zSVjU1X/fyd5ZwHRhvO\nj2g88gJ3/1a7bhTzedHcbG+/Xm33fMjDt9u2qN8yj81sz6zl47Fj09enbXPQql+Pdno/2O65\nlYl809Z/mdDWZltOm9eOZreTW8e+u1kZ00XG57vjuHwdTbuLI+4W0S5Hx0K7LTdrbzRPgAAB\nAgQagRfFTPOGcUHM5xvdq5qNMV00QXpkHNvUm9M/jLhfxAkRn49otv1zzM9SHhw7NcfkND8l\n+pWIX49oX/T+RSzPUv537NSub9p8JlNNGU/GXhMbfj8i7Zo6truYaepoT5/ROi6Pz4TmPhH5\nF89fjrgkoqn3MTHflO0u+nL7SyKaY3L65xE/G5F1XxbR3tZOkPaJbR9ubT8r5jOh+v6IfEy0\nj8s2NmXR8zXHT5rePFZeGNGcM9vyrIifj3h/a32zfZYEKQ678j+6bY7J6d9FPDNid0TbJi+C\nsyxqctXR2/9739jUbkfOP761eybf7e1fi+Vdre05u2jb2snKZ8bqbBZX/fyd5Zx57nzutPud\nY51/fMg/pOQfMZptmUgdHtGUac+H7bYt6rfMY7Np7yzTWRKkVb8e7fR+cHo0vBmD9h8f8n2j\nWb+qBGmR8Tkg2pF/bGra8tGYf2zEnSJ+NOLNEc22T8S8QoAAAQIEJgo8PNY2bxjt6XVHe7+n\ntf05o3XtyVtb21/Q2pBvbuMXzu36c/4LEXdoHbPTbF7gj9fRXn5bbL/BTpXE9mzb2RHtY6fN\ntxOkfeO4N005Nt90D46YteSnFG+MmHb+3JZ/Tc92N2W7i77cfsOI/IRuUp1fj/V/1dr26phv\nl7vEwk42L24fEPPLnG+sqi2L4xfL7f5kApFJQ7Nu1gTpOnHMe1vHNce3px+I7flpRlMWMWmO\n3W6aj6MvR7TP2+7DE8a2/dk2FS3StlmSlVU/f2c5Z9PFJ8fMFWP9bztlcvRjzc6j6bTnw7Rt\ni/jlKRd9bI41e+riLAlSPo5W+Xr08Kivbd3MN+8H60yQEmeR8clPWi/eph9Nfy6J7feKUAgQ\nIECAwESB/WPtn0Q0bxw5zQu3wyOyLJogXXX0Vd/5zqThWxHNOfL3LX8Z0U48YnHHkhdtPxPx\n2Yimrpx+MeKUiF0Rs5RjYqf28TvNj7czL0peEPGNVj356UNetOfX8+Yt14oDfiXicxHjbflS\nrPuliEyk2mXaRV/ud0hEtifblXXmBeeHIo6MeFJEc578ZGi83ChW/E3E1yKa/XK6JyIvdCeV\nZc43qb5m3cNj5gsRTTsywUv7a0a0E4xbx3JTtruIa7bvFzPPjvhqRFNvTvMTq0zCM+EbL4uY\njNcxvpxfVWzO/5mxjZksNdty+oix7e3FeduWY9jUPX7edr05/zMRq3j+znPOPO+jI/4hov0Y\nzIveN0a0xzoWryzTng/TtuXB8/pddcarbqgy72OzOXaW6cdjp2acMiHbrqzy9Win94Ptnltd\nfILU9HeR8blHHPyGiPb7TmO5O9bfpanclMBQBNp/IR1Km7WTQAkCeVF4x4izIvJCfdXlwKjw\niIj8y92nI/JCd9GSrxM3j8gLpUyWdrrIi106KXmRfqeIAyI+EpEXcMuUrO9mEbccVbInppn8\n5Rv7oiXblu5pngnFvOW/xQG3iMjHxNkRecExrSx7vu3qznZkEvbhiJ3asF0dk9Zn3/JxlBe6\n+djP32/tVOY12am+VW7vqm2rfP7O0998TuTjN/+okolaTrssi/jlMV08NuftZ1qt6vWo6/eD\nefvW7D/v+BwUBx4WceOIcyPOisivZCsECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg\nQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg\nQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg\nQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg\nQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg\nQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg\nQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg\nQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg\nQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg\nQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg\nQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQKDFdhnsC0vr+F3jy7t\nX1639IgAAQIECBAgQKACgUujj+8voZ8SpH6MYiZHZ/ajKVpBgAABAgQIECBAYCGBvKYdfJK0\n30Jdd9CqBZpPjg6OijP7VggQIECAAAECBAgMRWBXNPSbETkdfJEg9WsIMzmSIPVrTLSGAAEC\nBAgQIECgIoFrVtRXXSVAgAABAgQIECBAgMBUAQnSVB4bCRAgQIAAAQIECBCoSUCCVNNo6ysB\nAgQIECBAgAABAlMFJEhTeWwkQIAAAQIECBAgQKAmAQlSTaOtrwQIECBAgAABAgQITBWQIE3l\n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\nr+t6PKuAH6nNKmU/AgSGJnDNaPAfRxwXkb9D+MmICyOU8gUOii5+KOLsiAdM6O4Vo3X5/6Qo\n5Qn8TXQpf2syXo6JFXeNyE8Q8qu2+Z9FK+UJHBxdelvEJRHfF9E832P2ynLH0dTd7EYQJgQI\n1C3gE6S6xv/no7v5V8LXRfj/juoa++xt3t43b8hxVC60ytExn+s/2Fpntg6B34xu5mvCvero\nbtW9zK/Q5ljnjXnaJZPkTJje0l5pnsC4gE+QxkUsEyBQgsANoxO/PurI9WL619t06v9v545x\nDYqiKIBOgVJURqD8E1BpTMAcMIA/FsMQGoXCFMRYFPYpNBLRaDjrJrvwKnvlvrzkHe4y100R\nXuB8+eVVvv8x2Sfb5JDU9KBOr7ol9QduiwCB3xRYp1bd8/Vzur9kl9T9/5/U5HCTWAQIECAQ\nAROkPttgkar19vBdhn1IWjadpfXlaR+c83naUkNpE6Ree2Ceutfk8RyoFyOnZJJYBAgQIECA\nAIHWAuO0rxOrBq0VlCfQU2CU2jU9qhMNLQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE\nCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE\nCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE\nCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE\nCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE\nCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE\nCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE\nCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE\nCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE\nCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE\nCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE\nCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE\nCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE\nCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE\nCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE\nCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE\nCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE\nCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE\nCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE\nCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE\nCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE\nCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIfELgD2Pboo/ZKtLUAAAAASUVO\nRK5CYII=", "text/plain": [ "Plot with title “the 5 20-sided dice were rolled 10 times”" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "(function(number_of_dice, \n", " number_of_sides, \n", " number_of_rolls) \n", " boxplot((\n", " replicate(\n", " number_of_dice, \n", " sample(\n", " 1:number_of_sides, \n", " number_of_rolls, \n", " replace = TRUE))), \n", " main = paste(\n", " 'the ' , number_of_dice, ' ', number_of_sides, '-sided dice were rolled ', number_of_rolls, ' times', \n", " sep=''))\n", " )(\n", " number_of_dice = 5, \n", " number_of_rolls = 10, \n", " number_of_sides = 20)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can add some colors to the figure by adding `col = c(1:number_of_dice)`, this will generate enough colors so that each bar has a different color:" ] }, { "cell_type": "code", "execution_count": 125, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0gAAANICAYAAAD958/bAAAEGWlDQ1BrQ0dDb2xvclNwYWNl\nR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi\n6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lp\nurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZP\nC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q4\n4WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23B\naIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys\n2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y\n5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrl\nSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98\nhTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7C\nlP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmK\nPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZf\nsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJ\nxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19\nzn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNC\nUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU\n97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KT\nYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyA\ngccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/\nqwBnjX8BoJ98VQNcC+8AAEAASURBVHgB7N0L3GxlWTD82W72BgEFNTOP8KJmlpoKpuSrYr5Z\nHjI/Ncve1wIV0zBN/MzSPvKYvaaYpn2UWqRpZlZqaPFaiic8ImqaYqaAx7BEFBDYsPd3XZtZ\nfIvZz8wzM8+sNWvd63//fteeNWvd6z7873meWdczhz0aKQQIECBAgAABAgQIECBAgAABAgQI\nECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI\nECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI\nECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI\nECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI\nECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI\nECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI\nECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI\nECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI\nECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI\nECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI\nECBAgAABAgQIECBAgAABAgQIECBAgAABAhsJbNtop30ECKxN4DbR84Hj3v8jbjNKLDeOSR0e\n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\nWynZ3k0jbjlu5Ny4zeQvn9iXLTm2dE/zTCgWLf8tTrhFRD4mzo/IC45ZZav9TWs7x5FJ2Kci\nNhvDtDY22p9zy8dRXujmYz8/v7VZWdRks/ZWebypsa3y53eR+ebPRD5+848qmajlbZNlGb88\np4nH5qLzTKtV/T5q+vlg0blV9Rddn4PjxFtFfH/ENyLOi8i3ZCsECBAgQIAAAQIECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA\nAQK9FdjW25GXN/CjYko7ypuWGREgQIAAAQIECAxA4IqY41klzFOC1I1VzOToo90YilEQIECA\nAAECBAgQWEogr2l7nyTtt9TUnbRqgeqVo+tFw5l9KwQIECBAgAABAgT6IrAzBvrdiLztfZEg\ndWsJMzmSIHVrTYyGAAECBAgQIEBgQALXGdBcTZUAAQIECBAgQIAAAQIzBSRIM3kcJECAAAEC\nBAgQIEBgSAISpCGttrkSIECAAAECBAgQIDBTQII0k8dBAgQIECBAgAABAgSGJCBBGtJqmysB\n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\n/TQZPA/UCyMvJ9snigABAgQIECDQtMA26b4+sWrjphU0T6BNga3Sdp09qk80VAQIECBAgAAB\nAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAAB\nAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAAB\nAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAAB\nAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAAB\nAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAAB\nAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAAB\nAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAAB\nAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAAB\nAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAAB\nAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAAB\nAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAAB\nAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAAB\nAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAAB\nAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAAB\nAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAAB\nAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAAB\nAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAAB\nAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAAB\nAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAAB\nAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAAB\nAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAAB\nAgT+B4E/Ac4oDjX4M7dMAAAAAElFTkSuQmCC", "text/plain": [ "Plot with title “the 5 20-sided dice were rolled 10 times”" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "(function(number_of_dice, \n", " number_of_sides, \n", " number_of_rolls) \n", " boxplot((\n", " replicate(\n", " number_of_dice, \n", " sample(\n", " 1:number_of_sides, \n", " number_of_rolls, \n", " replace = TRUE))), \n", " main = paste(\n", " 'the ' , number_of_dice, ' ', number_of_sides, '-sided dice were rolled ', number_of_rolls, ' times', \n", " sep=''), \n", " col = c(1:number_of_dice))\n", " )(\n", " number_of_dice = 5, \n", " number_of_rolls = 10, \n", " number_of_sides = 20)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Importing and Exporting files\n", "- There are a few different ways to read and write files in R.\n", "- We will use `read.table()` and `write.table()`.\n", "- Lets use some of the pre-loaded data that comes with R. \n", "- First, let's import the `iris` data as a data frame and use `head()` to look at the first few lines" ] }, { "cell_type": "code", "execution_count": 126, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
A data.frame: 6 × 5
Sepal.LengthSepal.WidthPetal.LengthPetal.WidthSpecies
<dbl><dbl><dbl><dbl><fct>
5.13.51.40.2setosa
4.93.01.40.2setosa
4.73.21.30.2setosa
4.63.11.50.2setosa
5.03.61.40.2setosa
5.43.91.70.4setosa
\n" ], "text/latex": [ "A data.frame: 6 × 5\n", "\\begin{tabular}{r|lllll}\n", " Sepal.Length & Sepal.Width & Petal.Length & Petal.Width & Species\\\\\n", " & & & & \\\\\n", "\\hline\n", "\t 5.1 & 3.5 & 1.4 & 0.2 & setosa\\\\\n", "\t 4.9 & 3.0 & 1.4 & 0.2 & setosa\\\\\n", "\t 4.7 & 3.2 & 1.3 & 0.2 & setosa\\\\\n", "\t 4.6 & 3.1 & 1.5 & 0.2 & setosa\\\\\n", "\t 5.0 & 3.6 & 1.4 & 0.2 & setosa\\\\\n", "\t 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", "| 5.1 | 3.5 | 1.4 | 0.2 | setosa |\n", "| 4.9 | 3.0 | 1.4 | 0.2 | setosa |\n", "| 4.7 | 3.2 | 1.3 | 0.2 | setosa |\n", "| 4.6 | 3.1 | 1.5 | 0.2 | setosa |\n", "| 5.0 | 3.6 | 1.4 | 0.2 | setosa |\n", "| 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": [ "iris <- data.frame(iris)\n", "head(iris)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can write the output to a file using `write.table`:" ] }, { "cell_type": "code", "execution_count": 127, "metadata": {}, "outputs": [], "source": [ "write.table(iris, file = '~/iris_table.txt')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Use `read.table()` to pull data into R:" ] }, { "cell_type": "code", "execution_count": 128, "metadata": {}, "outputs": [], "source": [ "iris_table_2 <- read.table('~/iris_table.txt')" ] }, { "cell_type": "code", "execution_count": 129, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
A data.frame: 6 × 5
Sepal.LengthSepal.WidthPetal.LengthPetal.WidthSpecies
<dbl><dbl><dbl><dbl><fct>
5.13.51.40.2setosa
4.93.01.40.2setosa
4.73.21.30.2setosa
4.63.11.50.2setosa
5.03.61.40.2setosa
5.43.91.70.4setosa
\n" ], "text/latex": [ "A data.frame: 6 × 5\n", "\\begin{tabular}{r|lllll}\n", " Sepal.Length & Sepal.Width & Petal.Length & Petal.Width & Species\\\\\n", " & & & & \\\\\n", "\\hline\n", "\t 5.1 & 3.5 & 1.4 & 0.2 & setosa\\\\\n", "\t 4.9 & 3.0 & 1.4 & 0.2 & setosa\\\\\n", "\t 4.7 & 3.2 & 1.3 & 0.2 & setosa\\\\\n", "\t 4.6 & 3.1 & 1.5 & 0.2 & setosa\\\\\n", "\t 5.0 & 3.6 & 1.4 & 0.2 & setosa\\\\\n", "\t 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", "| 5.1 | 3.5 | 1.4 | 0.2 | setosa |\n", "| 4.9 | 3.0 | 1.4 | 0.2 | setosa |\n", "| 4.7 | 3.2 | 1.3 | 0.2 | setosa |\n", "| 4.6 | 3.1 | 1.5 | 0.2 | setosa |\n", "| 5.0 | 3.6 | 1.4 | 0.2 | setosa |\n", "| 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": [ "head(iris_table_2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notice that the `Species` column is a factor (``). If we'd like text strings to be characters instead of factors when we import we can use `stringsAsFactors = FALSE`:" ] }, { "cell_type": "code", "execution_count": 130, "metadata": {}, "outputs": [], "source": [ "iris_table_3 <- read.table('~/iris_table.txt', stringsAsFactors = FALSE)" ] }, { "cell_type": "code", "execution_count": 131, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
A data.frame: 6 × 5
Sepal.LengthSepal.WidthPetal.LengthPetal.WidthSpecies
<dbl><dbl><dbl><dbl><chr>
5.13.51.40.2setosa
4.93.01.40.2setosa
4.73.21.30.2setosa
4.63.11.50.2setosa
5.03.61.40.2setosa
5.43.91.70.4setosa
\n" ], "text/latex": [ "A data.frame: 6 × 5\n", "\\begin{tabular}{r|lllll}\n", " Sepal.Length & Sepal.Width & Petal.Length & Petal.Width & Species\\\\\n", " & & & & \\\\\n", "\\hline\n", "\t 5.1 & 3.5 & 1.4 & 0.2 & setosa\\\\\n", "\t 4.9 & 3.0 & 1.4 & 0.2 & setosa\\\\\n", "\t 4.7 & 3.2 & 1.3 & 0.2 & setosa\\\\\n", "\t 4.6 & 3.1 & 1.5 & 0.2 & setosa\\\\\n", "\t 5.0 & 3.6 & 1.4 & 0.2 & setosa\\\\\n", "\t 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 <chr> |\n", "|---|---|---|---|---|\n", "| 5.1 | 3.5 | 1.4 | 0.2 | setosa |\n", "| 4.9 | 3.0 | 1.4 | 0.2 | setosa |\n", "| 4.7 | 3.2 | 1.3 | 0.2 | setosa |\n", "| 4.6 | 3.1 | 1.5 | 0.2 | setosa |\n", "| 5.0 | 3.6 | 1.4 | 0.2 | setosa |\n", "| 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": [ "head(iris_table_3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notice that the `Species` column is a character (``)\n", "To convert back into a factor:" ] }, { "cell_type": "code", "execution_count": 132, "metadata": {}, "outputs": [], "source": [ "iris_table_3$Species <- as.factor(iris_table_3$Species)" ] }, { "cell_type": "code", "execution_count": 133, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\t\n", "\t\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "
A data.frame: 6 × 5
Sepal.LengthSepal.WidthPetal.LengthPetal.WidthSpecies
<dbl><dbl><dbl><dbl><fct>
5.13.51.40.2setosa
4.93.01.40.2setosa
4.73.21.30.2setosa
4.63.11.50.2setosa
5.03.61.40.2setosa
5.43.91.70.4setosa
\n" ], "text/latex": [ "A data.frame: 6 × 5\n", "\\begin{tabular}{r|lllll}\n", " Sepal.Length & Sepal.Width & Petal.Length & Petal.Width & Species\\\\\n", " & & & & \\\\\n", "\\hline\n", "\t 5.1 & 3.5 & 1.4 & 0.2 & setosa\\\\\n", "\t 4.9 & 3.0 & 1.4 & 0.2 & setosa\\\\\n", "\t 4.7 & 3.2 & 1.3 & 0.2 & setosa\\\\\n", "\t 4.6 & 3.1 & 1.5 & 0.2 & setosa\\\\\n", "\t 5.0 & 3.6 & 1.4 & 0.2 & setosa\\\\\n", "\t 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", "| 5.1 | 3.5 | 1.4 | 0.2 | setosa |\n", "| 4.9 | 3.0 | 1.4 | 0.2 | setosa |\n", "| 4.7 | 3.2 | 1.3 | 0.2 | setosa |\n", "| 4.6 | 3.1 | 1.5 | 0.2 | setosa |\n", "| 5.0 | 3.6 | 1.4 | 0.2 | setosa |\n", "| 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": [ "head(iris_table_3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Another convenient function is `list.files()`, which you can use with a wildcard (`*`) to return a list of all files in a directory (specified in `path =`) that start with `iris_`:" ] }, { "cell_type": "code", "execution_count": 134, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
    \n", "\t
  1. 'iris_csv.csv'
  2. \n", "\t
  3. 'iris_table.txt'
  4. \n", "
\n" ], "text/latex": [ "\\begin{enumerate*}\n", "\\item 'iris\\_csv.csv'\n", "\\item 'iris\\_table.txt'\n", "\\end{enumerate*}\n" ], "text/markdown": [ "1. 'iris_csv.csv'\n", "2. 'iris_table.txt'\n", "\n", "\n" ], "text/plain": [ "[1] \"iris_csv.csv\" \"iris_table.txt\"" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "list.files(path = '~', pattern = 'iris_*')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# R packages\n", "- Although R comes with many built in functions, you will probably want to install and use various R packages.\n", "- You can install the packages using `install.packages('package_name_here')` (where you would replace 'package_name_here' with your package of choice, in quotes). \n", "- This will download the package and any additional required dependencies. \n", "- Uncomment out the next line (e.g., remove the #) to install the the 'ggplot2' package:" ] }, { "cell_type": "code", "execution_count": 135, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "The downloaded binary packages are in\n", "\t/var/folders/72/vj4x94hd7375wt06bb5fr36hwbf4ln/T//RtmpgK2EAd/downloaded_packages\n" ] } ], "source": [ "install.packages('ggplot2')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Before you can actually use the package, you have to load it as follows:" ] }, { "cell_type": "code", "execution_count": 136, "metadata": {}, "outputs": [], "source": [ "library('ggplot2')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Most R packages are found in CRAN - the central repository for R package. However, packages can be found in different places. Many of the packages of interest for biologists will be in Bioconductor. \n", "\n", "There are two steps to downloading a package from Bioconductor -- first, install BiocManager (again, remove the # to actually run the install)." ] }, { "cell_type": "code", "execution_count": 137, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "The downloaded binary packages are in\n", "\t/var/folders/72/vj4x94hd7375wt06bb5fr36hwbf4ln/T//RtmpgK2EAd/downloaded_packages\n" ] } ], "source": [ "install.packages(\"BiocManager\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then, load `BiocManager` and use `BiocManager::install()` to install a package." ] }, { "cell_type": "code", "execution_count": 138, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Bioconductor version 3.8 (BiocManager 1.30.9), ?BiocManager::install for help\n", "Bioconductor version 3.8 (BiocManager 1.30.9), R 3.5.2 (2018-12-20)\n", "Installing package(s) 'org.Hs.eg.db'\n", "installing the source package ‘org.Hs.eg.db’\n", "\n", "Old packages: 'arrangements', 'backports', 'callr', 'clipr', 'curl',\n", " 'data.table', 'devtools', 'digest', 'DT', 'ellipsis', 'fivethirtyeight',\n", " 'foreign', 'ggforce', 'ggplotify', 'ggpubr', 'ggraph', 'ggsignif', 'hms',\n", " 'htmlTable', 'htmltools', 'htmlwidgets', 'httpuv', 'httr', 'KernSmooth',\n", " 'knitr', 'lambda.r', 'later', 'markdown', 'matrixStats', 'mgcv', 'modelr',\n", " 'nlme', 'openxlsx', 'pkgbuild', 'pkgconfig', 'promises', 'purrr', 'R.oo',\n", " 'Rcpp', 'RcppArmadillo', 'rlang', 'rmarkdown', 'RSQLite', 'rvcheck',\n", " 'seqinr', 'shiny', 'survival', 'sys', 'testthat', 'tinytex', 'units',\n", " 'whisker', 'xfun', 'xml2', 'zip'\n" ] } ], "source": [ "library('BiocManager')\n", "BiocManager::install(\"org.Hs.eg.db\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Use the `sessionInfo()` function to see more information about your loaded R packages and namespace:" ] }, { "cell_type": "code", "execution_count": 139, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "R version 3.5.2 (2018-12-20)\n", "Platform: x86_64-apple-darwin15.6.0 (64-bit)\n", "Running under: macOS Mojave 10.14.2\n", "\n", "Matrix products: default\n", "BLAS: /Library/Frameworks/R.framework/Versions/3.5/Resources/lib/libRblas.0.dylib\n", "LAPACK: /Library/Frameworks/R.framework/Versions/3.5/Resources/lib/libRlapack.dylib\n", "\n", "locale:\n", "[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8\n", "\n", "attached base packages:\n", "[1] stats graphics grDevices utils datasets methods base \n", "\n", "other attached packages:\n", "[1] BiocManager_1.30.9 ggplot2_3.2.1 \n", "\n", "loaded via a namespace (and not attached):\n", " [1] Rcpp_1.0.1 magrittr_1.5 tidyselect_0.2.5 munsell_0.5.0 \n", " [5] uuid_0.1-2 colorspace_1.4-1 R6_2.4.0 rlang_0.4.0 \n", " [9] dplyr_0.8.3 tools_3.5.2 grid_3.5.2 gtable_0.3.0 \n", "[13] withr_2.1.2 htmltools_0.3.6 assertthat_0.2.1 lazyeval_0.2.2 \n", "[17] digest_0.6.20 tibble_2.1.3 crayon_1.3.4 IRdisplay_0.7.0 \n", "[21] purrr_0.3.2 repr_1.0.1 base64enc_0.1-3 vctrs_0.2.0 \n", "[25] IRkernel_1.0.2 zeallot_0.1.0 glue_1.3.1 evaluate_0.14 \n", "[29] pbdZMQ_0.3-3 compiler_3.5.2 pillar_1.4.2 scales_1.0.0 \n", "[33] backports_1.1.4 jsonlite_1.6 pkgconfig_2.0.2 \n" ] } ], "source": [ "print(sessionInfo())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# If we have time, we can talk about some `apply()` functions:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The `apply()` functions\n", "- R uses a family of `apply()` functions to repetitively manipulate objects while avoiding for loops. \n", "- How you use them will depend on the format of your data and what operations you're trying to perform.\n", "- We will talk about `apply()`, `lapply()`, and `sapply()`.\n", "- There is also `mapply()`, `vapply()`, `rapply()`, and `tapply()`, but we won't talk about those today.\n", "\n", "- **`apply()`** Applies a function to an array (or matrix) and returns an array (or matrix)\n", "- **`lapply()`** Applies a function to each element of a list or vector and returns a list\n", "- **`sapply()`** Applies a function to each element of a list or vector and returns a vector\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `apply()` \n", "- `apply()` applies a function to an array (or matrix) and returns an array (or matrix)\n", "- The general format of an `apply()` call is as follows:\n", "\n", "```\n", "apply(X, MARGIN, FUN, ...)\n", "\n", "```\n", "- `X` is the array or matrix to apply the function\n", "- `MARGIN` is where the function should be applied - `1` is for rows, `2` is for columns, `c(1,2)` is rows and columns, can also be a character vector of dimension names if `X` has dimnames.\n", "- `FUN` Function to be applied\n", "Let's go back to the dice rolling function:" ] }, { "cell_type": "code", "execution_count": 140, "metadata": {}, "outputs": [], "source": [ "rolled_dice <- roll(number_of_rolls = 10, number_of_sides = 20, number_of_dice = 5)" ] }, { "cell_type": "code", "execution_count": 141, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]\n", "[1,] 14 16 19 6 18 1 20 14 1 16\n", "[2,] 7 1 6 14 2 5 5 8 10 14\n", "[3,] 15 8 9 14 11 5 10 14 9 12\n", "[4,] 13 15 13 14 14 20 5 10 12 11\n", "[5,] 17 11 1 11 6 6 6 9 9 7\n" ] } ], "source": [ "print(rolled_dice)" ] }, { "cell_type": "code", "execution_count": 142, "metadata": {}, "outputs": [ { "data": { "text/html": [ "'matrix'" ], "text/latex": [ "'matrix'" ], "text/markdown": [ "'matrix'" ], "text/plain": [ "[1] \"matrix\"" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "class(rolled_dice)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "I'm going to name the rows and columns using the `paste()` and `dimnames()`:" ] }, { "cell_type": "code", "execution_count": 143, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " die_1 die_2 die_3 die_4 die_5 die_6 die_7 die_8 die_9 die_10\n", "roll_1 14 16 19 6 18 1 20 14 1 16\n", "roll_2 7 1 6 14 2 5 5 8 10 14\n", "roll_3 15 8 9 14 11 5 10 14 9 12\n", "roll_4 13 15 13 14 14 20 5 10 12 11\n", "roll_5 17 11 1 11 6 6 6 9 9 7\n" ] } ], "source": [ "dimnames(rolled_dice) <- list(\n", "paste('roll', 1:5, sep = '_'),\n", " paste('die', 1:10, sep = '_'))\n", "\n", "print(rolled_dice)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's try using `apply()` to increase every value by 1:" ] }, { "cell_type": "code", "execution_count": 144, "metadata": {}, "outputs": [ { "data": { "text/html": [ "'matrix'" ], "text/latex": [ "'matrix'" ], "text/markdown": [ "'matrix'" ], "text/plain": [ "[1] \"matrix\"" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ " die_1 die_2 die_3 die_4 die_5 die_6 die_7 die_8 die_9 die_10\n", "roll_1 15 17 20 7 19 2 21 15 2 17\n", "roll_2 8 2 7 15 3 6 6 9 11 15\n", "roll_3 16 9 10 15 12 6 11 15 10 13\n", "roll_4 14 16 14 15 15 21 6 11 13 12\n", "roll_5 18 12 2 12 7 7 7 10 10 8\n" ] } ], "source": [ "add_one <- apply(rolled_dice, c(1,2), function(element) element + 1)\n", "class(add_one)\n", "print(add_one)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- The `c(1,2)` argument to `apply()` means that the function should apply to all rows and columns.\n", "- What about if we use apply to calculate sums for each row and column?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we use `1` it will apply the function to each row:" ] }, { "cell_type": "code", "execution_count": 145, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "roll_1 roll_2 roll_3 roll_4 roll_5 \n", " 125 72 107 127 83 \n" ] } ], "source": [ "row_sums <- apply(rolled_dice, 1, function(element) sum(element))\n", "print(row_sums) " ] }, { "cell_type": "code", "execution_count": 146, "metadata": {}, "outputs": [ { "ename": "ERROR", "evalue": "Error in parse(text = x, srcfile = src): :1:4: unexpected symbol\n1: If we\n ^\n", "output_type": "error", "traceback": [ "Error in parse(text = x, srcfile = src): :1:4: unexpected symbol\n1: If we\n ^\nTraceback:\n" ] } ], "source": [ "If we use `2` it will apply the function to each column:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "col_sums <- apply(rolled_dice, 2, function(element) sum(element))\n", "print(col_sums) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `lapply()`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- `lapply()` works on lists and returns a list.\n", "- Since a data frame is a series of lists, if you apply it to a data frame it will execute the function on each column of the data frame.\n", "- The general format is as follows:\n", "\n", "```\n", "lapply(X, FUN)\n", "\n", "```\n", "- `X` A vector or an object\n", "- `FUN` Function applied to each element of X\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "rolled_dice_df <- as.data.frame(rolled_dice)\n", "class(rolled_dice_df)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(rolled_dice_df)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "col_sums_df <- lapply(rolled_dice_df, sum)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "str(col_sums_df)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "rolled_dice" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "However, if you use `lapply()` to calculate sums on the `rolled_dice` matrix, you get back a very long list (since `lapply()` wants to return a list)." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "class(rolled_dice)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "col_sums <- lapply(rolled_dice, sum)\n", "str(col_sums)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `sapply`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "- `sapply()` is similar to `lapply()`, but it returns a vector rather than a list.\n", "- The general format for an `sapply()` call is as follows:\n", "\n", "```\n", "sapply(X, FUN)\n", "\n", "```\n", "- `X` A vector or an object\n", "- `FUN` Function applied to each element of x" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "col_sums_df <- sapply(rolled_dice_df, sum)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "class(col_sums_df)\n", "is.vector(col_sums_df)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(col_sums_df)" ] } ], "metadata": { "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": "3.5.2" } }, "nbformat": 4, "nbformat_minor": 4 }