---
title: "💻 LSE DS202A 2024: Week 01 - Lab"
author: "MY NAME (MY CANDIDATE NUMBER)"
date: 30 September 2024
format: html
self-contained: true
---

# 📋 Lab Tasks

## ⚙️ Setup

If you are reading this on your computer, you have already completed this task!

- [x] Step 1: Install R and RStudio or VSCode
- [x] Step 2: Open RStudio or VS Code
- [x] Step 3: Create a new "project" folder
- [x] Step 4: Download this file 🙃
- [ ] Step 5: Try rendering this document to HTML.

## (Part 3) Reviewing fundamental concepts of R/tidyverse

Tick the boxes as you complete the tasks to feel a sense of accomplishment!

- [ ] Step 1: Creating and manipulating vectors
- [ ] Step 2: Chaining operations with the pipe operator (`%>%`)
- [ ] Step 3: Repeating operations with `for` loops
- [ ] Step 4: Combining operations in functions
- [ ] Step 5: Transforming `for` loops with `sapply`


### Vectors {#sec-vectors}

1. Try the basic vector manipulations from the examples and check that you understand the results.
```{r}

# This is a code chunk. You can use it to write and run R code.
# Once you render the document, the code will be executed and the output will be displayed.

#Creating vectors (chunk 1)

x <- c(22L,30L,42L) #vector of integers
y <- c(6.02214,3.14159,6.674) #vector of numerics
z <- c(FALSE, TRUE, FALSE) #vector of logicals
s <- c("Darth Vader", "Luke Skywalker", "Han Solo") #vector of characters
```

```{r}
#(chunk 2)
#run this chunk after chunk 1 (creation of vectors)
y <- sort(y) # operation to sort the content of y
v <- x^2/2 - y*3 + 5 
w <- mean(y) # computing the mean of y
```

```{r}
#(chunk 3)
a <- c(1:10) #a sequence of numbers from 1 to 10 with an increment of 1
b <- seq(-3,3,by=0.5) #a sequence of numbers from -3 to 3 with an increment of -0.5
```

```{r}
# (chunk 4)
# run this chunk after (chunk 3)
d <- rep(a, times=2)
e <- rep(a, each=2)
```

```{r}
# (chunk 5)
s[2]
s[c(1,3)]
s[-3]
s[3] <- "Princess Leia"
s <- append(s,c("Han Solo","Yoda"))
```

2.  Could you create three vectors:
   - a vector `k` which is a sequence from 8 to 1 (i.e descending order) in increments of 2
   - a vector `m` which contains the content of `k` repeated three times
   - a vector `n` containing three copies of `k`, with a 0 separating each copy from the next one?

```{r}
#write your code to create vector `k` in this chunk
```

```{r}
#write your code to create vector `m` in this chunk
```

```{r}
#write your code to create vector `n` in this chunk
```

3. Can you check whether `m` is equal to `n`?

```{r}
#write your code to check whether vectors `m` and `n` are equal in this chunk
```

4. Note that you should also obtain a warning message because the 2 vectors are not of the same length. How can you check the length of both vectors (i.e `m` and `n`)?

```{r}
#write your code to check the length of vectors `m` and `n` in this chunk
```

5. What will happen in the examples from the code chunk below? Try to guess and confirm your guess by running the code.

```{r}
   num_char <- c(1, 2, 3, "a")
   num_logical <- c(1, 2, 3, TRUE)
   char_logical <- c("a", "b", "c", TRUE)
   tricky <- c(1, 2, 3, "4")
```

6.Suppose the following vector represents flu cases over a given number of weeks: 
   ```{r}
   flu_cases <- c(NA, 1, 0, 0, 3, NA, 3, 3, 61, 411, 2570, 7208)
   ```
   - Could you remove the missing values from the vector?
  
  ```{r}
  #write your code/answer here
  ```

   - How many weeks were the number of cases over 10?

  ```{r}
  #write your code/answer here
  ```

   - Could you compute the mean and standard deviation associated with the number of flu cases?
  
  ```{r}
  #write your code/answer here
  ```

   - Was there a week where the number of cases was equal to 42? And if so, which was it? Same questions with value 3.

  ```{r}
  #write your code/answer here
  ```

  ### Chaining operations with the pipe operator (`%>%`)

  The pipe operator, `%>%`, comes from the `magrittr` package by Stefan Milton Bache. Packages in `tidyverse` load `%>%` automatically, so you don’t usually load `magrittr` explicitly. 

