-
Notifications
You must be signed in to change notification settings - Fork 3
/
crash-course.qmd
491 lines (317 loc) · 29.1 KB
/
crash-course.qmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
```{r}
i <- 1
chapter_number <- 1
source("_common.R")
```
# An R Programming Crash Course {#sec-crash-course-chapter}
R has a well-earned reputation for being hard to learn, especially for those who come to it without prior programming experience. This chapter is designed to help anyone who has never used R before. You’ll set up an R programming environment with RStudio and learn how to use functions, objects, packages, and projects to work with data. You’ll also be introduced to the tidyverse package, which contains the core data analysis and manipulation functions used in this book. This chapter won’t provide a complete introduction to R programming; rather, it will focus on the knowledge you need to follow along with the rest of the book. If you have prior experience with R, feel free to skip ahead to @sec-data-viz-chapter.
## Setting Up
You’ll need two pieces of software to use R effectively. The first is R itself, which provides the underlying computational tools that make the language work. The second is an *integrated development environment (IDE)* like RStudio. This coding platform simplifies working with R. The best way to understand the relationship between R and RStudio is with this analogy from Chester Ismay and Albert Kim’s book *Statistical Inference via Data Science: A Modern Dive into R and the Tidyverse*: R is the engine that powers your data, and RStudio is like the dashboard that provides a user-friendly interface.
### Installing R and RStudio
To download R, go to <https://cloud.r-project.org> and choose the link for your operating system. Once you’ve installed it, open the file. This should open an interface, like the one shown in @fig-r-console, that lets you work with R on your operating system’s command line. For example, enter `2 + 2`, and you should see `4`.
```{r}
#| results: asis
print_nostarch_file_name(file_type_to_print = "png")
```
![The R console](assets/r-console.png){#fig-r-console}
```{r}
#| results: asis
save_image_for_nostarch(here::here("assets/r-console.png"))
```
A few brave souls work with R using only this command line, but most opt to use RStudio, which provides a way to see your files, the output of your code, and more. You can download RStudio at <https://posit.co/download/rstudio-desktop/>. Install RStudio as you would any other app and open it.
### Exploring the RStudio Interface
The first time you open RStudio, you should see the three panes shown in @fig-rstudio-no-project.
```{r}
#| results: asis
print_nostarch_file_name(file_type_to_print = "png")
```
![The RStudio editor](assets/rstudio-no-project.png){#fig-rstudio-no-project}
```{r}
#| results: asis
save_image_for_nostarch(here::here("assets/rstudio-no-project.png"))
```
The left pane should look familiar. It’s similar to the screen you saw when working in R on the command line. This is known as the console. You’ll use it to enter code and see the results. This pane has several tabs, such as `Terminal` and `Background Jobs`, for more advanced uses. For now, you’ll stick to the default tab.
At the bottom right, the files pane shows all of the files on your computer. You can click any file to open it within RStudio. Finally, at the top right is the environment pane, which shows the objects that are available to you when working in RStudio. Objects are discussed in “Saving Data as Objects” on page 11.
There is one more pane that you’ll typically use when working in RStudio, but to see it, first you need to create an R script file.
## R Script Files
If you write all of your code in the console, you won’t have any record of it. Say you sit down today and import your data, analyze it, and then make some graphs. If you run these operations in the console, you’ll have to re-create that code from scratch tomorrow. But if you write your code in files instead, you can run it multiple times.
R script files, which use the .R extension, save your code so you can run it later. To create an R script file, go to *File > New File > R Script*, and
the script file pane should appear in the top left of RStudio, as shown in @fig-rstudio-four-panels. Save this file in your Documents folder as `sample-code.R`.
```{r}
#| results: asis
print_nostarch_file_name(file_type_to_print = "png")
```
![The script file pane (top left)](assets/rstudio-four-panels.png){#fig-rstudio-four-panels}
```{r}
#| results: asis
save_image_for_nostarch(here::here("assets/rstudio-four-panels.png"))
```
Now you can enter R code into the new pane to add it to your script file. For example, try entering `2 + 2` in the script file pane to perform a simple addition operation.
To run a script file, click Run or use the keyboard shortcut `command-enter` on macOS or `ctrl-enter` on Windows. The result (4, in this case) should show up in the console pane.
You now have a working programming environment. Next you’ll use it to write some simple R code.
## Basic R Syntax
If you’re trying to learn R, you probably want to perform more complex operations than `2 + 2`, but understanding the fundamentals will prepare you to do more serious data analysis tasks later in this chapter. Let’s cover some of these basics.
### Arithmetic Operators
Besides `+`, R supports the common arithmetic operators `-` for subtraction, `*` for multiplication, and `/` for division. Try entering the following in the console:
```{r}
#| echo: true
2 - 1
```
```{r}
#| echo: true
3 * 3
```
```{r}
#| echo: true
16 / 4
```
As you can see, R returns the result of each calculation you enter. You don’t have to add the spaces around operators as shown here, but doing so makes your code much more readable.
You can also use parentheses to perform multiple operations at once and see their result. The parentheses specify the order in which R will evaluate the expression. Try running the following:
```{r}
#| echo: true
2 * (2 + 1)
```
This code first evaluates the expression within the parentheses, `2 + 1`, before multiplying the result by 2 in order to get 6.
R also has more advanced arithmetic operators, such as ** to calculate exponents:
```{r}
2**3
```
This is equivalent to 2^3^, which returns 8.
To get the remainder of a division operation, you can use the `%%` operator:
```{r}
#| echo: true
10 %% 3
```
Dividing 10 by 3 produces a remainder of 1, the value R returns.
You won’t need to use these advanced arithmetic operators for the activities in this book, but they’re good to know nonetheless.
### Comparison Operators
R also uses *comparison operators*, which let you test how one value compares to another. R will return either `TRUE` or `FALSE`. For example, enter `2 > 1` in the console:
```{r}
#| echo: true
2 > 1
```
R should return `TRUE`, because 2 is greater than 1.
Other common comparison operators include less than (`<`), greater than or equal to (`>=`), less than or equal to (`<=`), equal to (`==`), and not equal to (`!=`). Here are some examples:
```{r}
#| echo: true
498 == 498
```
```{r}
#| echo: true
2 != 2
```
When you enter `498 == 498` in the console, R should return `TRUE` because the two values are equal. If you run `2 != 2` in the console, R should return `FALSE` because 2 does not *not* equal 2.
You’ll rarely use comparison operators to directly test how one value compares to another; instead, you’ll use them to perform tasks like keeping only data where a value is greater than a certain threshold. You’ll see comparison operators used in this way in “tidyverse Functions” (@sec-tidyverse-functions).
### Functions
You can perform even more useful operations by making use of R’s many *functions*, predefined sections of code that let you efficiently do specific things. Functions have a name and a set of parentheses containing *arguments*, which are values that affect the function’s behavior.
Consider the `print()` function, which displays information:
```{r}
#| echo: true
print(x = 1.1)
```
The name of the `print()` function is `print`. Within the function’s parentheses, you specify the argument name – `x`, in this case — followed by the equal sign (`=`) and a value for the function to display. This code will print the number `1.1`.
To separate multiple arguments, you use commas. For example, you can use the `print()` function’s digits argument to indicate how many digits of a number to display:
```{r}
#| echo: true
print(x = 1.1, digits = 1)
```
This code will display only one digit (in other words, a whole number).
Using these two arguments allows you to do something specific (display results) while also giving you the flexibility to change the function’s behavior.
::: {.callout-tip}
## Note
For a list of all functions built into R, see <https://stat.ethz.ch/R-manual/R-devel/library/base/html/00Index.html>.
:::
A common R pattern is using a function within a function. For example, if you wanted to calculate the *mean*, or average, of the values 10, 20, and 30, you could use the `mean()` function to operate on the result of the `c()` function like so:
```{r}
#| echo: true
mean(x = c(10, 20, 30))
```
The `c()` function combines multiple values into one, which is necessary because the `mean()` function accepts only one argument. This is why the code has two matching sets of open and close parentheses: one for `mean()` and a nested one for `c()`.
The value after the equal sign in this example, `c(10, 20, 30)`, tells R to use the values 10, 20, and 30 to calculate the mean. Running this code in the console returns the value `20`.
The functions `median()` and `mode()` work with `c()` in the same way. To learn how to use a function and what arguments it accepts, enter `?` followed by the function’s name in the console to see the function’s help file.
Next, let’s look at how to import data for your R programs to work with.
## Working with Data
R lets you do all of the same data manipulation tasks you might perform in a tool like Excel, such as calculating averages or totals. Conceptually, however, working with data in R is very different from working with Excel, where your data and analysis code live in the same place: a spreadsheet. While the data you work with in R might look similar to the data you work with in Excel, it typically comes from some external file, so you have to run code to import it.
### Importing Data
You’ll import data from a `comma-separated values` (CSV) file, a text file that holds a series of related values separated by commas. You can open CSV files using most spreadsheet applications, which use columns rather than commas as separators. For example, @fig-population-by-state-csv shows the `population-by-state.csv` file in Excel.
```{r}
#| results: asis
print_nostarch_file_name(file_type_to_print = "png")
```
![The population-by-state.csv file in Excel](assets/population-by-state-csv.png){#fig-population-by-state-csv}
```{r}
#| results: asis
save_image_for_nostarch(here::here("assets/population-by-state-csv.png"))
```
To work with this file in R, download it from <https://data.rfortherestofus.com/population-by-state.csv>. Save it to a location on your computer, such as your *Documents* folder.
Next, to import the file into R, add a line like the following to the `sample-code.R` file you created earlier in this chapter, replacing my filepath with the path to the file’s location on your system:
```{r}
#| eval: false
#| echo: true
read.csv(file = "/Users/davidkeyes/Documents/population-by-state.csv")
```
The file argument in the `read.csv()` function specifies the path to the file to open.
The `read.csv()` function can accept additional optional arguments, separated by commas. For example, the following line uses the `skip` argument in addition to file to import the same file but skip the first row:
```{r}
#| eval: false
#| echo: true
read.csv(
file = "/Users/davidkeyes/Documents/population-by-state.csv",
skip = 1
)
```
To learn about additional arguments for this function, enter `?read.csv()` in the console to see its help file.
At this point, you can run the code to import your data (without the `skip` argument). Highlight the line you want to run in the script file pane in RStudio and click **Run**. You should see the following output in the console pane:
```{r}
#| eval: true
#| echo: false
read.csv("data/population-by-state.csv")
```
This is R’s way of confirming that it imported the CSV file and understands the data within it. Four variables show each state’s rank (in terms of population size), name, current population, population growth between the `Pop` and `Pop2018` variables (expressed as a percentage), and 2018 population. Several other variables are hidden in the output, but you’ll see them if you import this CSV file yourself.
You might think you’re ready to work with your data now, but all you’ve really done at this point is display the result of running the code that imports the data. To actually use the data, you need to save it to an object.
### Saving Data as Objects
To save your data for reuse, you need to create an object. For the purposes of this discussion, an object is a data structure that is stored for later use. To create an object, update your data-importing syntax so it looks like this:
Now this line of code contains the `<-` *assignment operator*, which takes what follows it and assigns it to the item on the left. To the left of the assignment operator is the `population_data` object. Put together, the whole line imports the CSV file and assigns it to an object called `population_data`.
When you run this code, you should see `population_data` in your environment pane, as shown in @fig-population-data-environment.
```{r}
#| results: asis
print_nostarch_file_name(file_type_to_print = "png")
```
![The population_data object in the environment pane](assets/population-data-environment.png){#fig-population-data-environment}
```{r}
#| results: asis
save_image_for_nostarch(here::here("assets/population-data-environment.png"))
```
This message confirms that your data import worked and that the `population_data` object is ready for future use. Now, instead of having to rerun the code to import the data, you can simply enter `population_data` in an R script file or in the console to output the data.
Data imported to an object in this way is known as a data frame. You can see that the `population_data` data frame has 52 observations and 9 variables. *Variables* are the data frame’s columns, each of which represents some value (for example, the population of each state). As you’ll see throughout the book, you can add new variables or modify existing ones using R code. The 52 observations come from the 50 states, as well as the District of Columbia and Puerto Rico.
```{r}
#| eval: false
#| echo: true
population_data <- read.csv(file = "/Users/davidkeyes/Documents/population-by-state.csv")
```
### Installing Packages
The `read.csv()` function you’ve been using, as well as the `mean()` and `c()` functions you saw earlier, comes from *base* R, the set of built-in R functions. To use base R functions, you simply enter their names. However, one of the benefits of R being an open source language is that anyone can create their own code and share it with others. R users around the world make R *packages*, which provide custom functions to accomplish specific goals.
The best analogy for understanding packages also comes from the book *Statistical Inference via Data Science*. The functionality in base R is like the features built into a smartphone. A smartphone can do a lot on its own, but you usually want to install additional apps for specific tasks. Packages are like apps, giving you functionality beyond what’s built into base R. In @sec-packages-chapter, you’ll create your own R package.
You can install packages using the `install.packages()` function. You’ll be working with the tidyverse package, which provides a range of functions for data import, cleaning, analysis, visualization, and more. To install it, enter `install.packages("tidyverse")`. Typically, you’ll enter package installation code in the console rather than in a script file because you need to install a package only once on your computer to access its code in the future.
To confirm that the tidyverse package has been installed correctly, click the **Packages** tab on the bottom-right pane in RStudio. Search for `tidyverse`, and you should see it pop up.
Now that you’ve installed the tidyverse, you’ll put it to use. Although you need to install packages only once per computer, you need to *load* them each time you restart RStudio. Return to the `sample-code.R` file and reimport your data using a function from the tidyverse package (your filepath will look slightly different):
```{r}
#| eval: false
#| echo: true
library(tidyverse)
population_data_2 <- read_csv(file = "/Users/davidkeyes/Documents/population-by-state.csv")
```
At the top of the script, the line `library(tidyverse)` loads the `tidyverse` package. Then, the package’s `read_csv()` function imports the data. Note the underscore (`_`) in place of the period (`.`) in the function’s name; this differs from the base R function you used earlier. Using `read_csv()` to import CSV files achieves the same goal of creating an object, however — in this case, one called `population_data_2`. Enter `population_data_2` in the console, and you should see this output:
```{r}
#| eval: true
#| echo: true
population_data_2 <- read_csv(file = "data/population-by-state.csv")
population_data_2
```
This data looks slightly different from the data you generated using the `read.csv()` function. For example, R shows only the first 10 rows. This variation occurs because `read_csv(`) imports the data not as a data frame but as a data type called a *tibble*. Both data frames and tibbles are used to describe rectangular data like what you would see in a spreadsheet. There are some minor differences between data frames and tibbles, the most important of which is that tibbles print only the first 10 rows by default, while data frames print all rows. For the purposes of this book, the two terms are used interchangeably.
## RStudio Projects
So far, you’ve imported a CSV file from your `Documents` folder. But because others won’t have this exact location on their computer, your code won’t work if they try to run it. One solution to this problem is an RStudio project.
By working in a project, you can use *relative paths* to your files instead of having to write the entire filepath when calling a function to import data. Then, if you place the CSV file in your project, anyone can open it by using the file’s name, as in `read_csv(file = "population-by-state.csv")`. This makes the path easier to write and enables others to use your code.
To create a new RStudio project, go to File New Project. Select either New Directory or Existing Directory and choose where to put your project. If you choose New Directory, you’ll need to specify that you want to create a new project. Next, choose a name for the new directory and where it should live. (Leave the checkboxes that ask about creating a Git repository and using renv unchecked; they’re for more advanced purposes.)
Once you’ve created this project, you should see two major differences in RStudio’s appearance. First, the files pane no longer shows every file on your computer. Instead, it shows only files in the `example-project` directory. Right now, that’s just the `example-project.Rproj` file, which indicates that the folder contains a project. Second, at the top right of RStudio, you can see the name `example-project`. This label previously read `Project: (None)`. If you want to make sure you’re working in a project, check for its name here. @fig-rstudio-active-project.png shows these changes.
```{r}
#| results: asis
print_nostarch_file_name(file_type_to_print = "png")
```
![RStudio with an active project](assets/rstudio-active-project.png){#fig-rstudio-active-project.png}
```{r}
#| results: asis
save_image_for_nostarch(here::here("assets/rstudio-active-project.png"))
```
Now that you’ve created a project, copy the `population-by-state.csv` file into the `example-project` directory. Once you’ve done so, you should see it in the RStudio files pane.
With this CSV file in your project, you can now import it more easily. As before, start by loading the tidyverse package. Then, remove the reference to the `Documents` folder and import your data by simply using the name of the file:
```{r}
#| eval: false
#| echo: true
library(tidyverse)
population_data_2 <- read_csv(file = "population-by-state.csv")
```
The reason you can import the `population-by-state.csv` file this way is that the RStudio project sets the working directory to be the root of your project. With the working directory set like this, all references to files are relative to the `.Rproj` file at the root of the project. Now anyone can run this code because it imports the data from a location that is guaranteed to exist on their computer.
## Data Analysis with the tidyverse
Now that you’ve imported the population data, you’re ready to do a bit of analysis on it. Although I’ve been referring to the `tidyverse` as a single package, it’s actually a collection of packages. We’ll explore several of its functions throughout this book, but this section introduces you to its basic workflow.
### tidyverse Functions {#sec-tidyverse-functions}
Because you’ve loaded the `tidyverse` package, you can now access its functions. For example, the package’s `summarize()` function takes a data frame or tibble and calculates some piece of information for one or more of the variables in that dataset. The following code uses `summarize()` to calculate the mean population of all states:
```{r}
#| eval: false
#| echo: true
summarize(.data = population_data_2, mean_population = mean(Pop))
```
First, the code passes `population_data_2` to the `summarize()` function’s .data argument to tell R to use that data frame to perform the calculation. Next, it creates a new variable called `mean_population` and assigns it to the output of the `mean()` function introduced earlier. The `mean()` function runs on Pop, one of the variables in the `population_data_2` data frame.
You might be wondering why you don’t need to use the c() function within `mean()`, as shown earlier in this chapter. The reason is that you’re passing the function only one argument here: Pop, which contains the set of population data for which you’re calculating the mean. In this case, there’s no need to use `c()` to combine multiple values into one.
Running this code should return a tibble with a single variable (`mean_population`), as shown here:
```{r}
#| echo: false
summarize(.data = population_data_2, mean_population = mean(Pop))
```
The variable is of type double (`dbl`), which is used to hold general numeric data. Other common data types are integer (for whole numbers, such as `4`, `82`, and `915`), character (for text values), and logical (for the `TRUE`/`FALSE` values returned from comparison operations). The `mean_population` variable has a value of `6433422`, the mean population of all states.
Notice also that the `summarize()` function creates a totally new tibble from the original `population_data_2` data frame. This is why the variables from `population_data_2` are no longer present in the output. This is a basic example of data analysis, but you can do a lot more with the tidyverse.
### The tidyverse Pipe
One advantage of working with the tidyverse is that it uses the *pipe* for multi-step operations. The `tidyverse` pipe, which is written as `%>%`, allows you to break steps into multiple lines. For example, you could rewrite your code using the pipe like so:
```{r}
#| eval: false
#| echo: true
population_data_2 %>%
summarize(mean_population = mean(Pop))
```
This code says, “Start with the `population_data_2` data frame, then run the `summarize()` function on it, creating a variable called `mean_population` by calculating the mean of the `Pop` variable.”
Notice that the line following the pipe is indented. To make the code easier to read, RStudio automatically adds two spaces to the start of lines that follow pipes.
The pipe becomes even more useful when you use multiple steps in your data analysis. Say, for example, you want to calculate the mean population of the five largest states. The following code adds a line that uses the `filter()` function, also from the tidyverse package, to include only states where the rank variable is less than or equal to (`<=`) 5. Then, it uses `summarize()` to calculate the mean of those states:
```{r}
#| eval: false
#| echo: true
population_data_2 %>%
filter(rank <= 5) %>%
summarize(mean_population = mean(Pop))
```
Running this code returns the mean population of the five largest states:
```{r}
#| echo: false
population_data_2 %>%
filter(rank <= 5) %>%
summarize(mean_population = mean(Pop))
```
Using the pipe to combine functions lets you refine your data in multiple ways while keeping it readable and easy to understand. Indentation can also make your code more readable. You’ve seen only a few functions for analysis at this point, but the `tidyverse` has many more functions that enable you to do nearly anything you could hope to do with your data. Because of how useful the `tidyverse` is, it will appear in every single piece of R code you write in this book.
::: {.callout-tip}
*R for Data Science, 2nd edition*, by Hadley Wickham, Mine Çetinkaya-Rundel, and Garrett Grolemund is the bible of tidyverse programming and worth reading for more details on how the package’s many functions work.
:::
## Comments
In addition to code, R script files often contain *comments* — lines that begin with hash marks (`#`) and aren’t treated as runnable code but instead as notes for anyone reading the script. For example, you could add a comment to the code from the previous section, like so:
```{r}
#| eval: false
#| echo: true
# Calculate the mean population of the five largest states
population_data_2 %>%
filter(rank <= 5) %>%
summarize(mean_population = mean(Pop))
```
This comment will help others understand what is happening in the code, and it can also serve as a useful reminder for you if you haven’t worked on the code in a while. R knows to ignore any lines that begin with the hash mark instead of trying to run them.
## How to Get Help
Now that you’ve learned the basics of how R works, you’re probably ready to dive in and write some code. When you do, though, you’re going to encounter errors. Being able to get help when you run into issues is a key part of learning to use R successfully. There are two main strategies you can use to get unstuck.
The first is to read the documentation for the functions you use. Remember, to access the documentation for any function, simply enter ? and then the name of the function in the console. In the bottom-right pane in @fig-readcsv-documentation, for example, you can see the result of running `?read.csv`.
```{r}
#| results: asis
print_nostarch_file_name(file_type_to_print = "png")
```
![The documentation for the `read.csv()` function](assets/readcsv-documentation.png){#fig-readcsv-documentation}
```{r}
#| results: asis
save_image_for_nostarch(here::here("assets/readcsv-documentation.png"))
```
Help files can be a bit hard to decipher, but essentially they describe what package the function comes from, what the function does, what arguments it accepts, and some examples of how to use it.
::: {.callout-tip}
For additional guidance on reading documentation, I recommend the appendix of Kieran Healy’s book *Data Visualization: A Practical Introduction*. A free online version is available at <https://socviz.co/appendix.html>.
:::
The second approach is to read the documentation websites associated with many R packages. These can be easier to read than RStudio’s help files. In addition, they often contain longer articles, known as *vignettes*, that provide an overview of how a given package works. Reading these can help you understand how to combine individual functions in the context of a larger project. Every package discussed in this book has a good documentation website.
## Summary
In this chapter, you learned the basics of R programming. You saw how to download and set up R and RStudio, what the various RStudio panes are for, and how R script files work. You also learned how to import CSV files and explore them in R, how to save data as objects, and how to install packages to access additional functions. Then, to make the files used in your code more accessible, you created an RStudio project. Finally, you experimented with `tidyverse` functions and the `tidyverse` pipe, and you learned how to get help when those functions don’t work as expected.
Now that you understand the basics, you’re ready to start using R to work with your data. See you in @sec-data-viz-chapter!
## Additional Resources
- Kieran Healy, *Data Visualization: A Practical Introduction* (Princeton, NJ: Princeton University Press, 2018), <https://socviz.co>.
- Chester Ismay and Albert Y. Kim, *Statistical Inference via Data Science: A ModernDive into R and the Tidyverse* (Boca Raton, FL: CRC Press, 2020), <https://moderndive.com>.
- David Keyes, “Getting Started with R,” online course, accessed November 10, 2023, <https://rfortherestofus.com/courses/getting-started>.
- Hadley Wickham, Mine Çetinkaya-Rundel, and Garrett Grolemund, *R for Data Science, 2nd ed.* (Sebastopol, CA: O’Reilly Media, 2023). <https://r4ds.hadley.nz/>