{
"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- <NA>
\n",
"\t- <NA>
\n",
"\t- <NA>
\n",
"\t- <NA>
\n",
"\t- <NA>
\n",
"\t- <NA>
\n",
"\t- <NA>
\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- FALSE
\n",
"\t- FALSE
\n",
"\t- TRUE
\n",
"\t- FALSE
\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- '__letters'
\n",
"\t- '__numbers'
\n",
"\t- '__boolean'
\n",
"
\n",
" \n",
"\t- $class
\n",
"\t\t- 'data.frame'
\n",
"\t- $row.names
\n",
"\t\t\n",
"\t- '__first'
\n",
"\t- '__second'
\n",
"\t- '__third'
\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- 'Boo'
\n",
"\t- 'Chuckles'
\n",
"\t- 'Rex'
\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- 176
\n",
"\t- 3
\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",
"A data.frame: 6 × 3\n",
"\n",
"\tRun | conc | density |
\n",
"\t<ord> | <dbl> | <dbl> |
\n",
"\n",
"\n",
"\t1 | 0.04882812 | 0.017 |
\n",
"\t1 | 0.04882812 | 0.018 |
\n",
"\t1 | 0.19531250 | 0.121 |
\n",
"\t1 | 0.19531250 | 0.124 |
\n",
"\t1 | 0.39062500 | 0.206 |
\n",
"\t1 | 0.39062500 | 0.215 |
\n",
"\n",
"
\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",
"A data.frame: 3 × 3\n",
"\n",
"\tRun | conc | density |
\n",
"\t<ord> | <dbl> | <dbl> |
\n",
"\n",
"\n",
"\t1 | 0.04882812 | 0.017 |
\n",
"\t1 | 0.04882812 | 0.018 |
\n",
"\t1 | 0.19531250 | 0.121 |
\n",
"\n",
"
\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",
"A data.frame: 5 × 3\n",
"\n",
"\t | Run | conc | density |
\n",
"\t | <ord> | <dbl> | <dbl> |
\n",
"\n",
"\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",
"\n",
"
\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",
"A data.frame: 20 × 3\n",
"\n",
"\tRun | conc | density |
\n",
"\t<ord> | <dbl> | <dbl> |
\n",
"\n",
"\n",
"\t1 | 0.04882812 | 0.017 |
\n",
"\t1 | 0.04882812 | 0.018 |
\n",
"\t1 | 0.19531250 | 0.121 |
\n",
"\t1 | 0.19531250 | 0.124 |
\n",
"\t1 | 0.39062500 | 0.206 |
\n",
"\t1 | 0.39062500 | 0.215 |
\n",
"\t1 | 0.78125000 | 0.377 |
\n",
"\t1 | 0.78125000 | 0.374 |
\n",
"\t1 | 1.56250000 | 0.614 |
\n",
"\t1 | 1.56250000 | 0.609 |
\n",
"\t1 | 3.12500000 | 1.019 |
\n",
"\t1 | 3.12500000 | 1.001 |
\n",
"\t1 | 6.25000000 | 1.334 |
\n",
"\t1 | 6.25000000 | 1.364 |
\n",
"\t1 | 12.50000000 | 1.730 |
\n",
"\t1 | 12.50000000 | 1.710 |
\n",
"\t2 | 0.04882812 | 0.045 |
\n",
"\t2 | 0.04882812 | 0.050 |
\n",
"\t2 | 0.19531250 | 0.137 |
\n",
"\t2 | 0.19531250 | 0.123 |
\n",
"\n",
"
\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
\n",
"\t- 2
\n",
"\t- 17
\n",
"\t- 18
\n",
"\t- 3
\n",
"\t- 4
\n",
"\t- 19
\n",
"\t- 20
\n",
"\t- 5
\n",
"\t- 6
\n",
"\t- 7
\n",
"\t- 8
\n",
"\t- 9
\n",
"\t- 10
\n",
"\t- 11
\n",
"\t- 12
\n",
"\t- 13
\n",
"\t- 14
\n",
"\t- 15
\n",
"\t- 16
\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",
"A data.frame: 20 × 3\n",
"\n",
"\t | Run | conc | density |
\n",
"\t | <ord> | <dbl> | <dbl> |
\n",
"\n",
"\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",
"\n",
"
\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",
"A data.frame: 3 × 4\n",
"\n",
"\tid | gene.1 | gene.2 | gene.3 |
\n",
"\t<fct> | <dbl> | <dbl> | <dbl> |
\n",
"\n",
"\n",
"\tA | 1 | 5 | 0 |
\n",
"\tB | 1 | 6 | 1 |
\n",
"\tC | 2 | 7 | 0 |
\n",
"\n",
"
\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",
"A data.frame: 9 × 3\n",
"\n",
"\tid | gene | count |
\n",
"\t<fct> | <fct> | <dbl> |
\n",
"\n",
"\n",
"\tA | gene.1 | 1 |
\n",
"\tA | gene.2 | 5 |
\n",
"\tA | gene.3 | 0 |
\n",
"\tB | gene.1 | 1 |
\n",
"\tB | gene.2 | 6 |
\n",
"\tB | gene.3 | 1 |
\n",
"\tC | gene.1 | 2 |
\n",
"\tC | gene.2 | 7 |
\n",
"\tC | gene.3 | 0 |
\n",
"\n",
"
\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- 2
\n",
"\t- 6
\n",
"\t- 1
\n",
"\t- 3
\n",
"\t- 5
\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",
"A data.frame: 6 × 5\n",
"\n",
"\tSepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species |
\n",
"\t<dbl> | <dbl> | <dbl> | <dbl> | <fct> |
\n",
"\n",
"\n",
"\t5.1 | 3.5 | 1.4 | 0.2 | setosa |
\n",
"\t4.9 | 3.0 | 1.4 | 0.2 | setosa |
\n",
"\t4.7 | 3.2 | 1.3 | 0.2 | setosa |
\n",
"\t4.6 | 3.1 | 1.5 | 0.2 | setosa |
\n",
"\t5.0 | 3.6 | 1.4 | 0.2 | setosa |
\n",
"\t5.4 | 3.9 | 1.7 | 0.4 | setosa |
\n",
"\n",
"
\n"
],
"text/latex": [
"A data.frame: 6 × 5\n",
"\\begin{tabular}{r|lllll}\n",
" Sepal.Length & Sepal.Width & Petal.Length & Petal.Width & Species\\\\\n",
" & & & & \\\\\n",
"\\hline\n",
"\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",
"A data.frame: 6 × 5\n",
"\n",
"\tSepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species |
\n",
"\t<dbl> | <dbl> | <dbl> | <dbl> | <fct> |
\n",
"\n",
"\n",
"\t5.1 | 3.5 | 1.4 | 0.2 | setosa |
\n",
"\t4.9 | 3.0 | 1.4 | 0.2 | setosa |
\n",
"\t4.7 | 3.2 | 1.3 | 0.2 | setosa |
\n",
"\t4.6 | 3.1 | 1.5 | 0.2 | setosa |
\n",
"\t5.0 | 3.6 | 1.4 | 0.2 | setosa |
\n",
"\t5.4 | 3.9 | 1.7 | 0.4 | setosa |
\n",
"\n",
"
\n"
],
"text/latex": [
"A data.frame: 6 × 5\n",
"\\begin{tabular}{r|lllll}\n",
" Sepal.Length & Sepal.Width & Petal.Length & Petal.Width & Species\\\\\n",
" & & & & \\\\\n",
"\\hline\n",
"\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",
"A data.frame: 6 × 5\n",
"\n",
"\tSepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species |
\n",
"\t<dbl> | <dbl> | <dbl> | <dbl> | <chr> |
\n",
"\n",
"\n",
"\t5.1 | 3.5 | 1.4 | 0.2 | setosa |
\n",
"\t4.9 | 3.0 | 1.4 | 0.2 | setosa |
\n",
"\t4.7 | 3.2 | 1.3 | 0.2 | setosa |
\n",
"\t4.6 | 3.1 | 1.5 | 0.2 | setosa |
\n",
"\t5.0 | 3.6 | 1.4 | 0.2 | setosa |
\n",
"\t5.4 | 3.9 | 1.7 | 0.4 | setosa |
\n",
"\n",
"
\n"
],
"text/latex": [
"A data.frame: 6 × 5\n",
"\\begin{tabular}{r|lllll}\n",
" Sepal.Length & Sepal.Width & Petal.Length & Petal.Width & Species\\\\\n",
" & & & & \\\\\n",
"\\hline\n",
"\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",
"A data.frame: 6 × 5\n",
"\n",
"\tSepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species |
\n",
"\t<dbl> | <dbl> | <dbl> | <dbl> | <fct> |
\n",
"\n",
"\n",
"\t5.1 | 3.5 | 1.4 | 0.2 | setosa |
\n",
"\t4.9 | 3.0 | 1.4 | 0.2 | setosa |
\n",
"\t4.7 | 3.2 | 1.3 | 0.2 | setosa |
\n",
"\t4.6 | 3.1 | 1.5 | 0.2 | setosa |
\n",
"\t5.0 | 3.6 | 1.4 | 0.2 | setosa |
\n",
"\t5.4 | 3.9 | 1.7 | 0.4 | setosa |
\n",
"\n",
"
\n"
],
"text/latex": [
"A data.frame: 6 × 5\n",
"\\begin{tabular}{r|lllll}\n",
" Sepal.Length & Sepal.Width & Petal.Length & Petal.Width & Species\\\\\n",
" & & & & \\\\\n",
"\\hline\n",
"\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- 'iris_csv.csv'
\n",
"\t- 'iris_table.txt'
\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
}