From d7f34c06508b1523a2a94116ae10df1022c810b5 Mon Sep 17 00:00:00 2001 From: jules32 Date: Mon, 12 Mar 2018 15:23:26 -0700 Subject: [PATCH] rebuild book with @brunj7's PR --- .../figure-html/unnamed-chunk-38-1.png | Bin 92249 -> 92431 bytes docs/github.html | 10 +- docs/rstudio.html | 2 +- docs/search_index.json | 4 +- docs/tidyr.html | 91 +++++++++--------- 5 files changed, 53 insertions(+), 54 deletions(-) diff --git a/docs/data-science-training_files/figure-html/unnamed-chunk-38-1.png b/docs/data-science-training_files/figure-html/unnamed-chunk-38-1.png index 9944a683f7a60a79c0b705d924c8254dbe544e3a..6b48be192433b7ad6a845f0ba37d7903b2e54c42 100644 GIT binary patch literal 92431 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 literal 92249 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

13`VvWAskrh~X8Xl= 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.10 Create a new R Markdown file

Let’s set up this file so we can use it for the rest of the day. I’m going to delete all the text that is already there and write some new text.

Here’s what I’m going to write in my R Markdown file to begin:

---
-title: "My Project"
+title: "Graphics with ggplot2"
 author: "Julie"
 date: "11/21/2017"
 output: html_document
 ---
 
-# Data wrangling with dplyr
+# Learning ggplot2
 
-We are going use "gapminder" data to learn `dplyr`. It's going to be amazing. 
+We're learning ggplot.2 It's going to be amazing. 
 
-

Now, let’s save it. I’m going to call my file wrangle-dplyr.Rmd.

+

Now, let’s save it. I’m going to call my file ggplot2.Rmd.

OK. Now let’s practice with some of those commands that we were working on this morning.

Create a new chunk in your RMarkdown first in one of these ways:

    @@ -595,7 +595,7 @@

    4.10 Create a new R Markdown file
  • if you haven’t deleted a chunk that came with the new file, edit that one

Now, let’s write some R code.

-
x <- seq(1:15)
+
library(tidyverse) # install.packages('tidyverse')

Now, hitting return does not execute this command; remember, it’s just a text file. To execute it, we need to get what we typed in the the R chunk (the grey R code) down into the console. How do we do it? There are several ways (let’s do each of them):

  1. copy-paste this line into the console.
  2. diff --git a/docs/rstudio.html b/docs/rstudio.html index 4333897..6d8f1aa 100644 --- a/docs/rstudio.html +++ b/docs/rstudio.html @@ -522,7 +522,7 @@

    3.4.1 Your turn

    ??install 

    Not all functions have (or require) arguments:

    date()
    -
    ## [1] "Mon Mar 12 12:07:30 2018"
    +
    ## [1] "Mon Mar 12 15:22:41 2018"
    diff --git a/docs/search_index.json b/docs/search_index.json index e7b15c6..f653a51 100644 --- a/docs/search_index.json +++ b/docs/search_index.json @@ -1,8 +1,8 @@ [ ["index.html", "Introduction to Open Data Science Chapter 1 Welcome", " Introduction to Open Data Science The Ocean Health Index Team 2018-03-12 Chapter 1 Welcome This training book will introduce you to open data science so you can work with data in an open, reproducible, and collaborative way. Open data science means that methods, data, and code are available so that others can access, reuse, and build from it without much fuss. Here you will learn a workflow with R, RStudio, Git, and GitHub, as we describe in Lowndes et al. 2017, Nature Ecology & Evolution: Our path to better science in less time using open data science tools. This is going to be fun, because learning these open data science tools and practices is empowering! This training book is written so you can use it as self-paced learning, or it can be used to teach an in-person workshop. Either way, you should do everything hands-on on your own computer as you learn. Before you begin, be sure you are all set up: see the prerequisites in Chapter 2. Suggested breakdown for a 2-day workshop: time Day 1 Day 2 9-10:30 Motivation, R & RStudio, Rmarkdown Data Wrangling: tidyr break 11-12:30 GitHub Programming lunch 13:30-15:00 Visualization: ggplot2 Collaborating with GitHub break 15:30-17:00 Data Wrangling: dplyr TBD… License "], ["overview.html", "Chapter 2 Overview 2.1 What to expect 2.2 Gapminder data 2.3 By the end of the course… 2.4 Prerequisites 2.5 Credit", " Chapter 2 Overview Welcome. In this training you will learn R, RStudio, Git, and GitHub. It’s going to be fun and empowering. You will learn a reproducible workflow that can be used in research and analyses of all kinds, including Ocean Health Index assessments. This is really powerful, cool stuff, and not just for data: I made and published this book using those four tools and workflow. We will practice learning three main things all at the same time: coding with best practices (R/RStudio), collaborative version control (Git/GitHub), and communication/publishing (RMarkdown/GitHub). This training will teach these all together to reinforce skills and best practices, and get you comfortable with a workflow that you can use in your own projects. 2.1 What to expect This is going to be a fun workshop. The plan is to expose you to a lot of great tools that you can have confidence using in your research. You’ll be working hands-on and doing the same things on your own computer as we do live on up on the screen. We’re going to go through a lot in these two days and it’s less important that you remember it all. More imporatantly, you’ll have experience with it and confidence that you can do it. The main thing to take away is that there are good ways to approach your analyses; we will teach you to expect that so you can find what you need and use it! And, you can use these materials as a reference as you go forward with your analyses. We’ll be talking about : how to THINK about data. And not just any data; tidy data. how to increase reproducibility in your science how to more easily collaborate with others–including your future self! how the #rstats community is fantastic. The tools we’re using are developed by real people. They are building great stuff and helping people of all skill-levels learn how to use it. Everyone in this workshop is coming from a different place with different experiences and expectations. But everyone will learn something new here, because there is so much innovation in the data science world. Even instructors and helpers learn something new every time, from each other and from your questions. You are all welcome here and encouraged to help each other. Are you familiar with some of this material already? Then focus on how you might teach it to others: A big part of this is not only you learning these skills, but increasing these practices in science as a whole. Here are some important themes throughout (these are joke book covers): 2.1.1 Tidy data workflow We will be learning about tidy data. Hadley Wickham has developed a ton of the tools we’ll use today. Here’s an overview of techniques to be covered in Hadley Wickham and Garrett Grolemund of RStudio’s book R for Data Science: We will be focusing on: Tidy: tidyr to organize rows of data into unique values Transform: dplyr to manipulate/wrangle data based on subsetting by rows or columns, sorting and joining Visualize: ggplot2 static plots, using grammar of graphics principles Communicate dynamic documents with R Markdown 2.2 Gapminder data One of the most important things we hope you learn from this book is how to think about data separately from your own research context. Said in another way, you’ll learn to distinguish your data questions from your research questions. Here, we are focusing on data questions, and we will use data that is not specific to your research. We learn through metaphor, and you will likely see parallels to your own data, which will ultimately help you in your research. We’ll be using the gapminder dataset, which represents the health and wealth of nations. It was pioneered by Hans Rosling, who is famous for describing the prosperity of nations over time through famines, wars and other historic events with this beautiful data visualization in his 2006 TED Talk: The best stats you’ve ever seen: Gapminder Motion Chart While these data are not specifically oriented around your research, it is a fantastically rich data set with many parallels to data you may have and wrangling you will need to do. There are there are various indicators that are tracked across multiple study sites over many years. 2.3 By the end of the course… By the end of the course, you’ll wrangle the gapminder data, and make your own graphics that you’ll publish on a webpage you’ve built with GitHub and RMarkdown. Woop! I made this training book with GitHub and RStudio’s RMarkdown, which is what we’ll be learning in the workshop. 2.4 Prerequisites Before the training, please make sure you have done the following: Have up-to-date versions of R and RStudio and have RStudio configured with Git/GitHub Download and install R: https://cloud.r-project.org Download and install RStudio: http://www.rstudio.com/download Create a GitHub account: https://github.com Note! Shorter names that kind of identify you are better, and use your work email! Get comfortable: if you’re not in a physical workshop, be set up with two screens if possible. You will be following along in RStudio on your own computer while also watching a virtual training or following this tutorial on your own. 2.5 Credit This material builds from a lot of fantastic materials developed by others in the open data science community. In particular, it pulls from the following resources, which are highly recommended for further learning and as resources later on. Specific lessons will also cite more resources. R for Data Science by Hadley Wickham and Garrett Grolemund STAT 545 by Jenny Bryan Happy Git with R by Jenny Bryan Software Carpentry by the Carpentries "], -["rstudio.html", "Chapter 3 R & RStudio, RMarkdown 3.1 Overview 3.2 Why learn R with RStudio 3.3 R at the console, RStudio goodies 3.4 R functions, help pages 3.5 Clearing the environment 3.6 RMarkdown 3.7 Troubleshooting", " Chapter 3 R & RStudio, RMarkdown 3.1 Overview Objectives In this lesson we will: get oriented to the RStudio interface work with R in the console be introduced to built-in R functions learn to use the help pages explore RMarkdown configure git on our computers Resources This lesson is a combination of excellent lessons by others (thank you Jenny Bryan and Data Carpentry!) that I have combined and modified for our workshop today. I definitely recommend reading through the original lessons and using them as reference: Dr. Jenny Bryan’s lectures from STAT545 at UBC R basics, workspace and working directory, RStudio projects Basic care and feeding of data in R RStudio has great resources about its IDE (IDE stands for integrated development environment): webinars cheatsheets 3.2 Why learn R with RStudio You are all here today to learn how to code. Coding made me a better scientist because I was able to think more clearly about analyses, and become more efficient in doing so. Data scientists are creating tools that make coding more intuitive for new coders like us, and there is a wealth of awesome instruction and resources available to learn more and get help. Here is an analogy to start us off. If you were a pilot, R is an an airplane. You can use R to go places! With practice you’ll gain skills and confidence; you can fly further distances and get through tricky situations. You will become an awesome pilot and can fly your plane anywhere. And if R were an airplane, RStudio is the airport. RStudio provides support! Runways, communication, community, and other services, and just makes your overall life easier. So it’s not just the infrastructure (the user interface or IDE), although it is a great way to learn and interact with your variables, files, and interact directly with GitHub. It’s also data science philosophy, R packages, community, and more. So although you can fly your plane without an airport and we could learn R without RStudio, that’s not what we’re going to do. We are learning R together with RStudio and its many supporting features. Something else to start us off is to mention that you are learning a new language here. It’s an ongoing process, it takes time, you’ll make mistakes, it can be frustrating, but it will be overwhelmingly awesome in the long run. We all speak at least one language; it’s a similar process, really. And no matter how fluent you are, you’ll always be learning, you’ll be trying things in new contexts, learning words that mean the same as others, etc, just like everybody else. And just like any form of communication, there will be miscommunications that can be frustrating, but hands down we are all better off because of it. While language is a familiar concept, programming languages are in a different context from spoken languages, but you will get to know this context with time. For example: you have a concept that there is a first meal of the day, and there is a name for that: in English it’s “breakfast”. So if you’re learning Spanish, you could expect there is a word for this concept of a first meal. (And you’d be right: ‘desayuno’). We will get you to expect that programming languages also have words (called functions in R) for concepts as well. You’ll soon expect that there is a way to order values numerically. Or alphabetically. Or search for patterns in text. Or calculate the median. Or reorganize columns to rows. Or subset exactly what you want. We will get you increase your expectations and learn to ask and find what you’re looking for. 3.3 R at the console, RStudio goodies Launch RStudio/R. Notice the default panes: Console (entire left) Environment/History (tabbed in upper right) Files/Plots/Packages/Help (tabbed in lower right) FYI: you can change the default location of the panes, among many other things: Customizing RStudio. An important first question: where are we? If you’ve just opened RStudio for the first time, you’ll be in your Home directory. This is noted by the ~/ at the top of the console. You can see too that the Files pane in the lower right shows what is in the Home directory where you are. You can navigate around within that Files pane and explore, but note that you won’t change where you are: even as you click through you’ll still be Home: ~/. OK let’s go into the Console, where we interact with the live R process. Make an assignment and then inspect the object you just created. x <- 3 * 4 x ## [1] 12 In my head I hear, e.g., “x gets 12”. All R statements where you create objects – “assignments” – have this form: objectName <- value. I’ll write it in the console with a hashtag #, which is the way R comments so it won’t be evaluated. ## objectName <- value ## This is also how you write notes in your code to explain what you are doing. Object names cannot start with a digit and cannot contain certain other characters such as a comma or a space. You will be wise to adopt a convention for demarcating words in names. # i_use_snake_case # other.people.use.periods # evenOthersUseCamelCase Make an assignment this_is_a_really_long_name <- 2.5 To inspect this variable, instead of typing it, we can press the up arrow key and call your command history, with the most recent commands first. Let’s do that, and then delete the assignment: this_is_a_really_long_name ## [1] 2.5 Another way to inspect this variable is to begin typing this_…and RStudio will automagically have suggested completions for you that you can select by hitting the tab key, then press return. One more: science_rocks <- 100 Let’s try to inspect: sciencerocks # Error: object 'sciencerocks' not found 3.3.1 Error messages are your friends Implicit contract with the computer / scripting language: Computer will do tedious computation for you. In return, you will be completely precise in your instructions. Typos matter. Case matters. Pay attention to how you type. Remember that this is a language, not unsimilar to English! There are times you aren’t understood – it’s going to happen. There are different ways this can happen. Sometimes you’ll get an error. This is like someone saying ‘What?’ or ‘Pardon’? Error messages can also be more useful, like when they say ‘I didn’t understand this specific part of what you said, I was expecting something else’. That is a great type of error message. Error messages are your friend. Google them (copy-and-paste!) to figure out what they mean. And also know that there are errors that can creep in more subtly, when you are giving information that is understood, but not in the way you meant. Like if I’m telling a story about tables and you’re picturing where you eat breakfast and I’m talking about data. This can leave me thinking I’ve gotten something across that the listener (or R) interpreted very differently. And as I continue telling my story you get more and more confused… So write clean code and check your work as you go to minimize these circumstances! 3.3.2 Logical operators and expressions A moment about logical operators and expressions. We can ask questions about the objects we just made. == means ‘is equal to’ != means ‘is not equal to’ < means ` is less than’ > means ` is greater than’ <= means ` is less than or equal to’ >= means ` is greater than or equal to’ science_rocks == 2 ## [1] FALSE science_rocks <= 30 ## [1] FALSE science_rocks != 5 ## [1] TRUE Shortcuts You will make lots of assignments and the operator <- is a pain to type. Don’t be lazy and use =, although it would work, because it will just sow confusion later. Instead, utilize RStudio’s keyboard shortcut: Alt + - (the minus sign). Notice that RStudio automagically surrounds <- with spaces, which demonstrates a useful code formatting practice. Code is miserable to read on a good day. Give your eyes a break and use spaces. RStudio offers many handy keyboard shortcuts. Also, Alt+Shift+K brings up a keyboard shortcut reference card. My most common shortcuts include command-Z (undo), and combinations of arrow keys in combination with shift/option/command (moving quickly up, down, sideways, with or without highlighting. When assigning a value to an object, R does not print anything. You can force R to print the value by using parentheses or by typing the object name: weight_kg <- 55 # doesn't print anything (weight_kg <- 55) # but putting parenthesis around the call prints the value of `weight_kg` ## [1] 55 weight_kg # and so does typing the name of the object ## [1] 55 Now that R has weight_kg in memory, we can do arithmetic with it. For instance, we may want to convert this weight into pounds (weight in pounds is 2.2 times the weight in kg): 2.2 * weight_kg ## [1] 121 We can also change a variable’s value by assigning it a new one: weight_kg <- 57.5 2.2 * weight_kg ## [1] 126.5 This means that assigning a value to one variable does not change the values of other variables. For example, let’s store the animal’s weight in pounds in a new variable, weight_lb: weight_lb <- 2.2 * weight_kg and then change weight_kg to 100. weight_kg <- 100 What do you think is the current content of the object weight_lb? 126.5 or 220? Why? 3.4 R functions, help pages R has a mind-blowing collection of built-in functions that are used with the same syntax: function name with parentheses around what the function needs in order to do what it was built to do. When you type a function like this, we say we are “calling the function”. function_name(argument1 = value1, argument2 = value2, ...). Let’s try using seq() which makes regular sequences of numbers and, while we’re at it, demo more helpful features of RStudio. Type se and hit TAB. A pop up shows you possible completions. Specify seq() by typing more to disambiguate or using the up/down arrows to select. Notice the floating tool-tip-type help that pops up, reminding you of a function’s arguments. If you want even more help, press F1 as directed to get the full documentation in the help tab of the lower right pane. Type the arguments 1, 10 and hit return. seq(1, 10) ## [1] 1 2 3 4 5 6 7 8 9 10 We could probably infer that the seq() function makes a sequence, but let’s learn for sure. Type (and you can autocomplete) and let’s explore the help page: ?seq help(seq) # same as ?seq The help page tells the name of the package in the top left, and broken down into sections: Description: An extended description of what the function does. Usage: The arguments of the function and their default values. Arguments: An explanation of the data each argument is expecting. Details: Any important details to be aware of. Value: The data the function returns. See Also: Any related functions you might find useful. Examples: Some examples for how to use the function. seq(from = 1, to = 10) # same as seq(1, 10); R assumes by position ## [1] 1 2 3 4 5 6 7 8 9 10 seq(from = 1, to = 10, by = 2) ## [1] 1 3 5 7 9 The above also demonstrates something about how R resolves function arguments. You can always specify in name = value form. But if you do not, R attempts to resolve by position. So above, it is assumed that we want a sequence from = 1 that goes to = 10. Since we didn’t specify step size, the default value of by in the function definition is used, which ends up being 1 in this case. For functions I call often, I might use this resolve by position for the first argument or maybe the first two. After that, I always use name = value. The examples from the help pages can be copy-pasted into the console for you to understand what’s going on. Remember we were talking about expecting there to be a function for something you want to do? Let’s try it. 3.4.1 Your turn Exercise: Talk to your neighbor(s) and look up the help file for a function that you know or expect to exist. Here are some ideas: ?getwd(), ?plot(), min(), max(), ?mean(), ?log()). And there’s also help for when you only sort of remember the function name: double-questionmark: ??install Not all functions have (or require) arguments: date() ## [1] "Mon Mar 12 12:07:30 2018" 3.5 Clearing the environment Now look at the objects in your environment (workspace) – in the upper right pane. The workspace is where user-defined objects accumulate. You can also get a listing of these objects with a few different R commands: objects() ## [1] "science_rocks" "this_is_a_really_long_name" ## [3] "weight_kg" "weight_lb" ## [5] "x" ls() ## [1] "science_rocks" "this_is_a_really_long_name" ## [3] "weight_kg" "weight_lb" ## [5] "x" If you want to remove the object named weight_kg, you can do this: rm(weight_kg) To remove everything: rm(list = ls()) or click the broom in RStudio’s Environment pane. 3.5.1 Your turn Exercise: Clear your workspace, then create a few new variables. Create a variable that is the mean of a sequence of 1-20. What’s a good name for your variable? Does it matter what your ‘by’ argument is? Why? 3.6 RMarkdown Now we are going to also introduce RMarkdown. This is really key for collaborative research, so we’re going to get started with it early and then use it for the rest of the day. An RMarkdown file will allow us to weave markdown text with chunks of R code to be evaluated and output content like tables and plots. File -> New File -> RMarkdown… -> Document of output format HTML, OK. You can give it a Title like “My Project”. Then click OK. OK, first off: by opening a file, we are seeing the 4th pane of the RStudio console, which is essentially a text editor. This lets us organize our files within RStudio instead of having a bunch of different windows open. Let’s have a look at this file — it’s not blank; there is some initial text is already provided for you. Notice a few things about it: There are white and grey sections. R code is in grey sections, and other text is in white. Let’s go ahead and “Knit HTML” by clicking the blue yarn at the top of the RMarkdown file. What do you notice between the two? Notice how the grey R code chunks are surrounded by 3 backticks and {r LABEL}. These are evaluated and return the output text in the case of summary(cars) and the output plot in the case of plot(pressure). Notice how the code plot(pressure) is not shown in the HTML output because of the R code chunk option echo=FALSE. More details… This RMarkdown file has 2 different languages within it: R and Markdown. We don’t know that much R yet, but you can see that we are taking a summary of some data called ‘cars’, and then plotting. There’s a lot more to learn about R, and we’ll get into it for the next few days. The second language is Markdown. This is a formatting language for plain text, and there are only about 15 rules to know. Notice the syntax for: headers get rendered at multiple levels: #, ## bold: **word** There are some good cheatsheets to get you started, and here is one built into RStudio: Go to Help > Markdown Quick Reference Important: note that the hashtag # is used differently in Markdown and in R: in R, a hashtag indicates a comment that will not be evaluated. You can use as many as you want: # is equivalent to ######. It’s just a matter of style. I use two ## to indicate a comment so that it’s clearer what is a comment versus what I don’t want to run at the moment. in Markdown, a hashtag indicates a level of a header. And the number you use matters: # is a “level one header”, meaning the biggest font and the top of the hierarchy. ### is a level three header, and will show up nested below the # and ## headers. Learn more: http://rmarkdown.rstudio.com/ 3.6.1 Your Turn In Markdown, Write some italic text, and make a numbered list. And add a few subheaders. Use the Markdown Quick Reference (in the menu bar: Help > Markdown Quick Reference). Reknit your html file. 3.7 Troubleshooting Here are some additional things we didn’t have time to discuss: 3.7.1 I just entered a command and nothing’s happening It may be because you didn’t complete a command: is there a little + in your console? R is saying that it is waiting for you to finish. In the example below, I need to close that parenthesis. > x <- seq(1, 10 + 3.7.2 How do I update RStudio? To see if you have the most current version of RStudio, go to the Help bar > Check for Updates. If there is an update available, you’ll have the option to Quit and Download, which will take you to http://www.rstudio.com/download. When you download and install, choose to replace the previous version. "], -["github.html", "Chapter 4 GitHub 4.1 Overview 4.2 Why should scientists use Github? 4.3 Setup Git & GitHub 4.4 Create a repository on Github.com 4.5 Clone your repository using RStudio 4.6 Inspect your repository 4.7 Add files to our local repo 4.8 Sync from RStudio to GitHub 4.9 Explore remote Github 4.10 Create a new R Markdown file 4.11 Committing - how often? Tracking changes in your files 4.12 Happy Git with R", " Chapter 4 GitHub 4.1 Overview We will learn about version control using git and GitHub, and we will interface with this through RStudio. Why use version control? To save time when working with your most important collaborator: you. git will track and version your files, GitHub stores this online and enables you to collaborate with others (and yourself). Although git and GitHub are two different things, distinct from each other, I think of them as a bundle since I always use them together. It also helped me to think of GitHub like Dropbox: you make folders that are ‘tracked’ and can be synced to the cloud. GitHub does this too, but you have to be more deliberate about when syncs are made. This is because GitHub saves these as different versions, with information about who contributed when, line-by-line. This makes collaboration easier, and it allows you to roll-back to different versions or contribute to others’ work. 4.1.1 Objectives Today, we’ll interface with GitHub from our local computers using RStudio. There are many other ways to interact with GitHub, including GitHub’s Desktop App or the command line (here is Jenny Bryan’s list of git clients), but today we are going to work from RStudio. You have the largest suite of options if you interface through the command line, but the most common things you’ll do can be done through one of these other applications (i.e. RStudio and the GitHub Desktop App). Here’s what we’ll do after we set up git on your computers: create a repository on Github.com clone locally using RStudio learn the RStudio-GitHub workflow by syncing to Github.com: pull, stage, commit, push explore github.com: files, commit history, file history practice the RStudio-GitHub workflow by editing and adding files practice R Markdown 4.1.2 Resources These materials borrow from: Jenny Bryan’s lectures from STAT545 at UBC: The Shell Jenny Bryan’s Happy git with R tutorial Melanie Frazier’s GitHub Quickstart Ben Best’s Software Carpentry at UCSB Today, we’ll only introduce the features and terminology that scientists need to learn to begin managing their projects. 4.2 Why should scientists use Github? Ends (or, nearly ends) the horror of keeping track of versions. Basically, we get away from this: When you open your repository, you only see the most recent version. But, it easy to compare versions, and you can easily revert to previous versions. Improves collaborative efforts. Different researchers can work on the same files at the same time! It is easy to share and distribute files through the Github website. Your files are available anywhere, you just need internet connection! 4.2.1 What are Git and Github? Git is a version control system that lets you track changes to files over time. These files can be any kind of file (eg .doc, .pdf, .xls), but free text differences are most easily visible (eg txt, csv, md). Github is a website for storing your git versioned files remotely. It has many nice features to be able visualize differences between images, rendering & diffing map data files, render text data files, and track changes in text. If you are a student you can get the micro account which includes 5 private repositories for free (normally a $7/month value). You can sign up for the student account here. Instructors can also request a free organization account, “Request a discount”. Github was developed for social coding (i.e., sort of like an open source Wikipedia for programmers). Consequently, much of the functionality and terminology of Github (e.g., branches and pull requests) isn’t necessary for a scientist getting started. These concepts are more important for coders who want the entire coding community (and not just people working on the same project) to be able to suggest changes to their code. This isn’t how most scientists will use Github. To get the full functionality of Github, you will eventually want to learn other concepts. But, this can wait. 4.2.2 Some Github terminology User: A Github account for you (e.g., jules32). Organization: The Github account for one or more user (e.g., datacarpentry). Repository: A folder within the organization that includes files dedicated to a project. Local Github: Copies of Github files located your computer. Remote Github: Github files located on the https://github.com website. Clone: Process of making a local copy of a remote Github repository. This only needs to be done once (unless you mess up your local copy). Pull: Copy changes on the remote Github repository to your local Github repository. This is useful if multiple people are making changes to a repository. Push: Save local changes to remote Github 4.3 Setup Git & GitHub We’re going to switch gears from R for a moment and set up Git and GitHub, which we will be using along with R and RStudio for the rest of the workshop. This set up is a one-time thing! You will only have to do this once per computer. We’ll walk through this together. Create Github account at http://github.com, if you don’t already have one. For username, I recommend all lower-case letters, short as you can. I recommend using your .edu email, since you can request free private repositories via GitHub Education discount. Configure git with global commands, which means it will apply ‘globally’ to all files on your computer, rather than to a specific folder. Open the Git Bash program (Windows) or the Terminal (Mac) and type the following: # display your version of git git --version # replace USER with your Github user account git config –-global user.name USER # replace NAME@EMAIL.EDU with the email you used to register with Github git config –-global user.email NAME@EMAIL.EDU # list your config to confirm user.* variables set git config --list Not only have you just set up git as a one-time-only thing, you have just used the command line. We don’t have time to learn much of the command line today, but you just successfully used it following explicit instructions, which is huge! There are great resources for learning the command line, check out this tutorial from SWC at UCSB. 4.3.1 Troubleshooting If you have problems setting up git, please see the Troubleshooting section in Jenny Bryan’s amazing HappyGitWithR. 4.3.1.1 New(ish) Error on a Mac We’ve also seen the following errors from RStudio: error key does not contain a section --global terminal and fatal: not in a git directory To solve this, go to the Terminal and type: which git Look at the filepath that is returned. Does it say anything to do with Apple? -> If yes, then the Git you downloaded isn’t installed, please redownload if necessary, and follow instructions to install. -> If no, (in the example image, the filepath does not say anything with Apple) then proceed below: In RStudio, navigate to: Tools > Global Options > Git/SVN. Does the “Git executable” filepath match what the url in Terminal says? If not, click the browse button and navigate there. Note: on my laptop, even though I navigated to /usr/local/bin/git, it then automatically redirect because /usr/local/bin/git was an alias on my computer. That is fine. Click OK. Quit RStudio. Then relaunch RStudio. Try syncing or cloning, and if that works and then you don’t need to worry about typing into the Terminal, you’re all done! 4.4 Create a repository on Github.com First, go to your account on github.com and click “New repository”. Choose a name.Call it whatever you want (the shorter the better), or follow me for convenience. I will call mine my-repo. Also, add a description, make it public, create a README file, and create your repo! The Add gitignore option adds a document where you can identify files or file-types you want Github to ignore. These files will stay in on the local Github folder (the one on your computer), but will not be uploaded onto the web version of Github. The Add a license option adds a license that describes how other people can use your Github files (e.g., open source, but no one can profit from them, etc.). We won’t worry about this today. Check out our new repository! Notice how the README.md file we created is automatically displayed at the bottom. From here, you will work locally (on your computer). 4.5 Clone your repository using RStudio We’ll start of by cloning to our local computer using RStudio. We are going to be cloning a copy of our Remote repository on Github.com to our local computers. Unlike downloading, cloning keeps all the version control and user information bundled with the files. Step 0: Create your github folder This is really important! We need to be organized and deliberate about where we want to keep all of our GitHub repositories (since this is the first of many in your career). Let’s all make a folder called github (all lowercase!) in our home directories. So it will look like this: Windows: Users\\[User]\\Documents\\github\\ Mac: Users/[User]/github/ This will let us take advantage of something that is really key about GitHub.com: you can easily navigate through folders within repositories and the urls reflect this navigation. The greatness of this will be evident soon. So let’s set ourselves up for easily translating (and remembering) those navigation paths by having a folder called github that will serve as our ‘github.com’. So really. Make sure that you have an all-lowercase folder called github in your home directory!! Step 1: Copy the web address of the repository you want to clone. Step 2: from RStudio, go to New Project (also in the File menu). Step 3: Select Version Control Step 4: Select Git Step 5: Paste it in the Repository URL field, and type tab to autofill the Project Directory name. Make sure you keep the Project Directory Name THE SAME as the repository name from the URL. Save it in your github folder (click on Browse) to do this. If everything went well, the repository will be added to the list located here: And the repository will be saved to the Github folder on your computer: Ta da!!!! The folder doesn’t contain much of interest, but we are going to change that. 4.6 Inspect your repository Notice a few things in our repo here: Our working directory is set to ~/github/my-repo. This means that I can start working with the files I have in here without setting the filepath. This is that when we cloned this from RStudio, it created an RStudio project, which you can tell because: .RProj file, which you can see in the Files pane. The project is named in the top right hand corner We have a git tab! This is how we will interface directly to Github.com When you first clone a repo through RStudio, RStudio will add an .Rproj file to your repo. And if you didn’t add a .gitignore file when you originally created the repo on GitHub.com, RStudio will also add this for you. These will show up with little yellow ? icons in your git tab. This is GitHub’s way of saying: “I am responsible for tracking everything that happens in this repo, but I haven’t seen these files yet. Do you want me to track them too?” (We’ll see that when you click the box to stage them, they will turn into As because they have been added to the repo. 4.7 Add files to our local repo The repository will contain: .gitignore file README.md Rproj And, I typically create the following: folders for “data” and “figures” R scripts etc. I’m going to go to the Finder (Windows Explorer on a PC) and copy a file into my repository from there. And then I’m going to go back to RStudio – it shows up in the git tab! So the repository is being tracked, no matter how you make changes to it (changes do not have to be done only through RStudio). To make changes to the repository, you will work from your computer (“local Github”). When files are changed in the local repository, these changes will be reflected in the Git tab of RStudio: 4.7.1 Inspect what has changed These are the codes RStudio uses to describe how the files are changed, (from the RStudio cheatsheet): 4.8 Sync from RStudio to GitHub When you are ready to commit your changes, you follow these steps: We walk through this process below: 4.8.1 Pull From the Git tab, “Pull” the repository. This makes sure your local repository is synced with the remote repository. This is very important if other people are making changes to the repository or if you are working from multiple computers. 4.8.2 Stage Stage the files you want to commit. In RStudio, this involves checking the “Staged” boxes: 4.8.3 Commit 4.8.4 Push 4.9 Explore remote Github The files you added should be on github.com: Let’s also explore commit history, file history. 4.9.1 Your turn! This time let’s edit an existing file instead of adding something new. Open your README file by clicking on it in the Files pane (lower right corner). Write a few lines of text, save, and see what happens in your Git Tab. Sync it to your remote repository (Github.com). Also, go to your Finder/Windows Explorer, and copy-paste something into your local GitHub repo. Then go back to RStudio and confirm that git tracked it. Remember, git will track anything within that folder (the way Dropbox does), it’s not specific to RStudio! 4.10 Create a new R Markdown file OK, now, let’s go back to RStudio, and get ourselves back into learning R. We are going to use R Markdown so that you can write notes to yourself in Markdown, and have a record of all your R code. Writing R commands in the console like we did this morning is great, but limited; it’s hard to keep track of and hard to efficiently share with others. Plus, as your analyses get more complicated, you need to be able to see them all in one place. Go to File > New File > R Markdown … (or click the green plus in the top left corner). Let’s set up this file so we can use it for the rest of the day. I’m going to delete all the text that is already there and write some new text. Here’s what I’m going to write in my R Markdown file to begin: --- title: "My Project" author: "Julie" date: "11/21/2017" output: html_document --- # Data wrangling with dplyr We are going use "gapminder" data to learn `dplyr`. It's going to be amazing. Now, let’s save it. I’m going to call my file wrangle-dplyr.Rmd. OK. Now let’s practice with some of those commands that we were working on this morning. Create a new chunk in your RMarkdown first in one of these ways: click “Insert > R” at the top of the editor pane type by hand ```{r} ``` if you haven’t deleted a chunk that came with the new file, edit that one Now, let’s write some R code. x <- seq(1:15) Now, hitting return does not execute this command; remember, it’s just a text file. To execute it, we need to get what we typed in the the R chunk (the grey R code) down into the console. How do we do it? There are several ways (let’s do each of them): copy-paste this line into the console. select the line (or simply put the cursor there), and click ‘Run’. This is available from the bar above the file (green arrow) the menu bar: Code > Run Selected Line(s) keyboard shortcut: command-return click the green arrow at the right of the code chunk 4.10.1 Your turn Add a few more commands to your file from this morning. Execute them by trying the three ways above. Then, sync your file to GitHub. What if a file doesn’t show up in the Git tab and you expect that it should? Check to make sure you’ve saved the file. If the filename is red with an asterix, there have been changes since it was saved. Remember to save before syncing to GitHub! 4.11 Committing - how often? Tracking changes in your files Whenever you make changes to the files in Github, you will walk through the Pull -> Stage -> Commit -> Push steps. I tend to do this every time I finish a task (basically when I start getting nervous that I will lose my work). Once something is committed, it is very difficult to lose it. One thing that I love about about Github is that it is easy to see how files have changed over time. Usually I compare commits through github.com: You can click on the commits to see how the files changed from the previous commit: 4.12 Happy Git with R If you have problems, we’ll help you out using Jenny Bryan’s HappyGitWithR, particularly the sections on Detect Git from RStudio and RStudio, Git, GitHub Hell (troubleshooting). So as we are coming around, have a look at it and see if you can help troubleshoot too! "], +["rstudio.html", "Chapter 3 R & RStudio, RMarkdown 3.1 Overview 3.2 Why learn R with RStudio 3.3 R at the console, RStudio goodies 3.4 R functions, help pages 3.5 Clearing the environment 3.6 RMarkdown 3.7 Troubleshooting", " Chapter 3 R & RStudio, RMarkdown 3.1 Overview Objectives In this lesson we will: get oriented to the RStudio interface work with R in the console be introduced to built-in R functions learn to use the help pages explore RMarkdown configure git on our computers Resources This lesson is a combination of excellent lessons by others (thank you Jenny Bryan and Data Carpentry!) that I have combined and modified for our workshop today. I definitely recommend reading through the original lessons and using them as reference: Dr. Jenny Bryan’s lectures from STAT545 at UBC R basics, workspace and working directory, RStudio projects Basic care and feeding of data in R RStudio has great resources about its IDE (IDE stands for integrated development environment): webinars cheatsheets 3.2 Why learn R with RStudio You are all here today to learn how to code. Coding made me a better scientist because I was able to think more clearly about analyses, and become more efficient in doing so. Data scientists are creating tools that make coding more intuitive for new coders like us, and there is a wealth of awesome instruction and resources available to learn more and get help. Here is an analogy to start us off. If you were a pilot, R is an an airplane. You can use R to go places! With practice you’ll gain skills and confidence; you can fly further distances and get through tricky situations. You will become an awesome pilot and can fly your plane anywhere. And if R were an airplane, RStudio is the airport. RStudio provides support! Runways, communication, community, and other services, and just makes your overall life easier. So it’s not just the infrastructure (the user interface or IDE), although it is a great way to learn and interact with your variables, files, and interact directly with GitHub. It’s also data science philosophy, R packages, community, and more. So although you can fly your plane without an airport and we could learn R without RStudio, that’s not what we’re going to do. We are learning R together with RStudio and its many supporting features. Something else to start us off is to mention that you are learning a new language here. It’s an ongoing process, it takes time, you’ll make mistakes, it can be frustrating, but it will be overwhelmingly awesome in the long run. We all speak at least one language; it’s a similar process, really. And no matter how fluent you are, you’ll always be learning, you’ll be trying things in new contexts, learning words that mean the same as others, etc, just like everybody else. And just like any form of communication, there will be miscommunications that can be frustrating, but hands down we are all better off because of it. While language is a familiar concept, programming languages are in a different context from spoken languages, but you will get to know this context with time. For example: you have a concept that there is a first meal of the day, and there is a name for that: in English it’s “breakfast”. So if you’re learning Spanish, you could expect there is a word for this concept of a first meal. (And you’d be right: ‘desayuno’). We will get you to expect that programming languages also have words (called functions in R) for concepts as well. You’ll soon expect that there is a way to order values numerically. Or alphabetically. Or search for patterns in text. Or calculate the median. Or reorganize columns to rows. Or subset exactly what you want. We will get you increase your expectations and learn to ask and find what you’re looking for. 3.3 R at the console, RStudio goodies Launch RStudio/R. Notice the default panes: Console (entire left) Environment/History (tabbed in upper right) Files/Plots/Packages/Help (tabbed in lower right) FYI: you can change the default location of the panes, among many other things: Customizing RStudio. An important first question: where are we? If you’ve just opened RStudio for the first time, you’ll be in your Home directory. This is noted by the ~/ at the top of the console. You can see too that the Files pane in the lower right shows what is in the Home directory where you are. You can navigate around within that Files pane and explore, but note that you won’t change where you are: even as you click through you’ll still be Home: ~/. OK let’s go into the Console, where we interact with the live R process. Make an assignment and then inspect the object you just created. x <- 3 * 4 x ## [1] 12 In my head I hear, e.g., “x gets 12”. All R statements where you create objects – “assignments” – have this form: objectName <- value. I’ll write it in the console with a hashtag #, which is the way R comments so it won’t be evaluated. ## objectName <- value ## This is also how you write notes in your code to explain what you are doing. Object names cannot start with a digit and cannot contain certain other characters such as a comma or a space. You will be wise to adopt a convention for demarcating words in names. # i_use_snake_case # other.people.use.periods # evenOthersUseCamelCase Make an assignment this_is_a_really_long_name <- 2.5 To inspect this variable, instead of typing it, we can press the up arrow key and call your command history, with the most recent commands first. Let’s do that, and then delete the assignment: this_is_a_really_long_name ## [1] 2.5 Another way to inspect this variable is to begin typing this_…and RStudio will automagically have suggested completions for you that you can select by hitting the tab key, then press return. One more: science_rocks <- 100 Let’s try to inspect: sciencerocks # Error: object 'sciencerocks' not found 3.3.1 Error messages are your friends Implicit contract with the computer / scripting language: Computer will do tedious computation for you. In return, you will be completely precise in your instructions. Typos matter. Case matters. Pay attention to how you type. Remember that this is a language, not unsimilar to English! There are times you aren’t understood – it’s going to happen. There are different ways this can happen. Sometimes you’ll get an error. This is like someone saying ‘What?’ or ‘Pardon’? Error messages can also be more useful, like when they say ‘I didn’t understand this specific part of what you said, I was expecting something else’. That is a great type of error message. Error messages are your friend. Google them (copy-and-paste!) to figure out what they mean. And also know that there are errors that can creep in more subtly, when you are giving information that is understood, but not in the way you meant. Like if I’m telling a story about tables and you’re picturing where you eat breakfast and I’m talking about data. This can leave me thinking I’ve gotten something across that the listener (or R) interpreted very differently. And as I continue telling my story you get more and more confused… So write clean code and check your work as you go to minimize these circumstances! 3.3.2 Logical operators and expressions A moment about logical operators and expressions. We can ask questions about the objects we just made. == means ‘is equal to’ != means ‘is not equal to’ < means ` is less than’ > means ` is greater than’ <= means ` is less than or equal to’ >= means ` is greater than or equal to’ science_rocks == 2 ## [1] FALSE science_rocks <= 30 ## [1] FALSE science_rocks != 5 ## [1] TRUE Shortcuts You will make lots of assignments and the operator <- is a pain to type. Don’t be lazy and use =, although it would work, because it will just sow confusion later. Instead, utilize RStudio’s keyboard shortcut: Alt + - (the minus sign). Notice that RStudio automagically surrounds <- with spaces, which demonstrates a useful code formatting practice. Code is miserable to read on a good day. Give your eyes a break and use spaces. RStudio offers many handy keyboard shortcuts. Also, Alt+Shift+K brings up a keyboard shortcut reference card. My most common shortcuts include command-Z (undo), and combinations of arrow keys in combination with shift/option/command (moving quickly up, down, sideways, with or without highlighting. When assigning a value to an object, R does not print anything. You can force R to print the value by using parentheses or by typing the object name: weight_kg <- 55 # doesn't print anything (weight_kg <- 55) # but putting parenthesis around the call prints the value of `weight_kg` ## [1] 55 weight_kg # and so does typing the name of the object ## [1] 55 Now that R has weight_kg in memory, we can do arithmetic with it. For instance, we may want to convert this weight into pounds (weight in pounds is 2.2 times the weight in kg): 2.2 * weight_kg ## [1] 121 We can also change a variable’s value by assigning it a new one: weight_kg <- 57.5 2.2 * weight_kg ## [1] 126.5 This means that assigning a value to one variable does not change the values of other variables. For example, let’s store the animal’s weight in pounds in a new variable, weight_lb: weight_lb <- 2.2 * weight_kg and then change weight_kg to 100. weight_kg <- 100 What do you think is the current content of the object weight_lb? 126.5 or 220? Why? 3.4 R functions, help pages R has a mind-blowing collection of built-in functions that are used with the same syntax: function name with parentheses around what the function needs in order to do what it was built to do. When you type a function like this, we say we are “calling the function”. function_name(argument1 = value1, argument2 = value2, ...). Let’s try using seq() which makes regular sequences of numbers and, while we’re at it, demo more helpful features of RStudio. Type se and hit TAB. A pop up shows you possible completions. Specify seq() by typing more to disambiguate or using the up/down arrows to select. Notice the floating tool-tip-type help that pops up, reminding you of a function’s arguments. If you want even more help, press F1 as directed to get the full documentation in the help tab of the lower right pane. Type the arguments 1, 10 and hit return. seq(1, 10) ## [1] 1 2 3 4 5 6 7 8 9 10 We could probably infer that the seq() function makes a sequence, but let’s learn for sure. Type (and you can autocomplete) and let’s explore the help page: ?seq help(seq) # same as ?seq The help page tells the name of the package in the top left, and broken down into sections: Description: An extended description of what the function does. Usage: The arguments of the function and their default values. Arguments: An explanation of the data each argument is expecting. Details: Any important details to be aware of. Value: The data the function returns. See Also: Any related functions you might find useful. Examples: Some examples for how to use the function. seq(from = 1, to = 10) # same as seq(1, 10); R assumes by position ## [1] 1 2 3 4 5 6 7 8 9 10 seq(from = 1, to = 10, by = 2) ## [1] 1 3 5 7 9 The above also demonstrates something about how R resolves function arguments. You can always specify in name = value form. But if you do not, R attempts to resolve by position. So above, it is assumed that we want a sequence from = 1 that goes to = 10. Since we didn’t specify step size, the default value of by in the function definition is used, which ends up being 1 in this case. For functions I call often, I might use this resolve by position for the first argument or maybe the first two. After that, I always use name = value. The examples from the help pages can be copy-pasted into the console for you to understand what’s going on. Remember we were talking about expecting there to be a function for something you want to do? Let’s try it. 3.4.1 Your turn Exercise: Talk to your neighbor(s) and look up the help file for a function that you know or expect to exist. Here are some ideas: ?getwd(), ?plot(), min(), max(), ?mean(), ?log()). And there’s also help for when you only sort of remember the function name: double-questionmark: ??install Not all functions have (or require) arguments: date() ## [1] "Mon Mar 12 15:22:41 2018" 3.5 Clearing the environment Now look at the objects in your environment (workspace) – in the upper right pane. The workspace is where user-defined objects accumulate. You can also get a listing of these objects with a few different R commands: objects() ## [1] "science_rocks" "this_is_a_really_long_name" ## [3] "weight_kg" "weight_lb" ## [5] "x" ls() ## [1] "science_rocks" "this_is_a_really_long_name" ## [3] "weight_kg" "weight_lb" ## [5] "x" If you want to remove the object named weight_kg, you can do this: rm(weight_kg) To remove everything: rm(list = ls()) or click the broom in RStudio’s Environment pane. 3.5.1 Your turn Exercise: Clear your workspace, then create a few new variables. Create a variable that is the mean of a sequence of 1-20. What’s a good name for your variable? Does it matter what your ‘by’ argument is? Why? 3.6 RMarkdown Now we are going to also introduce RMarkdown. This is really key for collaborative research, so we’re going to get started with it early and then use it for the rest of the day. An RMarkdown file will allow us to weave markdown text with chunks of R code to be evaluated and output content like tables and plots. File -> New File -> RMarkdown… -> Document of output format HTML, OK. You can give it a Title like “My Project”. Then click OK. OK, first off: by opening a file, we are seeing the 4th pane of the RStudio console, which is essentially a text editor. This lets us organize our files within RStudio instead of having a bunch of different windows open. Let’s have a look at this file — it’s not blank; there is some initial text is already provided for you. Notice a few things about it: There are white and grey sections. R code is in grey sections, and other text is in white. Let’s go ahead and “Knit HTML” by clicking the blue yarn at the top of the RMarkdown file. What do you notice between the two? Notice how the grey R code chunks are surrounded by 3 backticks and {r LABEL}. These are evaluated and return the output text in the case of summary(cars) and the output plot in the case of plot(pressure). Notice how the code plot(pressure) is not shown in the HTML output because of the R code chunk option echo=FALSE. More details… This RMarkdown file has 2 different languages within it: R and Markdown. We don’t know that much R yet, but you can see that we are taking a summary of some data called ‘cars’, and then plotting. There’s a lot more to learn about R, and we’ll get into it for the next few days. The second language is Markdown. This is a formatting language for plain text, and there are only about 15 rules to know. Notice the syntax for: headers get rendered at multiple levels: #, ## bold: **word** There are some good cheatsheets to get you started, and here is one built into RStudio: Go to Help > Markdown Quick Reference Important: note that the hashtag # is used differently in Markdown and in R: in R, a hashtag indicates a comment that will not be evaluated. You can use as many as you want: # is equivalent to ######. It’s just a matter of style. I use two ## to indicate a comment so that it’s clearer what is a comment versus what I don’t want to run at the moment. in Markdown, a hashtag indicates a level of a header. And the number you use matters: # is a “level one header”, meaning the biggest font and the top of the hierarchy. ### is a level three header, and will show up nested below the # and ## headers. Learn more: http://rmarkdown.rstudio.com/ 3.6.1 Your Turn In Markdown, Write some italic text, and make a numbered list. And add a few subheaders. Use the Markdown Quick Reference (in the menu bar: Help > Markdown Quick Reference). Reknit your html file. 3.7 Troubleshooting Here are some additional things we didn’t have time to discuss: 3.7.1 I just entered a command and nothing’s happening It may be because you didn’t complete a command: is there a little + in your console? R is saying that it is waiting for you to finish. In the example below, I need to close that parenthesis. > x <- seq(1, 10 + 3.7.2 How do I update RStudio? To see if you have the most current version of RStudio, go to the Help bar > Check for Updates. If there is an update available, you’ll have the option to Quit and Download, which will take you to http://www.rstudio.com/download. When you download and install, choose to replace the previous version. "], +["github.html", "Chapter 4 GitHub 4.1 Overview 4.2 Why should scientists use Github? 4.3 Setup Git & GitHub 4.4 Create a repository on Github.com 4.5 Clone your repository using RStudio 4.6 Inspect your repository 4.7 Add files to our local repo 4.8 Sync from RStudio to GitHub 4.9 Explore remote Github 4.10 Create a new R Markdown file 4.11 Committing - how often? Tracking changes in your files 4.12 Happy Git with R", " Chapter 4 GitHub 4.1 Overview We will learn about version control using git and GitHub, and we will interface with this through RStudio. Why use version control? To save time when working with your most important collaborator: you. git will track and version your files, GitHub stores this online and enables you to collaborate with others (and yourself). Although git and GitHub are two different things, distinct from each other, I think of them as a bundle since I always use them together. It also helped me to think of GitHub like Dropbox: you make folders that are ‘tracked’ and can be synced to the cloud. GitHub does this too, but you have to be more deliberate about when syncs are made. This is because GitHub saves these as different versions, with information about who contributed when, line-by-line. This makes collaboration easier, and it allows you to roll-back to different versions or contribute to others’ work. 4.1.1 Objectives Today, we’ll interface with GitHub from our local computers using RStudio. There are many other ways to interact with GitHub, including GitHub’s Desktop App or the command line (here is Jenny Bryan’s list of git clients), but today we are going to work from RStudio. You have the largest suite of options if you interface through the command line, but the most common things you’ll do can be done through one of these other applications (i.e. RStudio and the GitHub Desktop App). Here’s what we’ll do after we set up git on your computers: create a repository on Github.com clone locally using RStudio learn the RStudio-GitHub workflow by syncing to Github.com: pull, stage, commit, push explore github.com: files, commit history, file history practice the RStudio-GitHub workflow by editing and adding files practice R Markdown 4.1.2 Resources These materials borrow from: Jenny Bryan’s lectures from STAT545 at UBC: The Shell Jenny Bryan’s Happy git with R tutorial Melanie Frazier’s GitHub Quickstart Ben Best’s Software Carpentry at UCSB Today, we’ll only introduce the features and terminology that scientists need to learn to begin managing their projects. 4.2 Why should scientists use Github? Ends (or, nearly ends) the horror of keeping track of versions. Basically, we get away from this: When you open your repository, you only see the most recent version. But, it easy to compare versions, and you can easily revert to previous versions. Improves collaborative efforts. Different researchers can work on the same files at the same time! It is easy to share and distribute files through the Github website. Your files are available anywhere, you just need internet connection! 4.2.1 What are Git and Github? Git is a version control system that lets you track changes to files over time. These files can be any kind of file (eg .doc, .pdf, .xls), but free text differences are most easily visible (eg txt, csv, md). Github is a website for storing your git versioned files remotely. It has many nice features to be able visualize differences between images, rendering & diffing map data files, render text data files, and track changes in text. If you are a student you can get the micro account which includes 5 private repositories for free (normally a $7/month value). You can sign up for the student account here. Instructors can also request a free organization account, “Request a discount”. Github was developed for social coding (i.e., sort of like an open source Wikipedia for programmers). Consequently, much of the functionality and terminology of Github (e.g., branches and pull requests) isn’t necessary for a scientist getting started. These concepts are more important for coders who want the entire coding community (and not just people working on the same project) to be able to suggest changes to their code. This isn’t how most scientists will use Github. To get the full functionality of Github, you will eventually want to learn other concepts. But, this can wait. 4.2.2 Some Github terminology User: A Github account for you (e.g., jules32). Organization: The Github account for one or more user (e.g., datacarpentry). Repository: A folder within the organization that includes files dedicated to a project. Local Github: Copies of Github files located your computer. Remote Github: Github files located on the https://github.com website. Clone: Process of making a local copy of a remote Github repository. This only needs to be done once (unless you mess up your local copy). Pull: Copy changes on the remote Github repository to your local Github repository. This is useful if multiple people are making changes to a repository. Push: Save local changes to remote Github 4.3 Setup Git & GitHub We’re going to switch gears from R for a moment and set up Git and GitHub, which we will be using along with R and RStudio for the rest of the workshop. This set up is a one-time thing! You will only have to do this once per computer. We’ll walk through this together. Create Github account at http://github.com, if you don’t already have one. For username, I recommend all lower-case letters, short as you can. I recommend using your .edu email, since you can request free private repositories via GitHub Education discount. Configure git with global commands, which means it will apply ‘globally’ to all files on your computer, rather than to a specific folder. Open the Git Bash program (Windows) or the Terminal (Mac) and type the following: # display your version of git git --version # replace USER with your Github user account git config –-global user.name USER # replace NAME@EMAIL.EDU with the email you used to register with Github git config –-global user.email NAME@EMAIL.EDU # list your config to confirm user.* variables set git config --list Not only have you just set up git as a one-time-only thing, you have just used the command line. We don’t have time to learn much of the command line today, but you just successfully used it following explicit instructions, which is huge! There are great resources for learning the command line, check out this tutorial from SWC at UCSB. 4.3.1 Troubleshooting If you have problems setting up git, please see the Troubleshooting section in Jenny Bryan’s amazing HappyGitWithR. 4.3.1.1 New(ish) Error on a Mac We’ve also seen the following errors from RStudio: error key does not contain a section --global terminal and fatal: not in a git directory To solve this, go to the Terminal and type: which git Look at the filepath that is returned. Does it say anything to do with Apple? -> If yes, then the Git you downloaded isn’t installed, please redownload if necessary, and follow instructions to install. -> If no, (in the example image, the filepath does not say anything with Apple) then proceed below: In RStudio, navigate to: Tools > Global Options > Git/SVN. Does the “Git executable” filepath match what the url in Terminal says? If not, click the browse button and navigate there. Note: on my laptop, even though I navigated to /usr/local/bin/git, it then automatically redirect because /usr/local/bin/git was an alias on my computer. That is fine. Click OK. Quit RStudio. Then relaunch RStudio. Try syncing or cloning, and if that works and then you don’t need to worry about typing into the Terminal, you’re all done! 4.4 Create a repository on Github.com First, go to your account on github.com and click “New repository”. Choose a name.Call it whatever you want (the shorter the better), or follow me for convenience. I will call mine my-repo. Also, add a description, make it public, create a README file, and create your repo! The Add gitignore option adds a document where you can identify files or file-types you want Github to ignore. These files will stay in on the local Github folder (the one on your computer), but will not be uploaded onto the web version of Github. The Add a license option adds a license that describes how other people can use your Github files (e.g., open source, but no one can profit from them, etc.). We won’t worry about this today. Check out our new repository! Notice how the README.md file we created is automatically displayed at the bottom. From here, you will work locally (on your computer). 4.5 Clone your repository using RStudio We’ll start of by cloning to our local computer using RStudio. We are going to be cloning a copy of our Remote repository on Github.com to our local computers. Unlike downloading, cloning keeps all the version control and user information bundled with the files. Step 0: Create your github folder This is really important! We need to be organized and deliberate about where we want to keep all of our GitHub repositories (since this is the first of many in your career). Let’s all make a folder called github (all lowercase!) in our home directories. So it will look like this: Windows: Users\\[User]\\Documents\\github\\ Mac: Users/[User]/github/ This will let us take advantage of something that is really key about GitHub.com: you can easily navigate through folders within repositories and the urls reflect this navigation. The greatness of this will be evident soon. So let’s set ourselves up for easily translating (and remembering) those navigation paths by having a folder called github that will serve as our ‘github.com’. So really. Make sure that you have an all-lowercase folder called github in your home directory!! Step 1: Copy the web address of the repository you want to clone. Step 2: from RStudio, go to New Project (also in the File menu). Step 3: Select Version Control Step 4: Select Git Step 5: Paste it in the Repository URL field, and type tab to autofill the Project Directory name. Make sure you keep the Project Directory Name THE SAME as the repository name from the URL. Save it in your github folder (click on Browse) to do this. If everything went well, the repository will be added to the list located here: And the repository will be saved to the Github folder on your computer: Ta da!!!! The folder doesn’t contain much of interest, but we are going to change that. 4.6 Inspect your repository Notice a few things in our repo here: Our working directory is set to ~/github/my-repo. This means that I can start working with the files I have in here without setting the filepath. This is that when we cloned this from RStudio, it created an RStudio project, which you can tell because: .RProj file, which you can see in the Files pane. The project is named in the top right hand corner We have a git tab! This is how we will interface directly to Github.com When you first clone a repo through RStudio, RStudio will add an .Rproj file to your repo. And if you didn’t add a .gitignore file when you originally created the repo on GitHub.com, RStudio will also add this for you. These will show up with little yellow ? icons in your git tab. This is GitHub’s way of saying: “I am responsible for tracking everything that happens in this repo, but I haven’t seen these files yet. Do you want me to track them too?” (We’ll see that when you click the box to stage them, they will turn into As because they have been added to the repo. 4.7 Add files to our local repo The repository will contain: .gitignore file README.md Rproj And, I typically create the following: folders for “data” and “figures” R scripts etc. I’m going to go to the Finder (Windows Explorer on a PC) and copy a file into my repository from there. And then I’m going to go back to RStudio – it shows up in the git tab! So the repository is being tracked, no matter how you make changes to it (changes do not have to be done only through RStudio). To make changes to the repository, you will work from your computer (“local Github”). When files are changed in the local repository, these changes will be reflected in the Git tab of RStudio: 4.7.1 Inspect what has changed These are the codes RStudio uses to describe how the files are changed, (from the RStudio cheatsheet): 4.8 Sync from RStudio to GitHub When you are ready to commit your changes, you follow these steps: We walk through this process below: 4.8.1 Pull From the Git tab, “Pull” the repository. This makes sure your local repository is synced with the remote repository. This is very important if other people are making changes to the repository or if you are working from multiple computers. 4.8.2 Stage Stage the files you want to commit. In RStudio, this involves checking the “Staged” boxes: 4.8.3 Commit 4.8.4 Push 4.9 Explore remote Github The files you added should be on github.com: Let’s also explore commit history, file history. 4.9.1 Your turn! This time let’s edit an existing file instead of adding something new. Open your README file by clicking on it in the Files pane (lower right corner). Write a few lines of text, save, and see what happens in your Git Tab. Sync it to your remote repository (Github.com). Also, go to your Finder/Windows Explorer, and copy-paste something into your local GitHub repo. Then go back to RStudio and confirm that git tracked it. Remember, git will track anything within that folder (the way Dropbox does), it’s not specific to RStudio! 4.10 Create a new R Markdown file OK, now, let’s go back to RStudio, and get ourselves back into learning R. We are going to use R Markdown so that you can write notes to yourself in Markdown, and have a record of all your R code. Writing R commands in the console like we did this morning is great, but limited; it’s hard to keep track of and hard to efficiently share with others. Plus, as your analyses get more complicated, you need to be able to see them all in one place. Go to File > New File > R Markdown … (or click the green plus in the top left corner). Let’s set up this file so we can use it for the rest of the day. I’m going to delete all the text that is already there and write some new text. Here’s what I’m going to write in my R Markdown file to begin: --- title: "Graphics with ggplot2" author: "Julie" date: "11/21/2017" output: html_document --- # Learning ggplot2 We're learning ggplot.2 It's going to be amazing. Now, let’s save it. I’m going to call my file ggplot2.Rmd. OK. Now let’s practice with some of those commands that we were working on this morning. Create a new chunk in your RMarkdown first in one of these ways: click “Insert > R” at the top of the editor pane type by hand ```{r} ``` if you haven’t deleted a chunk that came with the new file, edit that one Now, let’s write some R code. library(tidyverse) # install.packages('tidyverse') Now, hitting return does not execute this command; remember, it’s just a text file. To execute it, we need to get what we typed in the the R chunk (the grey R code) down into the console. How do we do it? There are several ways (let’s do each of them): copy-paste this line into the console. select the line (or simply put the cursor there), and click ‘Run’. This is available from the bar above the file (green arrow) the menu bar: Code > Run Selected Line(s) keyboard shortcut: command-return click the green arrow at the right of the code chunk 4.10.1 Your turn Add a few more commands to your file from this morning. Execute them by trying the three ways above. Then, sync your file to GitHub. What if a file doesn’t show up in the Git tab and you expect that it should? Check to make sure you’ve saved the file. If the filename is red with an asterix, there have been changes since it was saved. Remember to save before syncing to GitHub! 4.11 Committing - how often? Tracking changes in your files Whenever you make changes to the files in Github, you will walk through the Pull -> Stage -> Commit -> Push steps. I tend to do this every time I finish a task (basically when I start getting nervous that I will lose my work). Once something is committed, it is very difficult to lose it. One thing that I love about about Github is that it is easy to see how files have changed over time. Usually I compare commits through github.com: You can click on the commits to see how the files changed from the previous commit: 4.12 Happy Git with R If you have problems, we’ll help you out using Jenny Bryan’s HappyGitWithR, particularly the sections on Detect Git from RStudio and RStudio, Git, GitHub Hell (troubleshooting). So as we are coming around, have a look at it and see if you can help troubleshoot too! "], ["ggplot2.html", "Chapter 5 Visualizing: ggplot2 5.1 Objectives & Resources 5.2 Install our first package: tidyverse 5.3 Plotting with ggplot2 5.4 Data 5.5 Building your plots iteratively 5.6 Faceting 5.7 ggplot2 themes 5.8 Geometric objects (geoms) 5.9 Customization 5.10 Bar charts 5.11 Arranging and exporting plots 5.12 Save and push to GitHub", " Chapter 5 Visualizing: ggplot2 Why do we start with data visualization? Not only is data viz a big part of analysis, it’s a way to SEE your progress as you learn to code. “ggplot2 implements the grammar of graphics, a coherent system for describing and building graphs. With ggplot2, you can do more faster by learning one system and applying it in many places.” - R4DS This lesson borrows heavily from Hadley Wickham’s R for Data Science book, and the Data Carpentry R for Ecology curriculum. 5.1 Objectives & Resources 5.1.1 Objectives install our first package, ggplot2, by installing tidyverse learn ggplot2 with mpg dataframe (important to play with other data than your own, you’ll learn something.) practice writing a script in RMarkdown practice the rstudio-github workflow 5.1.2 Resources Here are some additional resources for data visualization in R: ggplot2-cheatsheet-2.1.pdf Interactive Plots and Maps - Environmental Informatics Graphs with ggplot2 - Cookbook for R ggplot2 Essentials - STHDA “Why I use ggplot2” - David Robinson Blog Post 5.2 Install our first package: tidyverse Packages are bundles of functions, along with help pages and other goodies that make them easier for others to use, (ie. vignettes). So far we’ve been using packages that are already included in base R. These can be considered out-of-the-box packages and include things such as sum and mean. You can also download and install packages created by the vast and growing R user community. The most traditional place to download packages is from CRAN, the Comprehensive R Archive Network. This is where you went to download R originally, and will go again to look for updates. You can also install packages directly from GitHub, which we’ll do tomorrow. You don’t need to go to CRAN’s website to install packages, we can do it from within R with the command install.packages("package-name-in-quotes"). We are going to be using the package ggplot2, which is actually bundled into a huge package called tidyverse. We will install tidyverse now, and use a few functions from the packages within. Also, check out tidyverse.org/. ## from CRAN: install.packages("tidyverse") ## do this once only to install the package on your computer. library(tidyverse) ## do this every time you restart R and need it When you do this, it will tell you which packages are inside of tidyverse that have also been installed. Note that there are a few name conflicts; it is alerting you that we’ll be using two functions from dplyr instead of the built-in stats package. What’s the difference between install.packages() and library()? Why do you need both? Here’s an analogy: install.packages() is setting up electricity for your house. Just need to do this once (let’s ignore monthly bills). library() is turning on the lights. You only turn them on when you need them, otherwise it wouldn’t be efficient. And when you quit R, it turns the lights off, but the electricity lines are still there. So when you come back, you’ll have to turn them on again with library(), but you already have your electricity set up. You can also install packages by going to the Packages tab in the bottom right pane. You can see the packages that you have installed (listed) and loaded (checkbox). You can also install packages using the install button, or check to see if any of your installed packages have updates available (update button). You can also click on the name of the package to see all the functions inside it — this is a super helpful feature that I use all the time. 5.3 Plotting with ggplot2 ggplot2 is a plotting package that makes it simple to create complex plots from data in a data frame. It provides a more programmatic interface for specifying what variables to plot, how they are displayed, and general visual properties. Therefore, we only need minimal changes if the underlying data change or if we decide to change from a bar plot to a scatterplot. This helps in creating publication quality plots with minimal amounts of adjustments and tweaking. ggplot likes data in the ‘long’ format: i.e., a column for every dimension, and a row for every observation. Well structured data will save you lots of time when making figures with ggplot. ggplot graphics are built step by step by adding new elements. Adding layers in this fashion allows for extensive flexibility and customization of plots. 5.4 Data We are going to use the mpg dataset which provides information on fuel economy data for 38 car models. This data comes preloaded with the tidyverse so it is already loaded into R. Let’s take a look at it. mpg ## # A tibble: 234 x 11 ## manufacturer model displ year cyl trans drv cty hwy ## <chr> <chr> <dbl> <int> <int> <chr> <chr> <int> <int> ## 1 audi a4 1.8 1999 4 auto(l5) f 18 29 ## 2 audi a4 1.8 1999 4 manual(m5) f 21 29 ## 3 audi a4 2.0 2008 4 manual(m6) f 20 31 ## 4 audi a4 2.0 2008 4 auto(av) f 21 30 ## 5 audi a4 2.8 1999 6 auto(l5) f 16 26 ## 6 audi a4 2.8 1999 6 manual(m5) f 18 26 ## 7 audi a4 3.1 2008 6 auto(av) f 18 27 ## 8 audi a4 quattro 1.8 1999 4 manual(m5) 4 18 26 ## 9 audi a4 quattro 1.8 1999 4 auto(l5) 4 16 25 ## 10 audi a4 quattro 2.0 2008 4 manual(m6) 4 20 28 ## # ... with 224 more rows, and 2 more variables: fl <chr>, class <chr> This dataframe is already in a long format where all rows are an observation and all columns are variables. Among the variables in mpg are: displ, a car’s engine size, in litres. hwy, a car’s fuel efficiency on the highway, in miles per gallon (mpg). A car with a low fuel efficiency consumes more fuel than a car with a high fuel efficiency when they travel the same distance. To learn more about mpg, open its help page by running ?mpg. Now we’re going to visualize the data that is held in this dataframe. To build a ggplot, we need to: use the ggplot() function and bind the plot to a specific data frame using the data argument ggplot(data = mpg) define aesthetics (aes), by selecting the variables to be plotted and the variables to define the presentation such as plotting size, shape color, etc. Run this code to put displ on the x-axis and hwy on the y-axis: ggplot(data = mpg, aes(x = displ, y = hwy)) add geoms – graphical representation of the data in the plot (points, lines, bars). ggplot2 offers many different geoms; we will use some common ones today, including: geom_point() for scatter plots, dot plots, etc. geom_bar() for bar charts geom_line() for trend lines, time-series, etc. To add a geom to the plot use + operator. Because we have two continuous variables, let’s use geom_point() first: ggplot(data = mpg, aes(x = displ, y = hwy)) + geom_point() The + in the ggplot2 package is particularly useful because it allows you to modify existing ggplot objects. This means you can easily set up plot “templates” and conveniently explore different types of plots, so the above plot can also be generated with code like this: # Assign plot to a variable car_plot <- ggplot(data = mpg, aes(x = displ, y = hwy)) # Draw the plot car_plot + geom_point() Notes: Anything you put in the ggplot() function can be seen by any geom layers that you add (i.e., these are universal plot settings). This includes the x and y axis you set up in aes(). You can also specify aesthetics for a given geom independently of the aesthetics defined globally in the ggplot() function. The + sign used to add layers must be placed at the end of each line containing a layer. If, instead, the + sign is added in the line before the other layer, ggplot2 will not add the new layer and will return an error message. STOP: let’s Commit, Pull and Push to GitHub 5.5 Building your plots iteratively Building plots with ggplot is typically an iterative process. We start by defining the dataset we’ll use, lay the axes, and choose a geom: ggplot(data = mpg, aes(x = displ, y = hwy)) + geom_point() Then, we start modifying this plot to extract more information from it. For instance, we can add transparency (alpha) to avoid overplotting: ggplot(data = mpg, aes(x = displ, y = hwy)) + geom_point(alpha = 0.4) Or to color each class of car in the plot differently: ggplot(data = mpg, aes(x = displ, y = hwy)) + geom_point(aes(color = class)) In the above example, we mapped class to the color aesthetic, but we could have mapped class to the shape aesthetic in the same way. In this case, the shape of each point would reveal its class affiliation. ggplot(data = mpg) + geom_point(mapping = aes(x = displ, y = hwy, shape = class)) What happened to the SUVs? ggplot2 will only use six shapes at a time. By default, additional groups will go unplotted when you use the shape aesthetic. 5.5 Exercise Make a scatterplot of hwy vs cty with different size points representing each car class and different colors for each fuel type. We get a warning here, because mapping an unordered variable (class) to an ordered aesthetic (size) is not a good idea. ggplot(data = mpg) + geom_point(mapping = aes(x = cty, y = hwy, size = class, color = fl)) We can also add colors for all the points. Here, the color doesn’t convey information about a variable, but only changes the appearance of the plot. To set an aesthetic manually, set the aesthetic by name as an argument of your geom function; i.e. it goes outside of aes(). You’ll need to pick a value that makes sense for that aesthetic: The name of a color as a character string. The size of a point in mm. The shape of a point as a number. ggplot(data = mpg, aes(x = displ, y = hwy)) + geom_point(alpha = 0.4, color = "blue") 5.5 Exercise What’s gone wrong with this code? ggplot(data = mpg) + geom_point(aes(x = displ, y = hwy, color = "blue")) Plot highway mpg (hwy) vs engine size (displ) and have the point color to indicate the city mpg (cty). Now instead of color, use shape to indicate city mpg (cty). Why are these two aesthetics behaving differently? What happens if you map an aesthetic to something other than a variable name, like aes(colour = displ < 5)? STOP: commit, pull and push to github 5.6 Faceting ggplot has a special technique called faceting that allows the user to split one plot into multiple plots based on a factor included in the dataset. We will use it to make a plot of the highway miles (hwy) a car gets by its engine size (displ) for each car manufacturer: ggplot(data = mpg, aes(x = displ, y = hwy)) + geom_point() + facet_wrap(~ manufacturer) We can now make the faceted plot by splitting further by class using color (within a single plot): ggplot(data = mpg, aes(x = displ, y = hwy, color = class)) + geom_point() + facet_wrap(~ manufacturer) Usually plots with white background look more readable when printed. We can set the background to white using the function theme_bw(). ggplot(data = mpg, aes(x = displ, y = hwy, color = class)) + geom_point() + facet_wrap(~ manufacturer) + theme_bw() 5.7 ggplot2 themes In addition to theme_bw(), which changes the plot background to white, ggplot2 comes with several other themes which can be useful to quickly change the look of your visualization. The ggthemes package provides a wide variety of options (including an Excel 2003 theme). The ggplot2 extensions website provides a list of packages that extend the capabilities of ggplot2, including additional themes. 5.7 Exercise Spend a couple minutes trying out your plot with different plot themes. The complete list of themes in ggplot2 is available at http://docs.ggplot2.org/current/ggtheme.html. But for some more interesting themes, try installing the ggthemes package and using one of those themes. You can find more information on this package at https://cran.r-project.org/web/packages/ggthemes/vignettes/ggthemes.html 5.8 Geometric objects (geoms) A geom is the geometrical object that a plot uses to represent data. People often describe plots by the type of geom that the plot uses. For example, bar charts use bar geoms, line charts use line geoms, boxplots use boxplot geoms, and so on. Scatterplots break the trend; they use the point geom. You can use different geoms to plot the same data. To change the geom in your plot, change the geom function that you add to ggplot(). Let’s look at a few ways of viewing the distribution of highway mpg (hwy) for each driving class (drv). ggplot(mpg, aes(x = drv, y = hwy)) + geom_jitter() ggplot(mpg, aes(x = drv, y = hwy)) + geom_boxplot() ggplot(mpg, aes(x = drv, y = hwy)) + geom_violin() geom_smooth allows you to view a smoothed mean of data. Here we look at the smooth mean of the highway mpg (hwy) by engine size (displ). ggplot(data = mpg) + geom_smooth(aes(x = displ, y = hwy)) ggplot2 provides over 30 geoms, and extension packages provide even more (see https://www.ggplot2-exts.org for a sampling). The best way to get a comprehensive overview is the ggplot2 cheatsheet. To learn more about any single geom, use help: ?geom_smooth. To display multiple geoms in the same plot, add multiple geom functions to ggplot(): ggplot(data = mpg) + geom_point(aes(x = displ, y = hwy)) + geom_smooth(aes(x = displ, y = hwy)) Notice that this plot contains two geoms in the same graph! This, however, introduces some duplication in our code. Imagine if you wanted to change the y-axis to display cty instead of hwy. You’d need to change the variable in two places, and you might forget to update one. You can avoid this type of repetition by passing a set of mappings to ggplot(). ggplot2 will treat these mappings as global mappings that apply to each geom in the graph. In other words, this code will produce the same plot as the previous code: ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) + geom_point() + geom_smooth() If you place mappings in a geom function, ggplot2 will treat them as local mappings for the layer. It will use these mappings to extend or overwrite the global mappings for that layer only. This makes it possible to display different aesthetics in different layers. ggplot(data = mpg, aes(x = displ, y = hwy)) + geom_point(aes(color = class)) + geom_smooth() 5.9 Customization Take a look at the ggplot2 cheat sheet, and think of ways you could improve the plot. Now, let’s change names of axes to something more informative than ‘hwy’ and ‘displ’ and add a title to the figure: ggplot(data = mpg, aes(x = displ, y = hwy)) + geom_point(aes(color = class)) + geom_smooth() + labs(title = "Relationship between engine size and miles per gallon (mpg)", x = "Highway MPG", y = "Engine displacement (liters)") + theme_bw() The axes have more informative names, but their readability can be improved by increasing the font size: ggplot(data = mpg, aes(x = displ, y = hwy)) + geom_point(aes(color = class)) + geom_smooth() + labs(title = "Relationship between engine size and mpg", x = "Highway MPG", y = "Engine displacement (liters)") + theme_bw() + theme(text=element_text(size = 16)) 5.9 Challenge With all of this information in hand, please take another five minutes to either improve one of the plots generated in this exercise or create a beautiful graph of your own. Use the RStudio ggplot2 cheat sheet for inspiration. Here are some ideas: See if you can change the thickness of the lines. Can you find a way to change the name of the legend? What about its labels? Try using a different color palette (see http://www.cookbook-r.com/Graphs/Colors_(ggplot2)/). 5.10 Bar charts Next, let’s take a look at a bar chart. Bar charts seem simple, but they are interesting because they reveal something subtle about plots. Consider a basic bar chart, as drawn with geom_bar(). The following chart displays the total number of cars in the mpg dataset, grouped by fl (fuel type). ggplot(data = mpg, aes(x = fl)) + geom_bar() On the x-axis, the chart displays fl, a variable from mpg. On the y-axis, it displays count, but count is not a variable in mpg! Where does count come from? Many graphs, like scatterplots, plot the raw values of your dataset. Other graphs, like bar charts, calculate new values to plot: bar charts, histograms, and frequency polygons bin your data and then plot bin counts, the number of points that fall in each bin. smoothers fit a model to your data and then plot predictions from the model. boxplots compute a robust summary of the distribution and then display a specially formatted box. The algorithm used to calculate new values for a graph is called a stat, short for statistical transformation. You can learn which stat a geom uses by inspecting the default value for the stat argument. For example, ?geom_bar shows that the default value for stat is “count”, which means that geom_bar() uses stat_count(). stat_count() is documented on the same page as geom_bar(), and if you scroll down you can find a section called “Computed variables”. That describes how it computes two new variables: count and prop. ggplot2 provides over 20 stats for you to use. Each stat is a function, so you can get help in the usual way, e.g. ?stat_bin. To see a complete list of stats, try the ggplot2 cheatsheet. 5.10.1 Position adjustments There’s one more piece of magic associated with bar charts. You can colour a bar chart using either the color aesthetic, or, more usefully, fill: ggplot(data = mpg, aes(x = fl, fill = fl)) + geom_bar() This isn’t particularly useful since both the geom and the color are displaying the same information. Instead, map the fill aesthetic to another variable, like class: the bars are automatically stacked. Each colored rectangle represents a combination of fl and class. ggplot(data = mpg, aes(x = fl, fill = class)) + geom_bar() The stacking is performed automatically by the position adjustment specified by the position argument. If you don’t want a stacked bar chart, you can use "dodge" or "fill". position = "fill" works like stacking, but makes each set of stacked bars the same height. This makes it easier to compare proportions across groups. ggplot(data = mpg, aes(x = fl, fill = class)) + geom_bar(position = "fill") position = "dodge" places overlapping objects directly beside one another. This makes it easier to compare individual values. ggplot(data = mpg, aes(x = fl, fill = class)) + geom_bar(position = "dodge") 5.10.1 Challenge With all of this information in hand, please take another five minutes to either improve one of the plots generated in this exercise or create a beautiful graph of your own. Use the RStudio ggplot2 cheat sheet for inspiration. Remember to use the help documentation (e.g. ?geom_bar) Here are some ideas: Plot different variables using geom_bar(). For what variables is this geom useful? Flip the x and y axes. Use scale_x_discrete to change the x-axis tick labels to “CNG”, “Diesel”, “Ethanol”, “Premium”, and “Regular” ggplot(data = mpg) + geom_bar(aes(x = fl, fill = class), position = "dodge") + scale_x_discrete(labels=c("CNG", "Diesel", "Ethanol", "Premium", "Regular")) + xlab("Fuel type") 5.11 Arranging and exporting plots After creating your plot, you can save it to a file in your favorite format. The Export tab in the Plot pane in RStudio will save your plots at low resolution, which will not be accepted by many journals and will not scale well for posters. Instead, use the ggsave() function, which allows you easily change the dimension and resolution of your plot by adjusting the appropriate arguments (width, height and dpi): my_plot <- ggplot(data = mpg, aes(x = displ, y = hwy)) + geom_point(aes(color = class)) + geom_smooth() + labs(title = "Relationship between engine size and mpg", x = "Highway MPG", y = "Engine displacement (liters)") + theme_bw() + theme(text=element_text(size = 16)) ggsave("name_of_file.png", my_plot, width = 15, height = 10) Note: The parameters width and height also determine the font size in the saved plot. 5.12 Save and push to GitHub "], ["dplyr.html", "Chapter 6 Data Wrangling: dplyr 6.1 Objectives and Resources 6.2 Tidy Data 6.3 Explore the gapminder data.frame 6.4 dplyr basics 6.5 filter() subsets data row-wise (observations). 6.6 Your turn 6.7 select() subsets data column-wise (variables) 6.8 Use select() and filter() together 6.9 Meet the new pipe %>% operator 6.10 mutate() adds new variables 6.11 group_by() operates on groups 6.12 arrange() orders columns 6.13 All together now 6.14 Joining datasets 6.15 Key Points 6.16 Troubleshooting.", " Chapter 6 Data Wrangling: dplyr Data scientists, according to interviews and expert estimates, spend from 50 percent to 80 percent of their time mired in the mundane labor of collecting and preparing data, before it can be explored for useful information. - NYTimes (2014) 6.1 Objectives and Resources What are some common things you like to do with your data? Maybe remove rows or columns, do calcuations and maybe add new columns? This is called data wrangling. It’s not data management or data manipulation: you keep the raw data raw and do these things programatically in R with the tidyverse. We are going to introduce you to data wrangling in R first with the tidyverse. The tidyverse is a new suite of packages that match a philosophy of data science developed by Hadley Wickham and the RStudio team. I find it to be a more straight-forward way to learn R. We will also show you by comparison what code will look like in “Base R”, which means, in R without any additional packages (like the “tidyverse” package) installed. I like David Robinson’s blog post on the topic of teaching the tidyverse first. For some things, base-R is more straight forward, and we’ll show you that too. Whenever we use a function that is from the tidyverse, we will prefix it so you’ll know for sure. 6.1.1 Objectives learn about tidy data learn dplyr with gapminder data practice RStudio-GitHub workflow 6.1.2 Resources Today’s materials are again borrowing from some excellent sources, including: Jenny Bryan’s lectures from STAT545 at UBC: Introduction to dplyr Hadley Wickham and Garrett Grolemund’s R for Data Science Software Carpentry’s R for reproducible scientific analysis materials: Dataframe manipulation with dplyr First developed for Software Carpentry at UCSB RStudio’s data wrangling cheatsheet RStudio’s data wrangling webinar 6.2 Tidy Data Hadley Wickham, RStudio’s Chief Scientist, has been building R packages for data wrangling and visualization based on the idea of tidy data. Tidy data has a simple convention: put variables in the columns and observations in the rows. The mpg dataset we were working with this morning was an example of tidy data. When data are tidy, you are set up to work with it for your analyses, plots, etc. Right now we are going to use dplyr to wrangle this tidyish data set (the transform part of the cycle), and then come back to tidying messy data using tidyr once we’ve had some fun wrangling. These are both part of the tidyverse package that we’ve already installed: And actually, Hadley Wickham and RStudio have created a ton of packages that help you at every step of the way here. This is from one of Hadley’s recent presentations: 6.2.1 Setup We’ll do this in a new RMarkdown file. Here’s what to do: Clear your workspace (Session > Restart R) New File > R Markdown… Save as gapminder-wrangle.Rmd Delete the irrelevant text and write a little note to yourself about how we’ll be wrangling gapminder data using dplyr. You can edit the title too if you need to. 6.2.2 load tidyverse (which has dplyr inside) In your R Markdown file, let’s make sure we’ve got our libraries loaded. Write the following: library(tidyverse) ## install.packages("tidyverse") This is becoming standard practice for how to load a library in a file, and if you get an error that the library doesn’t exist, you can install the package easily by running the code within the comment (highlight install.packages("tidyverse") and run it). 6.3 Explore the gapminder data.frame Yesterday we explored the mpg data.frame visually. Today, we’ll explore a dataset by the numbers. We will work with some of the data from the Gapminder project. The data are on GitHub. Navigate there by going to: github.com > ohi-science > data-science-training > data > gapminder.csv or by copy-pasting this in the browser: https://github.com/OHI-Science/data-science-training/blob/master/data/gapminder.csv Have a look at the data. It’s a .csv file, which you’ve probably encountered before, but GitHub has formatted it nicely so it’s easy to look at. You can see that for every country and year, there are several columns with data in them. 6.3.1 read data with readr::read_csv() We can read this data into R directly from GitHub, without downloading it. We can do that by clicking on the Raw button on the top-right of the data. This displays it as the raw csv file, without formatting. Copy the url: https://raw.githubusercontent.com/jules32/2017-11-30-MBARI/gh-pages/data/gapminder.csv Now, let’s go back to RStudio. In our R Markdown, let’s read this csv file and name the variable “gapminder”. We will use the read_csv() function from the readr package (part of the tidyverse, so it’s already installed!). ## read gapminder csv. Note the readr:: prefix identifies which package it's in gapminder <- readr::read_csv('https://raw.githubusercontent.com/jules32/2017-11-30-MBARI/gh-pages/data/gapminder.csv') Let’s inspect: ## explore the gapminder dataset gapminder # this is super long! Let's inspect in different ways Let’s use head and tail: head(gapminder) # shows first 6 tail(gapminder) # shows last 6 head(gapminder, 10) # shows first X that you indicate tail(gapminder, 12) # guess what this does! str() will provide a sensible description of almost anything: when in doubt, just str() some of the recently created objects to get some ideas about what to do next. str(gapminder) # ?str - displays the structure of an object gapminder is a data.frame. We aren’t going to get into the other types of data receptacles today (‘arrays’, ‘matrices’), because working with data.frames is what you should primarily use. Why? data.frames package related variables neatly together, great for analysis most functions, including the latest and greatest packages actually require that your data be in a data.frame data.frames can hold variables of different flavors such as character data (country or continent names; “Characters (chr)”) quantitative data (years, population; “Integers (int)” or “Numeric (num)”) categorical information (male vs. female) We can also see the gapminder variable in RStudio’s Environment pane (top right) More ways to learn basic info on a data.frame. names(gapminder) dim(gapminder) # ?dim dimension ncol(gapminder) # ?ncol number of columns nrow(gapminder) # ?nrow number of rows We can combine using c() to reverse-engineer dim()! Just a side-note here, but I wanted to introduce you to c(): we’ll use it later. c(nrow(gapminder), ncol(gapminder)) # ?c combines values into a vector or list. A statistical overview can be obtained with summary(), or with skimr::skim() summary(gapminder) library(skimr) # install.packages('skimr') skim(gapminder) 6.3.2 Look at the variables inside a data.frame To specify a single variable from a data.frame, use the dollar sign $. The $ operator is a way to extract of replace parts of an object–check out the help menu for $. It’s a common operator you’ll see in R. gapminder$lifeExp # very long! hard to make sense of... head(gapminder$lifeExp) # can do the same tests we tried before str(gapminder$lifeExp) # it is a single numeric vector summary(gapminder$lifeExp) # same information, just formatted slightly differently 6.4 dplyr basics OK, so let’s start wrangling with dplyr. There are five dplyr functions that you will use to do the vast majority of data manipulations: filter(): pick observations by their values select(): pick variables by their names mutate(): create new variables with functions of existing variables summarise(): collapse many values down to a single summary arrange(): reorder the rows These can all be used in conjunction with group_by() which changes the scope of each function from operating on the entire dataset to operating on it group-by-group. These six functions provide the verbs for a language of data manipulation. All verbs work similarly: The first argument is a data frame. The subsequent arguments describe what to do with the data frame. You can refer to columns in the data frame directly without using $. The result is a new data frame. Together these properties make it easy to chain together multiple simple steps to achieve a complex result. 6.5 filter() subsets data row-wise (observations). You will want to isolate bits of your data; maybe you want to just look at a single country or a few years. R calls this subsetting. filter() is a function in dplyr that takes logical expressions and returns the rows for which all are TRUE. Visually, we are doing this (thanks RStudio for your cheatsheet): Remember your logical expressions from this morning? We’ll use < and == here. filter(gapminder, lifeExp < 29) You can say this out loud: “Filter the gapminder data for life expectancy less than 29”. Notice that when we do this, all the columns are returned, but just the rows that have the life expectancy less than 29. We’ve subsetted by row. Let’s try another: “Filter the gapminder data for the country Mexico”. filter(gapminder, country == "Mexico") How about if we want two country names? We can’t use the == operator here, because it can only operate on one thing at a time. We will use the %in% operator: filter(gapminder, country %in% c("Mexico", "Peru")) How about if we want Mexico in 2002? You can pass filter different criteria: filter(gapminder, country == "Mexico", year == 2002) 6.6 Your turn What is the mean life expectancy of Sweden? Hint: do this in 2 steps by assigning a variable and then using the mean() function. Then, sync to Github.com (pull, stage, commit, push). 6.6.1 Answer x <- filter(gapminder, country == "Sweden") mean(x$lifeExp) 6.7 select() subsets data column-wise (variables) We use select() to subset the data on variables or columns. Visually, we are doing this (thanks RStudio for your cheatsheet): Here’s a conventional call. Again, see that we can select multiple columns just with a comma, after we specify the data frame (gapminder). select(gapminder, year, lifeExp) We can also use - to deselect columns select(gapminder, -continent, -lifeExp) # you can use - to deselect columns 6.8 Use select() and filter() together Let’s filter for Cambodia and remove the continent and lifeExp columns. We’ll save this as a variable. Actually, as two temporary variables, and naming them and keeping track of them can get kind of cumbersome. gap_cambodia <- filter(gapminder, country == "Cambodia") gap_cambodia2 <- select(gap_cambodia, -continent, -lifeExp) 6.9 Meet the new pipe %>% operator Before we go any further, we should exploit the new pipe operator that dplyr imports from the magrittr package by Stefan Bache. This is going to change your life. You no longer need to enact multi-operation commands by nesting them inside each other. And we won’t need to make temporary variables like we did in the Cambodia example above. This new syntax leads to code that is much easier to write and to read: it actually tells the story of your analysis. Here’s what it looks like: %>%. The RStudio keyboard shortcut: Ctrl + Shift + M (Windows), Cmd + Shift + M (Mac). Let’s demo then I’ll explain: gapminder %>% head() This is equivalent to head(gapminder). This pipe operator takes the thing on the left-hand-side and pipes it into the function call on the right-hand-side – literally, drops it in as the first argument. Never fear, you can still specify other arguments to this function! To see the first 3 rows of Gapminder, we could say head(gapminder, 3) or this: gapminder %>% head(3) I’ve advised you to think “gets” whenever you see the assignment operator, <-. Similarly, you should think “and then” whenever you see the pipe operator, %>%. One of the most awesome things about this is that you START with the data before you say what you’re doing to DO to it. So above: “take the gapminder data, and then give me the head”. This means that instead of this: ## instead of this... gap_cambodia <- filter(gapminder, country == "Cambodia") gap_cambodia2 <- select(gap_cambodia, -continent, -lifeExp) ## ...we can do this gap_cambodia <- gapminder %>% filter(country == "Cambodia") gap_cambodia2 <- gap_cambodia %>% select(-continent, -lifeExp) So you can see that we’ll start with gapminder in the first example line, and then gap_cambodia in the second. This makes it a bit easier to see what data we are starting with and what we are doing to it. …But, we still have those temporary variables so we’re not truly that better off. But get ready to be majorly impressed: 6.9.1 Revel in the convenience We can use the pipe to chain those two operations together: gap_cambodia <- gapminder %>% filter(country == "Cambodia") %>% select(-continent, -lifeExp) What’s happening here? In the second line, we were able to delete gap_cambodia2 <- gap_cambodia, and put the pipe operator above. This is possible since we wanted to operate on the gap_cambodia data anyways. And we weren’t truly excited about having a second variable named gap_cambodia2 anyways, so we can get rid of it. This is huge, because most of your data wrangling will have many more than 2 steps, and we don’t want a gap_cambodia14! Let’s write it again but using multiple lines so it’s nicer to read. gap_cambodia <- gapminder %>% filter(country == "Cambodia") %>% select(-continent, -lifeExp) Amazing. I can actually read this like a story and there aren’t temporary variables that get super confusing. In my head: “Take the gapminder data, and then filter for Cambodia, and then deselect the variables continent and lifeExp.” Being able to read a story out of code like this is really game-changing. We’ll continue using this syntax as we learn the other dplyr verbs. 6.10 mutate() adds new variables Alright, let’s keep going. Let’s say we needed to add an index column so we know which order these data came in. Let’s not make a new variable, let’s add a column to our gapminder data frame. How do we do that? With the mutate() function. Visually, we are doing this (thanks RStudio for your cheatsheet): We will name our new column index. We will name the new column ‘index’; and we assign it with a single =. Notice that we can use the nrow function within our mutate call: gapminder %>% mutate(index = 1:nrow(gapminder)) OK, let’s do another example. Imagine we wanted to recover each country’s GDP. After all, the Gapminder data has a variable for population and GDP per capita. gapminder %>% mutate(gdp = pop * gdpPercap) 6.10.1 Your turn Find the maximum gdpPercap of Egypt and Vietnam Create a new column. Then, sync to Github.com (pull, stage, commit, push). 6.10.1.1 Answer gapminder %>% select(-continent, -lifeExp) %>% # not super necessary but to simplify filter(country == "Egypt") %>% mutate(gdp = pop * gdpPercap) %>% mutate(max_gdp = max(gdp)) ## you can also create multiple variables within the same mutate(), and line them up so they are easier to read: gapminder %>% select(-continent, -lifeExp) %>% # not super necessary but to simplify filter(country == "Vietnam") %>% mutate(gdp = pop * gdpPercap, max_gdp = max(gdp)) With the things we know so far, the answers you have are maybe a bit limiting. First, We had to act on Egypt and Vietnam separately, and repeat the same code. Copy-pasting like this is also super error prone. And second, this max_gdpPercap column is pretty redundant, because it’s a repeated value a ton of times. Sometimes this is exactly what you want! You are now set up nicely to maybe take a proportion of gdpPercap/max_gdpPercap for each year or something. But maybe you just wanted that max_gdpPercap for something else. Let’s keep going… 6.11 group_by() operates on groups Let’s tackle that first issue first. So how do we less painfully calculate the max gdpPercap for all countries? Visually, we are doing this (thanks RStudio for your cheatsheet): gapminder %>% group_by(country) %>% mutate(gdp = pop * gdpPercap, max_gdp = max(gdp)) %>% ungroup() # if you use group_by, also use ungroup() to save heartache later So instead of filtering for a specific country, we’ve grouped by country, and then done the same operations. It’s hard to see; let’s look at a bunch at the tail: gapminder %>% group_by(country) %>% mutate(gdp = pop * gdpPercap, max_gdp = max(gdp)) %>% ungroup() %>% tail(30) OK, this is great. But what if this what we needed, a max_gdp value for each country. We don’t need that kind of repeated value for each of the max_gdp values. Here’s the next function: 6.11.1 summarize() with group_by() We want to operate on a group, but actually collapse or distill the output from that group. The summarize() function will do that for us. Visually, we are doing this (thanks RStudio for your cheatsheet): Here we go: gapminder %>% group_by(country) %>% mutate(gdp = pop * gdpPercap) %>% summarize(max_gdp = max(gdp)) %>% ungroup() How cool is that! summarize() will actually only keep the columns that are grouped_by or summarized. So if we wanted to keep other columns, we’d have to do it another way (we’ll get into it tomorrow). 6.12 arrange() orders columns This is ordered alphabetically, which is cool. But let’s say we wanted to order it in ascending order for max_gdp. The dplyr function is arrange(). gapminder %>% group_by(country) %>% mutate(gdp = pop * gdpPercap) %>% summarize(max_gdp = max(gdp)) %>% ungroup() %>% arrange(max_gdp) 6.12.1 Your turn arrange your data frame in descending order (opposite of what we’ve done). Expect that this is possible: ?arrange save your data frame as a variable find the maximum life expectancy for countries in Asia. What is the earliest year you encounter? The latest? Hint: you can use or base::max and dplyr::arrange()… Knit your RMarkdown file, and sync it to GitHub (pull, stage, commit, push) 6.12.1.1 Answer (no peeking!) gapminder %>% filter(continent == 'Asia') %>% group_by(country) %>% filter(lifeExp == max(lifeExp)) %>% arrange(year) 6.13 All together now We have done a pretty incredible amount of work in a few lines. Our whole analysis is this. Imagine the possibilities from here. It’s very readable: you see the data as the first thing, it’s not nested. Then, you can read the verbs. This is the whole thing, with explicit package calls from readr:: and dplyr::: ## gapminder-wrangle.R ## J. Lowndes lowndes@nceas.ucsb.edu ## load libraries library(tidyverse) ## install.packages('tidyverse') ## read in data gapminder <- readr::read_csv('https://raw.githubusercontent.com/jules32/2017-11-30-MBARI/gh-pages/data/gapminder.csv') ## summarize gap_max_gdp <- gapminder %>% dplyr::select(-continent, -lifeExp) %>% # or select(country, year, pop, gdpPercap) dplyr::group_by(country) %>% dplyr::mutate(gdp = pop * gdpPercap) %>% dplyr::summarize(max_gdp = max(gdp)) %>% dplyr::ungroup() I actually am borrowing this “All together now” from Tony Fischetti’s blog post How dplyr replaced my most common R idioms). With that as inspiration, this is how what we have just done would look like in Base R. 6.13.1 Compare to base R Let’s compare with some base R code to accomplish the same things. Base R requires subsetting with the [rows, columns] notation. This notation is something you’ll see a lot in base R. the brackets [ ] allow you to extract parts of an object. Within the brackets, the comma separates rows from columns. If we don’t write anything after the comma, that means “all columns”. And if we don’t write anything before the comma, that means “all rows”. Also, the $ operator is how you access specific columns of your dataframe. You can also add new columns like we will do with mex$gdp below. Instead of calculating the max for each country like we did with dplyr above, here we will just calculate the max for one country, Mexico. Tomorrow we will learn how to do it for all the countries, like we did with dplyr::group_by(). ## gapminder-wrangle.R --- baseR ## J. Lowndes lowndes@nceas.ucsb.edu gapminder <- read.csv('https://raw.githubusercontent.com/jules32/2017-11-30-MBARI/gh-pages/data/gapminder.csv', stringsAsFactors = FALSE) x1 <- gapminder[ , c('country', 'year', 'pop', 'gdpPercap') ]# subset columns mex <- x1[x1$country == "Mexico", ] # subset rows mex$gdp <- mex$pop * mex$gdpPercap # add new columns mex$max_gdp <- max(mex$gdp) Note too that the chain operator %>% that we used with the tidyverse lets us get away from the temporary variable x1. 6.13.2 Your Turn Get your RMarkdown file cleaned up and sync it for the last time today! 6.13.2.1 Answers … 6.14 Joining datasets We’ve learned a ton in this session and we may not get to this right now. If we don’t have time, we’ll start here before getting into the next chapter: `tidyr) Sometimes you have data coming from different places or in different files, and you want to put them together so you can analyze them. This is called relational data, because it has some kind of relationship. In the tidyverse, combining data that has a relationship is called “joining”. From the RStudio cheatsheet (note: this is an earlier version of the cheatsheet but I like the graphics): Notice how you may not have exactly the same observations in the x1 columns above. Observations A and B are the same, but notice how the table on the left has observation C, and the table on the right has observation D. If you wanted to combine these two tables, how would you do it? There are some decisions you’d have to make about what was important to you. The cheatsheet visualizes it for us: We will just talk about this briefly here, but you can refer to this more as you have your own datasets that you want to join. This describes the figure above:: left_join keeps everything from the left table and matches as much as it can from the right table. In R, the first thing that you type will be the left table (because it’s on the left) right_join keeps everything from the right table and matches as much as it can from the left table inner_join only keeps the observations that are similar between the two tables full_join keeps all observations from both tables. Let’s play with these CO2 emmissions data just to illustrate: ## read in the data. (same URL as yesterday, just with co2.csv instead of gapminder.csv) co2 <- read_csv("https://raw.githubusercontent.com/OHI-Science/data-science-training/master/data/co2.csv") ## explore co2 %>% head() co2 %>% dim() # 12 ## create new variable that is only 2007 data gap_2007 <- gapminder %>% filter(year == 2007) gap_2007 %>% dim() # 142 ## left_join gap_2007 to co2 lj <- left_join(gap_2007, co2, by = "country") ## explore lj %>% dim() #142 lj %>% summary() # lots of NAs in the co2_2017 columm lj %>% View() ## right_join gap_2007 and co2 rj <- right_join(gap_2007, co2, by = "country") ## explore rj %>% dim() # 12 rj %>% summary() rj %>% View() That’s all we’re going to talk about today with joining, but there are more ways to think about and join your data. Check out the Relational Data Chapter in R for Data Science. 6.15 Key Points Data manipulation functions in dplyr allow you to filter() by rows and select() by columns, create new columns with mutate(), and group_by() unique column values to apply summarize() for new columns that define aggregate values across groupings. The “then” operator %>% allows you to chain successive operations without needing to define intermediary variables for creating the most parsimonious, easily read analysis. 6.16 Troubleshooting. 6.16.1 Error: unexpected SPECIAL in " %>%" If you get this error, it is probably because you have a line that starts with a pipe. The pipe should be at the end of the previous line, not the start of the current line. Yes: gap_cambodia <- gapminder %>% filter(country == "Cambodia") %>% select(-continent, -lifeExp) No: gap_cambodia <- gapminder %>% filter(country == "Cambodia") %>% select(-continent, -lifeExp) # Error: unexpected SPECIAL in " %>%" "], ["tidyr.html", "Chapter 7 Data Wrangling: tidyr 7.1 Overview 7.2 tidyr basics 7.3 Explore gapminder dataset. 7.4 gather() data from wide to long format 7.5 Plot long format data 7.6 spread() 7.7 clean up and save your .Rmd 7.8 Other links", " Chapter 7 Data Wrangling: tidyr 7.1 Overview Now you have some experience wrangling and working with tidy data. But we all know that not all data that you have are tidy. So how do we make data more tidy? With the tidyr package. Objectives learn tidyr with the gapminder package other wrangling: joins, binding practice the RStudio-GitHub workflow your turn: use the data wrangling cheat sheet to explore window functions Resources These materials borrow heavily from: R for Data Science: Relational Data R for Data Science: Tidy Data 7.1.1 Setup We’ll work today in RMarkdown. You can either continue from the same RMarkdown as yesterday, or begin a new one. Here’s what to do: Clear your workspace (Session > Restart R) New File > R Markdown…, save as something other than gapminder-wrangle.Rmd and delete irrelevant info, or just continue using gapminder-wrangle.Rmd I’m going to write this in my R Markdown file: Data wrangling with `tidyr`, which is part of the tidyverse. We are going to tidy some data! 7.1.2 load tidyverse (which has tidyr inside) First load tidyr in an R chunk. You already have installed the tidyverse, so you should be able to just load it like this (using the comment so you can run install.packages("tidyverse") easily if need be): library(tidyverse) # install.packages("tidyverse") 7.2 tidyr basics Remember, from the dplyr section, that tidy data means all rows are an observation and all columns are variables. It’s important to recognize what shape your data is in, and work towards tidying it up. Let’s take a look at some examples. Data in the wide format each row is often a site/subject/patient and you have multiple observation variables containing the same type of data. These can be either repeated observations over time, or observation of multiple variables (or a mix of both). Data input may be simpler or some other applications may prefer the wide format. However, many of R’s functions have been designed assuming you have long format data. A simple example of data in a wide format is the AirPassengers dataset which provides information on monthly airline passenger numbers from 1949-1960. You’ll notice that each row is a single year and the columns are each month Jan - Dec. AirPassengers ## Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ## 1949 112 118 132 129 121 135 148 148 136 119 104 118 ## 1950 115 126 141 135 125 149 170 170 158 133 114 140 ## 1951 145 150 178 163 172 178 199 199 184 162 146 166 ## 1952 171 180 193 181 183 218 230 242 209 191 172 194 ## 1953 196 196 236 235 229 243 264 272 237 211 180 201 ## 1954 204 188 235 227 234 264 302 293 259 229 203 229 ## 1955 242 233 267 269 270 315 364 347 312 274 237 278 ## 1956 284 277 317 313 318 374 413 405 355 306 271 306 ## 1957 315 301 356 348 355 422 465 467 404 347 305 336 ## 1958 340 318 362 348 363 435 491 505 404 359 310 337 ## 1959 360 342 406 396 420 472 548 559 463 407 362 405 ## 1960 417 391 419 461 472 535 622 606 508 461 390 432 long format is the tidy data we are after, where: each column is a variable each row is an observation In the long format, you usually have 1 column for the observed variable and the other columns are ID variables. The mpg dataset is an example of a long dataset with each row representing a single car and each column representing a variable of that car such as manufacturer and year. mpg ## # A tibble: 234 x 11 ## manufacturer model displ year cyl trans drv cty hwy ## <chr> <chr> <dbl> <int> <int> <chr> <chr> <int> <int> ## 1 audi a4 1.8 1999 4 auto(l5) f 18 29 ## 2 audi a4 1.8 1999 4 manual(m5) f 21 29 ## 3 audi a4 2.0 2008 4 manual(m6) f 20 31 ## 4 audi a4 2.0 2008 4 auto(av) f 21 30 ## 5 audi a4 2.8 1999 6 auto(l5) f 16 26 ## 6 audi a4 2.8 1999 6 manual(m5) f 18 26 ## 7 audi a4 3.1 2008 6 auto(av) f 18 27 ## 8 audi a4 quattro 1.8 1999 4 manual(m5) 4 18 26 ## 9 audi a4 quattro 1.8 1999 4 auto(l5) 4 16 25 ## 10 audi a4 quattro 2.0 2008 4 manual(m6) 4 20 28 ## # ... with 224 more rows, and 2 more variables: fl <chr>, class <chr> These different data formats mainly affect readability. For humans, the wide format is often more intuitive since we can often see more of the data on the screen due to it’s shape. However, the long format is more machine readable and is closer to the formatting of databases. The ID variables in our dataframes are similar to the fields in a database and observed variables are like the database values. Note: Generally, mathematical operations are better in long format, although some plotting functions actually work better with wide format. Often, data must be reshaped for it to become tidy data. What does that mean? There are four main verbs we’ll use, which are essentially pairs of opposites: turn columns into rows (gather()), turn rows into columns (spread()), turn a character column into multiple columns (separate()), turn multiple character columns into a single column (unite()) 7.3 Explore gapminder dataset. Yesterday we started off with the gapminder data in a format that was already tidy. But what if it weren’t? Let’s look at a different version of those data. The data are on GitHub. Navigate there by going to: github.com > ohi-science > data-science-training > data > gapminder_wide.csv or by copy-pasting this in the browser: https://github.com/OHI-Science/data-science-training/blob/master/data/gapminder_wide.csv Have a look at the data. Question: Is gapminder a purely long, purely wide, or some intermediate format? You can see there are a lot more columns than the version we looked at before. This format is pretty common, because it can be a lot more intuitive to enter data in this way. Sometimes, as with the gapminder dataset, we have multiple types of observed data. It is somewhere in between the purely ‘long’ and ‘wide’ data formats: 3 “ID variables” (continent, country, year) 3 “Observation variables” (pop,lifeExp,gdpPercap). It’s pretty common to have data in this intermediate format in most cases despite not having ALL observations in 1 column, since all 3 observation variables have different units. But we can play with switching it to long format and wide to show what that means (i.e. long would be 4 ID variables and 1 observation variable). But we want it to be in a tidy way so that we can work with it more easily. So here we go. You use spread() and gather() to transform or reshape data between wide to long formats. 7.4 gather() data from wide to long format Read in the data from GitHub. Remember, you need to click on the ‘Raw’ button first so you can read it directly. Let’s also read in the gapminder data from yesterday so that we can use it to compare later on. ## wide format gap_wide <- readr::read_csv('https://raw.githubusercontent.com/OHI-Science/data-science-training/master/data/gapminder_wide.csv') ## yesterday's format (intermediate) gapminder <- readr::read_csv('https://raw.githubusercontent.com/OHI-Science/data-science-training/master/data/gapminder.csv') Let’s have a look: head(gap_wide) str(gap_wide) While wide format is nice for data entry, it’s not nice for calculations. Some of the columns are a mix of variable (e.g. “gdpPercap”) and data (“1952”). What if you were asked for the mean population after 1990 in Algeria? Possible, but ugly. But we know it doesn’t need to be so ugly. Let’s tidy it back to the format we’ve been using. Question: let’s talk this through together. If we’re trying to turn the gap_wide format into gapminder format, what structure does it have that we like? And what do we want to change? We like the continent and country columns. We won’t want to change those. For long format, we’d want just 1 column identifying the variable name (tidyr calls this a ‘key’), and 1 column for the data (tidyr calls this the ’value’). For intermediate format, we’d want 3 columns for gdpPercap, lifeExp, and pop. We would like year as a separate column. Let’s get it to long format. We’ll have to do this in 2 steps. The first step is to take all of those column names (e.g. lifeExp_1970) and make them a variable in a new column, and transfer the values into another column. Let’s learn by doing: Let’s have a look at gather()’s help: ?gather Question: What is our key-value pair? We need to name two new variables in the key-value pair, one for the key, one for the value. It can be hard to wrap your mind around this, so let’s give it a try. Let’s name them obstype_year and obs_values. Here’s the start of what we’ll do: gap_long <- gap_wide %>% gather(key = obstype_year, value = obs_values) Although we were already planning to inspect our work, let’s definitely do it now: str(gap_long) ## Classes 'tbl_df', 'tbl' and 'data.frame': 5396 obs. of 2 variables: ## $ obstype_year: chr "continent" "continent" "continent" "continent" ... ## $ obs_values : chr "Africa" "Africa" "Africa" "Africa" ... head(gap_long) ## # A tibble: 6 x 2 ## obstype_year obs_values ## <chr> <chr> ## 1 continent Africa ## 2 continent Africa ## 3 continent Africa ## 4 continent Africa ## 5 continent Africa ## 6 continent Africa tail(gap_long) ## # A tibble: 6 x 2 ## obstype_year obs_values ## <chr> <chr> ## 1 pop_2007 9031088 ## 2 pop_2007 7554661 ## 3 pop_2007 71158647 ## 4 pop_2007 60776238 ## 5 pop_2007 20434176 ## 6 pop_2007 4115771 We have reshaped our dataframe but this new format isn’t really what we wanted. What went wrong? Notice that it didn’t know that we wanted to keep continent and country untouched; we need to give it more information about which columns we want reshaped. We can do this in several ways. One way is to identify the columns is by name. Listing them explicitly can be a good approach if there are just a few. But in our case we have 30 columns. I’m not going to list them out here since there is way too much potential for error if I tried to list gdpPercap_1952, gdpPercap_1957, gdpPercap_1962 and so on. But we could use some of dplyr’s awesome helper functions — because we expect that there is a better way to do this! gap_long <- gap_wide %>% gather(key = obstype_year, value = obs_values, dplyr::starts_with('pop'), dplyr::starts_with('lifeExp'), dplyr::starts_with('gdpPercap')) #here i'm listing all the columns to use in gather str(gap_long) head(gap_long) tail(gap_long) Success! And there is another way that is nice to use if your columns don’t follow such a structured pattern: you can exclude the columns you don’t want. gap_long <- gap_wide %>% gather(key = obstype_year, value = obs_values, -continent, -country) str(gap_long) head(gap_long) tail(gap_long) To recap: Inside gather() we first name the new column for the new ID variable (obstype_year), the name for the new amalgamated observation variable (obs_value), then the names of the old observation variable. We could have typed out all the observation variables, but as in the select() function (see dplyr lesson), we can use the starts_with() argument to select all variables that starts with the desired character string. Gather also allows the alternative syntax of using the - symbol to identify which variables are not to be gathered (i.e. ID variables). OK, but we’re not done yet. obstype_year actually contains two pieces of information, the observation type (pop,lifeExp, or gdpPercap) and the year. We can use the separate() function to split the character strings into multiple variables. ?separate –> the main arguments are separate(data, col, into, sep ...). So we need to specify which column we want separated, name the new columns that we want to create, and specify what we want it to separate by. Since the obstype_year variable has observation types and years separated by a _, we’ll use that. gap_long <- gap_wide %>% gather(key = obstype_year, value = obs_values, -continent, -country) %>% separate(obstype_year, into = c('obs_type','year'), sep = "_", convert = TRUE) #this ensures that the year column is an integer rather than a character No warning messages…still we inspect: str(gap_long) ## Classes 'tbl_df', 'tbl' and 'data.frame': 5112 obs. of 5 variables: ## $ continent : chr "Africa" "Africa" "Africa" "Africa" ... ## $ country : chr "Algeria" "Angola" "Benin" "Botswana" ... ## $ obs_type : chr "gdpPercap" "gdpPercap" "gdpPercap" "gdpPercap" ... ## $ year : int 1952 1952 1952 1952 1952 1952 1952 1952 1952 1952 ... ## $ obs_values: num 2449 3521 1063 851 543 ... head(gap_long) ## # A tibble: 6 x 5 ## continent country obs_type year obs_values ## <chr> <chr> <chr> <int> <dbl> ## 1 Africa Algeria gdpPercap 1952 2449 ## 2 Africa Angola gdpPercap 1952 3521 ## 3 Africa Benin gdpPercap 1952 1063 ## 4 Africa Botswana gdpPercap 1952 851 ## 5 Africa Burkina Faso gdpPercap 1952 543 ## 6 Africa Burundi gdpPercap 1952 339 tail(gap_long) ## # A tibble: 6 x 5 ## continent country obs_type year obs_values ## <chr> <chr> <chr> <int> <dbl> ## 1 Europe Sweden pop 2007 9031088 ## 2 Europe Switzerland pop 2007 7554661 ## 3 Europe Turkey pop 2007 71158647 ## 4 Europe United Kingdom pop 2007 60776238 ## 5 Oceania Australia pop 2007 20434176 ## 6 Oceania New Zealand pop 2007 4115771 Excellent. This is long format: every row is a unique observation. Yay! 7.5 Plot long format data The long format is the preferred format for plotting with ggplot2. Let’s look at an example by plotting just Canada’s life expectency. canada_df <- gap_long %>% filter(obs_type == "lifeExp", country == "Canada") ggplot(canada_df, aes(x = year, y = obs_values)) + geom_line() We can also look at all countries in the Americas: life_df <- gap_long %>% filter(obs_type == "lifeExp", continent == "Americas") ggplot(life_df, aes(x = year, y = obs_values, color = country)) + geom_line() 7.5 Exercise Using gap_long, calculate and plot the the mean life expectancy for each continent over time from 1982 to 2007. Give your plot a title and assign x and y labels. Hint: use the dplyr::group_by() and dplyr::summarize() functions. STOP: Knit the R Markdown file and sync to Github (pull, stage, commit, push) # solution (no peeking!) gap_long %>% group_by(continent, obs_type) %>% summarize(means = mean(obs_values)) cont <- gap_long %>% filter(obs_type == "lifeExp", year > 1980) %>% group_by(continent, year) %>% summarize(mean_le = mean(obs_values)) ggplot(data = cont, aes(x = year, y = mean_le, color = continent)) + geom_line() + labs(title = "Mean life expectancy", x = "Year", y = "Age (years)") ## Additional customization ggplot(data = cont, aes(x = year, y = mean_le, color = continent)) + geom_line() + labs(title = "Mean life expectancy", x = "Year", y = "Age (years)", color = "Continent") + theme_classic() + scale_fill_brewer(palette = "Blues") 7.6 spread() The function spread() is used to transform data from long to intermediate format Alright! Now just to double-check our work, let’s use the opposite of gather() to spread our observation variables back to the original format with the aptly named spread(). You pass spread() the key and value pair, which is now obs_type and obs_values. gap_normal <- gap_long %>% spread(obs_type, obs_values) No warning messages is good…but still let’s check: dim(gap_normal) dim(gapminder) names(gap_normal) names(gapminder) Now we’ve got an intermediate dataframe gap_normal with the same dimensions as the original gapminder. 7.6 Exercise Convert “gap_long” all the way back to gap_wide. Hint: you’ll need to create appropriate labels for all our new variables (time*metric combinations) with the opposite of separate: tidyr::unite(). Knit the R Markdown file and sync to Github (pull, stage, commit, push) 7.6.1 Answer (no peeking) head(gap_long) # remember the columns gap_wide_new <- gap_long %>% # first unite obs_type and year into a new column called var_names. Separate by _ unite(col = var_names, obs_type, year, sep = "_") %>% # then spread var_names out by key-value pair. spread(key = var_names, value = obs_values) str(gap_wide_new) 7.7 clean up and save your .Rmd Spend some time cleaning up and saving gapminder-wrangle.Rmd Restart R. In RStudio, use Session > Restart R. Otherwise, quit R with q() and re-launch it. This morning’s .Rmd could look something like this: ## load tidyr (in tidyverse) library(tidyverse) # install.packages("tidyverse") ## load wide data gap_wide <- read.csv('https://raw.githubusercontent.com/OHI-Science/data-science-training/master/data/gapminder_wide.csv') head(gap_wide) str(gap_wide) ## practice tidyr::gather() wide to long gap_long <- gap_wide %>% gather(key = obstype_year, value = obs_values, -continent, -country) # or gap_long <- gap_wide %>% gather(key = obstype_year, value = obs_values, dplyr::starts_with('pop'), dplyr::starts_with('lifeExp'), dplyr::starts_with('gdpPercap')) ## gather() and separate() to create our original gapminder gap_long <- gap_wide %>% gather(key = obstype_year, value = obs_values, -continent, -country) %>% separate(obstype_year, into = c('obs_type','year'), sep="_") ## practice: can still do calculations in long format gap_long %>% group_by(continent, obs_type) %>% summarize(means = mean(obs_values)) ## spread() from normal to wide gap_normal <- gap_long %>% spread(obs_type, obs_values) %>% select(country, continent, year, lifeExp, pop, gdpPercap) ## check that all.equal() all.equal(gap_normal,gapminder) ## unite() and spread(): convert gap_long to gap_wide head(gap_long) # remember the columns gap_wide_new <- gap_long %>% # first unite obs_type and year into a new column called var_names. Separate by _ unite(col = var_names, obs_type, year, sep = "_") %>% # then spread var_names out by key-value pair. spread(key = var_names, value = obs_values) str(gap_wide_new) 7.7.1 complete() One of the coolest functions in tidyr is the function complete(). Jarrett Byrnes has written up a great blog piece showcasing the utility of this function so I’m going to use that example here. We’ll start with an example dataframe where the data recorder enters the Abundance of two species of kelp, Saccharina and Agarum in the years 1999, 2000 and 2004. kelpdf <- data.frame( Year = c(1999, 2000, 2004, 1999, 2004), Taxon = c("Saccharina", "Saccharina", "Saccharina", "Agarum", "Agarum"), Abundance = c(4,5,2,1,8) ) kelpdf Jarrett points out that Agarum is not listed for the year 2000. Does this mean it wasn’t observed (Abundance = 0) or that it wasn’t recorded (Abundance = NA)? Only the person who recorded the data knows, but let’s assume that the this means the Abundance was 0 for that year. We can use the complete() function to make our dataset more complete. kelpdf %>% complete(Year, Taxon) This gives us an NA for Agarum in 2000, but we want it to be a 0 instead. We can use the fill argument to assign the fill value. kelpdf %>% complete(Year, Taxon, fill = list(Abundance = 0)) Now we have what we want. Let’s assume that all years between 1999 and 2004 that aren’t listed should actually be assigned a value of 0. We can use the full_seq() function from tidyr to fill out our dataset with all years 1999-2004 and assign Abundance values of 0 to those years & species for which there was no observation. kelpdf %>% complete(Year = full_seq(Year, period = 1), Taxon, fill = list(Abundance = 0)) 7.8 Other links Tidying up Data - Env Info - Rmd Data wrangling with dplyr and tidyr - Tyler Clavelle & Dan Ovando - Rmd "], diff --git a/docs/tidyr.html b/docs/tidyr.html index 9a3ec2d..8afebc2 100644 --- a/docs/tidyr.html +++ b/docs/tidyr.html @@ -7,7 +7,7 @@ Introduction to Open Data Science - + @@ -393,19 +393,19 @@

    7.2 tidyr basics

    In the long format, you usually have 1 column for the observed variable and the other columns are ID variables. The mpg dataset is an example of a long dataset with each row representing a single car and each column representing a variable of that car such as manufacturer and year.

    mpg
    ## # A tibble: 234 x 11
    -##    manufacturer model    displ  year   cyl trans   drv     cty   hwy fl   
    -##    <chr>        <chr>    <dbl> <int> <int> <chr>   <chr> <int> <int> <chr>
    -##  1 audi         a4        1.80  1999     4 auto(l… f        18    29 p    
    -##  2 audi         a4        1.80  1999     4 manual… f        21    29 p    
    -##  3 audi         a4        2.00  2008     4 manual… f        20    31 p    
    -##  4 audi         a4        2.00  2008     4 auto(a… f        21    30 p    
    -##  5 audi         a4        2.80  1999     6 auto(l… f        16    26 p    
    -##  6 audi         a4        2.80  1999     6 manual… f        18    26 p    
    -##  7 audi         a4        3.10  2008     6 auto(a… f        18    27 p    
    -##  8 audi         a4 quat…  1.80  1999     4 manual… 4        18    26 p    
    -##  9 audi         a4 quat…  1.80  1999     4 auto(l… 4        16    25 p    
    -## 10 audi         a4 quat…  2.00  2008     4 manual… 4        20    28 p    
    -## # ... with 224 more rows, and 1 more variable: class <chr>
    +## manufacturer model displ year cyl trans drv cty hwy +## <chr> <chr> <dbl> <int> <int> <chr> <chr> <int> <int> +## 1 audi a4 1.8 1999 4 auto(l5) f 18 29 +## 2 audi a4 1.8 1999 4 manual(m5) f 21 29 +## 3 audi a4 2.0 2008 4 manual(m6) f 20 31 +## 4 audi a4 2.0 2008 4 auto(av) f 21 30 +## 5 audi a4 2.8 1999 6 auto(l5) f 16 26 +## 6 audi a4 2.8 1999 6 manual(m5) f 18 26 +## 7 audi a4 3.1 2008 6 auto(av) f 18 27 +## 8 audi a4 quattro 1.8 1999 4 manual(m5) 4 18 26 +## 9 audi a4 quattro 1.8 1999 4 auto(l5) 4 16 25 +## 10 audi a4 quattro 2.0 2008 4 manual(m6) 4 20 28 +## # ... with 224 more rows, and 2 more variables: fl <chr>, class <chr>


    These different data formats mainly affect readability. For humans, the wide format is often more intuitive since we can often see more of the data on the screen due to it’s shape. However, the long format is more machine readable and is closer to the formatting of databases. The ID variables in our dataframes are similar to the fields in a database and observed variables are like the database values.

    Note: Generally, mathematical operations are better in long format, although some plotting functions actually work better with wide format.

    @@ -488,23 +488,23 @@

    7.4 gather() data fr
    head(gap_long)
    ## # A tibble: 6 x 2
     ##   obstype_year obs_values
    -##   <chr>        <chr>     
    -## 1 continent    Africa    
    -## 2 continent    Africa    
    -## 3 continent    Africa    
    -## 4 continent    Africa    
    -## 5 continent    Africa    
    -## 6 continent    Africa
    +## <chr> <chr> +## 1 continent Africa +## 2 continent Africa +## 3 continent Africa +## 4 continent Africa +## 5 continent Africa +## 6 continent Africa
    tail(gap_long)
    ## # A tibble: 6 x 2
     ##   obstype_year obs_values
    -##   <chr>        <chr>     
    -## 1 pop_2007     9031088   
    -## 2 pop_2007     7554661   
    -## 3 pop_2007     71158647  
    -## 4 pop_2007     60776238  
    -## 5 pop_2007     20434176  
    -## 6 pop_2007     4115771
    +## <chr> <chr> +## 1 pop_2007 9031088 +## 2 pop_2007 7554661 +## 3 pop_2007 71158647 +## 4 pop_2007 60776238 +## 5 pop_2007 20434176 +## 6 pop_2007 4115771

    We have reshaped our dataframe but this new format isn’t really what we wanted.

    What went wrong? Notice that it didn’t know that we wanted to keep continent and country untouched; we need to give it more information about which columns we want reshaped. We can do this in several ways.

    One way is to identify the columns is by name. Listing them explicitly can be a good approach if there are just a few. But in our case we have 30 columns. I’m not going to list them out here since there is way too much potential for error if I tried to list gdpPercap_1952, gdpPercap_1957, gdpPercap_1962 and so on. But we could use some of dplyr’s awesome helper functions — because we expect that there is a better way to do this!

    @@ -549,24 +549,24 @@

    7.4 gather() data fr ## $ obs_values: num 2449 3521 1063 851 543 ...
    head(gap_long)
    ## # A tibble: 6 x 5
    -##   continent country      obs_type   year obs_values
    -##   <chr>     <chr>        <chr>     <int>      <dbl>
    -## 1 Africa    Algeria      gdpPercap  1952      2449.
    -## 2 Africa    Angola       gdpPercap  1952      3521.
    -## 3 Africa    Benin        gdpPercap  1952      1063.
    -## 4 Africa    Botswana     gdpPercap  1952       851.
    -## 5 Africa    Burkina Faso gdpPercap  1952       543.
    -## 6 Africa    Burundi      gdpPercap  1952       339.
    +## continent country obs_type year obs_values +## <chr> <chr> <chr> <int> <dbl> +## 1 Africa Algeria gdpPercap 1952 2449 +## 2 Africa Angola gdpPercap 1952 3521 +## 3 Africa Benin gdpPercap 1952 1063 +## 4 Africa Botswana gdpPercap 1952 851 +## 5 Africa Burkina Faso gdpPercap 1952 543 +## 6 Africa Burundi gdpPercap 1952 339
    tail(gap_long)
    ## # A tibble: 6 x 5
    -##   continent country        obs_type  year obs_values
    -##   <chr>     <chr>          <chr>    <int>      <dbl>
    -## 1 Europe    Sweden         pop       2007   9031088.
    -## 2 Europe    Switzerland    pop       2007   7554661.
    -## 3 Europe    Turkey         pop       2007  71158647.
    -## 4 Europe    United Kingdom pop       2007  60776238.
    -## 5 Oceania   Australia      pop       2007  20434176.
    -## 6 Oceania   New Zealand    pop       2007   4115771.
    +## continent country obs_type year obs_values +## <chr> <chr> <chr> <int> <dbl> +## 1 Europe Sweden pop 2007 9031088 +## 2 Europe Switzerland pop 2007 7554661 +## 3 Europe Turkey pop 2007 71158647 +## 4 Europe United Kingdom pop 2007 60776238 +## 5 Oceania Australia pop 2007 20434176 +## 6 Oceania New Zealand pop 2007 4115771

    Excellent. This is long format: every row is a unique observation. Yay!

    @@ -771,11 +771,10 @@

    7.8 Other links

    "facebook": true, "twitter": true, "google": false, -"linkedin": false, "weibo": false, "instapper": false, "vk": false, -"all": ["facebook", "google", "twitter", "linkedin", "weibo", "instapaper"] +"all": ["facebook", "google", "twitter", "weibo", "instapaper"] }, "fontsettings": { "theme": "white",