This means that, before we are able to use the pipe operator, we either have to load the `magrittr` library or the `tidyverse` library (we would usually load `tidyverse` if we are going to use other `tidyverse` functions) after having made sure we have `magrittr` and/or `tidyverse` installed.

:::callout-tip
## Note on installing and loading packages in R

How do I install a package in R e.g `tidyverse`?

> Just run `install.packages("tidyverse")` in your R console. This will install all the packages that are part of the `tidyverse` ecosystem. 
>
> DO NOT leave an `install.packages()` command in your .qmd file. Always do this in the R Console. Otherwise, you won't be able to render your markdown file as an HTML later.
>

How do I load a package/library that I have already installed e.g `magrittr`?

>To load `magrittr`, you simply need to execute the call `library(magrittr)` before you use any function that comes from this package (e.g pipe).

>However, in your `.qmd` file, make it a habit to create and dedicate your first chunk of code to loading all the packages you'll use using the `library()` function. While it's true that you may not know all the packages you will need when starting a new file, making the first chunk a reserved space for the task of loading libraries creates a neat, centralised hub. In this lab, since we simply need the pipe operator for now, we would simply load `magrittr` with `library(magrittr)` in that first chunk of code: we can circle back to it if we need to add further libraries. You have to rerun the chunk for the packages to be loaded, every time you add a new `library()` call to the chunk.

:::

It allows you to chain together sequences of operations and has four main advantages:
 
 - you structure the sequence of your data operations from left to right, as apposed to from inside and out;
 - you avoid nested function calls (that was one of the possible solutions to create vector `n` in question 2 in @sec-vectors);
 - you minimize the need for local variables and function definitions
 - you make it easy to add steps anywhere in the sequence of operations

What does it mean in practice?

Let's go back to the flu cases example.

Suppose we want to only look at the first 9 weeks of data, replace the missing values in this subset of data with value 0 and then count how many weeks within the period the number of cases was equal to 0.

We could write the sequence of operations as follows:

```{r}

flu_cases <- c(NA, 1, 0, 0, 3, NA, 3, 3, 61, 411, 2570, 7208)
flu_cases <- flu_cases[1:9]
flu_cases <- replace(flu_cases,is.na(flu_cases),0)
zero_cases <- length(subset(flu_cases,flu_cases==0))
```

Notice the number of assignments and nested function calls.

Alternatively, we could rewrite the sequence with the pipe (`%>%`) operator:

```{r}
zero_cases <- c(NA, 1, 0, 0, 3, NA, 3, 3, 61, 411, 2570, 7208) %>% 
   .[1:9] %>% #in this line and the following . replaces the vector c(NA, 1, 0, 0, 3, NA, 3, 3, 61, 411, 2570, 7208) i.e flu_cases
   replace(is.na(.),0) %>%
   subset(.==0) %>%
   length()
```

In this case, each line performs an operation from the sequence : the pipe is essentially equivalent to an English language 'then'; define this vector *then* take its first nine values *then* replace the missing values within it with the value 0 *then* take the subset of this vector where the value is equal to 0 *then* take the length of the resulting vector (i.e count the number of weeks within the first nine weeks where the number of cases is 0).

