Chapter 20 Vectors

1 Introduction

2 Vector Basics

Lists can have different length columns but atomic vectors cannot The types of vectors are integers and characters Augmented vectors are vectors that can be created on top of other vectors

3 Important Types of Atomic Vector

logical true or false numeric double - decimal numbers integer character each element is a string

4 Using Atomic Vectors

Coercion explicit implicit Recycling

sample(10) + 10
##  [1] 12 14 19 11 17 13 16 15 18 20
1:10 + 1:2
##  [1]  2  4  4  6  6  8  8 10 10 12
1:10 + 1:3
## Warning in 1:10 + 1:3: longer object length is not a multiple of shorter object
## length
##  [1]  2  4  6  5  7  9  8 10 12 11
data.frame(a = 1:10, b = 1:2)
##     a b
## 1   1 1
## 2   2 2
## 3   3 1
## 4   4 2
## 5   5 1
## 6   6 2
## 7   7 1
## 8   8 2
## 9   9 1
## 10 10 2
# data.frame(a = 1:10, b = 1:3)

Subsetting

x <- sample(10)
x
##  [1]  8  1  2  4 10  3  6  5  9  7
x[c(5, 7)]
## [1] 10  6
x[x>5]
## [1]  8 10  6  9  7

5 Recursive vectors (lists)

3 ways to subset single bracket double bracket dollar sign

a <- list(a = 1:3, b = "a string", c = pi, d = list(-1, -5))
a
## $a
## [1] 1 2 3
## 
## $b
## [1] "a string"
## 
## $c
## [1] 3.141593
## 
## $d
## $d[[1]]
## [1] -1
## 
## $d[[2]]
## [1] -5
a[1:2]
## $a
## [1] 1 2 3
## 
## $b
## [1] "a string"
a[[4]]
## [[1]]
## [1] -1
## 
## [[2]]
## [1] -5
a[[4]][1]
## [[1]]
## [1] -1
a[[4]][[1]]
## [1] -1

6 Attributes

7 Augmented Vectors

They have a class

Chapter 21 Iteration

1 Introduction

Reducing duplication makes your data easier to use Iteration is used to reduce duplication Same operation over multiple columns or data frames Imperative programming - explicit but verbose Functional programming - concise

2 For Loops

# example from the cheat sheet
for (i in 1:4){
    j <- i +10
    print(j)
}
## [1] 11
## [1] 12
## [1] 13
## [1] 14
# example 1: numeric calculation - add 10
x <- 11:15
x
## [1] 11 12 13 14 15
for(i in seq_along(x)){
    j <- x[i] + 10
    print(j)
}
## [1] 21
## [1] 22
## [1] 23
## [1] 24
## [1] 25
# save output
y <- vector("integer", length(x))

for(i in seq_along(x)){
    y[i] <- x[i] + 10
    print(y[i])
}
## [1] 21
## [1] 22
## [1] 23
## [1] 24
## [1] 25
# output
y
## [1] 21 22 23 24 25
# example 2: string operation - extract first letter
x <- c("abc", "xyz")

y <- vector("character", length(x))

for(i in seq_along(x)){
    y[i] <- x[i] %>% str_extract("[a-z]")
    print(y[i])
}
## [1] "a"
## [1] "x"
# output
y
## [1] "a" "x"

3 The Map Functions

# example 1: numeric calculation - add 10
x <- 11:15

y <- vector("integer", length(x))

for(i in seq_along(x)){
    y[i] <- x[i] + 10
    print(y[i])
}
## [1] 21
## [1] 22
## [1] 23
## [1] 24
## [1] 25
# output
y
## [1] 21 22 23 24 25
# using map function
x
## [1] 11 12 13 14 15
map(.x = x, .f = ~.x + 10)
## [[1]]
## [1] 21
## 
## [[2]]
## [1] 22
## 
## [[3]]
## [1] 23
## 
## [[4]]
## [1] 24
## 
## [[5]]
## [1] 25
map_dbl(.x = x, .f = ~.x + 10)
## [1] 21 22 23 24 25
add_10 <- function(x) {x+10}
11 %>% add_10
## [1] 21
map_dbl(.x = x, .f = add_10)
## [1] 21 22 23 24 25

4 Dealing Failure

5 Mapping Over Multiple Arguments