---
title: "Derived Variables"
author: "JJB + Course"
date: "09/10/2018"
output:
   html_document:
     toc: true
     toc_float:
       collapse: false
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

## Example: Blood Pressure

Data frame containing the blood pressure data

```{r construct-bp-data}
## Construct BP data
bp_data = data.frame(
  Subject_ID = c("S005", "S130", "S023", "S098", "S035", "S007", "S104"),
  Sex        = c("Male", "Female", "Male", "Male", "Male", "Female", "Female"),
  Systolic   = c(110, 141, 125, 168, 115, 122, 135)
)

## View data.frame
bp_data
```


```{r augment-data-frame-with-type}
## Add column to data.frame
bp_data$BP_Type = c("Normal", "Stage 2", "Elevated", "Stage 2", "Normal", 
                    "Elevated", "Stage 1")
```

## Example: Logical Values

```{r}
# Values equivalent to TRUE
TRUE
T
1L

# Values equivalent to FALSE
FALSE
F
0L
```


## Example: Performing Comparisons

```{r comparisons}
42 == 42             # Is 42 equal to 42? Yes or No?

42 != 32             # Is 42 not equal to 32? Yes or No?

12 < 38              # Is 12 less than 38? Yes or No?

12 > 38              # Is 12 greater than 38? Yes or No?

38 > 38              # Is 38 greater than 38? Yes or No?

38 >= 38             # Is 38 greater than or equal to 38? Yes or No?

c(3, 2, 1, -5) > 2   # Are values greater than 2? Yes or No?
```


### Example: Vectorized Comparison

```{r ex-block-comparison}
# Comparison of vectors
c(11, -3, 1, 2) >= c(5, -2, 9, 42)

# Comparison of vector
# to a single element
c(3, 2, 1, -5) < 2
```

### Example: Set Comparison

"Needle in the Haystack" problems

```{r}
2 %in% c(3, 2, 1, -5)  # Does 2 belong to any values? Yes or No?

2 %in% c(3, 1, -5)      # Does 2 belong to any values? Yes or No?

c(3, 1, -5) %in% 2      # Are elements in the vector equal to 2?
```

### Example: Comparison


```{r ex-single-comparsion}
x = c(51, 38, 42, -3)

x == 38

x != 38

x < 38

x > 38

x <= 38
x >= 38

x %in% 38
```


### Exercise: Comparison

```{r ex-single-comparsion}
x = c(1,2,3,4)

x == 2

x != 2

x < 2

x > 2

x <= 2
x >= 2

x %in% 2
```


```{r ex-vectorization-comparsion}
x = c(1,2,3,4)
y = c(-1, 2, 6, 0)

x == y

x != y

x < y

x > y

x <= y
x >= y

x %in% y
```


```{r}
x = c(0, 0.5, 1.0, 1.5, 2.0)

y = 3*x - 2

y

x

x < 2

y 
y == 1

!(x < 2 | y == 1)

```

## Example: Logical Subsets

```{r logic-subset}
ex_vec = c(5, 3, -2, 42)
ex_vec[c(TRUE, FALSE, TRUE, TRUE)]
```

## Example: Filtering Observations

```{r logic-subset}
ex_vec = c(5, 3, -2, 42)
select_indices = ex_vec < 4    # Are values less than 4?
ex_vec[select_indices]         # Retrieve all values less than 4
```

## Exercise: Filter Weights

Change the following piece of code to retrieve subjects whose weight is **more than** 240 
```{r weight-filter}
weights = c(150, 220, 332, 250, 244, 185)

## Change this line from
# weights[weights < 180]
```

## Example: if-else bank account

```{r if-bank-acct}

prob_opening_savings_acct = 0.91 # about 91%

if( prob_opening_savings_acct > 0.80) {
  message("Target this user!")
} else {
  message("Save our money and don't bother sending flyers.")
}

```



## Example: if-else

```{r example-if-else}
x = -2L

if(x < 0L) {
  -1 * x
} else {
  x
}
```

What happens if `x` is positive? negative? 0? 