For details on pipes, have a look at [this tutorial](https://www.datacamp.com/tutorial/pipe-r-tutorial).

🎯 **ACTION POINTS**

1. Can you re-create vector `n` from question 2 of @sec-vectors using the pipe operator?

```{r}
#write your answer here
```

2. Use the `sample` function to create two vectors (you can choose the vector length) whose values are in the range `[7-42]`. 
   Append both vectors together, then scale the resulting vector before only selecting negative values and getting a count of negative values. Use the pipe operator to write your sequence of operations.

   ```{r}
   #write your answer here
   ```

### `For` loops

Suppose that, for some reasons, you want to print out sentences of the form: "The year is [year]"" where [year] is equal to 2019, 2020, up to 2024. You can do this as follows:

```{r}
print(paste("The year is", 2019))
print(paste("The year is", 2020))
print(paste("The year is", 2021))
print(paste("The year is",2022))
print(paste("The year is", 2023))
print(paste("The year is", 2024))
```

As you quickly see, this is rather tedious since you copy the same code chunk over and over again. Rather than doing this, you could use a `for` loop to write repetitive parts of code.

Using a `for` loop, the code above transforms into:

```{r}
for (year in 2019:2024){
  print(paste("The year is", year))
}
```

The best way to understand this loop is as follows: "For each year that is in the sequence `2019:2024`, you execute the code chunk `print(paste("The year is", year))`". Once the `for` loop has executed the code chunk for every year in the vector (i.e sequence `2019:2024`), the loop stops and goes to the first instruction after the loop block.

🎯 **ACTION POINTS**

9. Suppose you have a new vector of characters:
    
    ```{r}
    t <- c("R2-D2","Chewbacca","Obi-Wan Kenobi")
    ```

    - Could you write code that creates a vector that contains all the Star Wars character names, then, for each name, counts the number of characters, then finds the Star Wars character with longest name? Use a `for` loop in your code.
   ```{r}
   #write your answer here
   ```

    - Could you write code that creates a vector that contains all the Star Wars character names, then, for each name, counts the number of characters and prints out a line of the form "The character name [name of character] is composed of [x] characters" (e.g "The character name Yoda is composed of 4 characters")?

    ```{r}
    #write your answer here
    ```

### Functions

In this lab, we've encountered and used quite a few different pre-made functions in  (e.g `c()`, `replace()`, `subset()`, `sample()`, `rep()`, `length()`), but sometimes you just need to write your own function to tackle your data, i.e your set/succession of (reproducible) instructions.

A function is simply a code block that performs a specific task (which can be more or less complex), e.g as calculating a sum. 

You should think of writing a function whenever you’ve copied and pasted a block of code more than twice.

In R, functions are of the form:

```r
name_of_the_function <- function(arguments) {
function_content
}
```

You give your function a (meaningful) name (`name_of_the_function`
), define your function arguments (`arguments`
) i.e the parameters it needs to perform the task it supposed to perform, and put some content in the function. You define how the function should deal with the input/arguments to perform the task it needs to perform in `function_content`.

Here's, as an example, a very simple function to sum two numbers:

```{r}
sum_twonumbers <- function(number1, number2){
     result <- number1 + number2
     return(result)
     }
```

As expected, you can invoke this function multiple times with different parameters and get different sum results e.g:
```{r}
sum_twonumbers(45,6)
sum_twonumbers(1007888,177999)
sum_twonumbers(42,1337)
```
🎯 **ACTION POINTS**

10. Could you write a function that takes a vector of characters as an input, counts the number of characters for each element of the vector and and prints out a line of the form "The character name [name of character] is composed of [x] characters" (e.g "The character name Yoda is composed of 4 characters")?
```{r}
#write your answer here
```
11. Write `both_na()`, a function that takes two vectors of the same length and returns the number of positions that have an NA in both vectors (hint: create example vectors with NA in them to test your function).
```{r}
#write your answer here
```

### Transforming `for` loops with `sapply`

`for` loops are all well and good and they are rather convenient (and quite easy to grasp and write!). But they're not exactly the most efficient solution (computationally) when it comes to executing repetitive pieces of code. R supports vectorization and vectorized solutions that make use of `apply` functions, such as `lapply` and `sapply` (it's often better to use `sapply` as it outputs a vector and is slightly more efficient) are more efficient than solutions that use loops, in particular `for` loops.

🎯 **ACTION POINTS**

12. Take the `for` loops from question 9 and see if you can rewrite them using the `sapply` function. Consult the R documentation to help you with your task or have a look at [this link](https://r-coder.com/sapply-function-r/).

```{r}
#write your answer here
```