---
title: "Lab 5"
author: "Your Name Here"
output: html_document
---

##### Remember to change the `author: ` field on this Rmd file to your own name.

### Learning objectives

> In today's Lab you will gain practice with the following concepts from Lecture 5:

- Using `apply` and `map` as loop alternatives
- Using the various **`mutate`** commands to manipulate data
- Using the various **`summarize`** commands to produce simple tabular summaries, and interpreting the results

## Problems

```{r}
library(tidyverse)
Cars93 <- as_tibble(MASS::Cars93)  # Pull Cars93 from MASS
```

### 1. map() practice

> Note: This question previously (accidentally) appeared on Lab 4.  Feel free to skip it if you already succeeded on this question in the previous week.

**(a)** The `nlevels` command tells you the number of levels in a factor variable.  Use this function in combination with `summarize_if()` to produce an integer vector showing the number of levels for each factor variables in the Cars93 data.

```{r}
Cars93 %>%
  summarize_if(is.factor, nlevels)
```

**(b)** `levels()` returns the possible levels of a factor variable. Use this function in combination with `select` and `map` to create a list of all the levels of the Manufacturer, AirBags, DriveTrain, and Man.trans.avail variables

```{r}
Cars93 %>%
  select(Manufacturer, AirBags, DriveTrain, Man.trans.avail) %>%
  map(levels)
```


### 2. `mutate()` variants with Cars93

**(a)** Use the `toupper()` command in combination with `mutate_if()` to produce a new version of Cars93 where every factor variable has been converted to upper case.  

```{r}
Cars93 %>%
  mutate_if(is.factor, toupper)
```

**(b)** Currently the price columns of the `Cars93` reflect prices in $1000's of dollars.  Use `mutate_at` to create a version of `Cars93` where all prices are in $'s.  (e.g., what used to be a price of 12.9 should become 12900).  

```{r}
Cars93 %>% 
  mutate_at(vars(contains("Price")), ~ .x * 1000)
```

**(c)** Use `mutate_if` to normalize all of the **numeric** variables in the `Cars93` data to have variance 1.  Save the resulting mutated data in a variable called `Cars93.norm`.  (Hint: this is equivalent to dividing each of the columns by the standard deviation of the given column.)

```{r}
Cars93.norm <- Cars93 %>%
  mutate_if(is.numeric, ~ .x / sd(.x))
```

To check that you've succeeded, you can confirm that the following lines of code all return the answer `1`.

```{r}
var(Cars93.norm$Min.Price)
var(Cars93.norm$Horsepower)
```

### 3. `summarize()` variants

Use `summarize_if` to calculate the standard deviation of every numeric column in the original `Cars93` data.  You'll want to further specify `na.rm = TRUE` to ensure that you get a non-`NA` output value even for variables that have some missing (`NA`) observations.  

```{r}
Cars93 %>%
  summarize_if(is.numeric, sd, na.rm = TRUE)
```