## Example: Classifying

Determining `x` by comparing it against pre-set values. 

```{r example-classify}
x = "Jerry"
if ( x != "Jerry" & x != "Elaine" & x != "George") { 
  message("Soup for you!")
} else { 
  message("No soup for you!")
}
```

An alternative way to write the above if. 

```{r example-classify-in}
if ( !(x %in% c("Jerry", "Elaine", "George")) ) { 
  message("Soup for you!")
} else { 
  message("No soup for you!")
}
```

### Exercise: Determining parity of number

Using the modulus operator, determine whether `x` is odd or even. 

Output using the `message()` function:

- "x is even"
- "x is odd"

```{r ex-if-number-parity}
x = 1

# 1 modulus 2
1 %% 2

# 2 modulus 2
2 %% 2

3 %% 2

4 %% 2

```

```{r}

x = 10

if(x %% 2 == 0) {
  message("x is even!")
} else {
  message("x is odd!") 
}

is_odd = function(x) {
  
  if(x %% 2 == 0) {
    message("x is even!")
    output = FALSE
  } else {
    message("x is odd!")
    output = TRUE
  }
  
  return(output)
}

is_odd(10)

```



## Example: if-else-if-else Absolute Value

```{r}
if ( x < 0 ) { 
  -1 * x
} else if( x == 0 ) {
  0
} else { 
  x
}
```


## Example: if-else-if-else Discriminant

```{r}
a = 3; b = 2; c = -1
discriminant = b^2 - 4*a*c 

if ( discriminant > 0 ) { 
  message("two real roots")
} else if( discriminant == 0 ) {
  message("one real root")
} else { 
  message("two imaginary roots")
}
```

### Exercise: Grade Scale

Write an if-else if-else statement for the grade scale.

```{r ex-grade-scale}
grade_pct = 82


```


## Example: Classifying Temperature

```{r}

temperature = c(92, 93, 81, 70, 68)

temperature > 76

ifelse(temperature > 76, "hot", "cold")

```

```{r}

# Only one value is allowed in the conditional statement

if(temperature > 76) {
  "hot"
} else {
  "cold"
}

# Checking a vector inside of a _regular_ if
# will be equivalent to looking at only the
# first element.

temperature[1] > 76

```

```{r}

temperature > 76

# any - is checking for at least one TRUE
# e.g. OR
any(temperature > 76)

# all - is checking for EVERYTHING being equal to TRUE
# e.g. AND

all(temperature > 76)

all(temperature > 67)

temperature > 67

```



## Example: Vectorized If-Else

```{r vectorized-bp}
bp_data$BP_Type = ifelse(bp_data$Systolic < 120 , "Normal",
                         ifelse( bp_data$Systolic < 129, "Elevated",
                                ifelse( bp_data$Systolic < 139, "Stage 1",
                                        "Stage 2")
                                )
                        )
```


## Exercise: Recoding "M" and "F"

```{r re-code-ifelse}
x = c("M", "M", "F", "M", "F", "F")
x

```

## Example: Switch with recoding values

```{r}
x = c("M", "M", "F", "M", "F", "F")
x

switch(x[1],
       "M" = "Male", 
       "F" = "Female")
```


## Exercise: Switch to determine OS

```{r os-switch}
sys_name = Sys.info()[["sysname"]]

### Your code here... 

```


## Example: Vector Subsets

```{r examples-my-vec}
# Create a vector
my_vec = c(6.1, 5.5, 5.2, 5.9)

# Retrieve _all_ data
my_vec[]

# First observation
my_vec[1]

# Remove the second observation:
my_vec[-2]

# Keep only the first two observations with integers:
my_vec[c(1, 2)]

# Keep only the first two observations with logicals:
my_vec[c(TRUE, TRUE, FALSE, FALSE)]

# Out of Bounds gives missingness
my_vec[5]

# Name our vectors
names(my_vec) = c("Billy", "Angela", "Melissa", "Trevor")

# Notice names appear
my_vec

# Extract Melissa's contents
my_vec["Melissa"]
```
