7 Loops and flow control
7.1 Loops with for
- In R the for loop is used perform a task for each element in a set. The syntax is:
- Example:
- Another example:
> M <- matrix(sample(1:12),4,3)
> M
## [,1] [,2] [,3]
## [1,] 3 6 10
## [2,] 1 9 11
## [3,] 2 5 8
## [4,] 12 4 7
>
> for (i in 1:4){
+ for (j in 1:3){
+ print(paste("M(",i,",",j,") =", M[i,j]))
+ }
+ }
## [1] "M( 1 , 1 ) = 3"
## [1] "M( 1 , 2 ) = 6"
## [1] "M( 1 , 3 ) = 10"
## [1] "M( 2 , 1 ) = 1"
## [1] "M( 2 , 2 ) = 9"
## [1] "M( 2 , 3 ) = 11"
## [1] "M( 3 , 1 ) = 2"
## [1] "M( 3 , 2 ) = 5"
## [1] "M( 3 , 3 ) = 8"
## [1] "M( 4 , 1 ) = 12"
## [1] "M( 4 , 2 ) = 4"
## [1] "M( 4 , 3 ) = 7"
7.2 Flow control: if and if else statements
The syntax is:
- Example:
> (x <- sample(1:3))
## [1] 2 3 1
>
> if (x[1] < x[2] & x[2] < x[3]) print("Ordered vector") else
+ print(sort(x))
## [1] 1 2 3
> (x <- 1:3)
## [1] 1 2 3
>
> if (x[1] < x[2] & x[2] < x[3]) print("Ordered vector") else
+ print(sort(x))
## [1] "Ordered vector"
- Another example:
> for(i in 1:3){
+ if (i == 2) print("The index is 2") else
+ print("The index is not 2")
+ }
## [1] "The index is not 2"
## [1] "The index is 2"
## [1] "The index is not 2"
- A shorter version…
7.4 Xapply()
family: a substitute to loops
apply()
takes data frame or matrix as an input and gives output in vector, list or array. Is used to avoid loops.
> (M <- matrix(sample(1:15), 5, 3))
## [,1] [,2] [,3]
## [1,] 7 2 14
## [2,] 13 4 8
## [3,] 1 5 9
## [4,] 15 12 6
## [5,] 3 11 10
>
> apply(M, 1, sum)
## [1] 23 25 15 33 24
> apply(M, 2, sum)
## [1] 39 34 47
>
> apply(M, 1, mean)
## [1] 7.667 8.333 5.000 11.000 8.000
> apply(M, 2, mean)
## [1] 7.8 6.8 9.4
>
> f <- function(x) sqrt(x)
> apply(M, 1, f)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 2.646 3.606 1.000 3.873 1.732
## [2,] 1.414 2.000 2.236 3.464 3.317
## [3,] 3.742 2.828 3.000 2.449 3.162
lapply()
is useful for performing operations on list objects and returns a list object of same length of original set.
> movies <- c("SPIDERMAN","BATMAN","VERTIGO","CHINATOWN")
> (movies_lower <- lapply(movies, tolower))
## [[1]]
## [1] "spiderman"
##
## [[2]]
## [1] "batman"
##
## [[3]]
## [1] "vertigo"
##
## [[4]]
## [1] "chinatown"
> str(movies_lower) # output is a list
## List of 4
## $ : chr "spiderman"
## $ : chr "batman"
## $ : chr "vertigo"
## $ : chr "chinatown"
sapply()
function takes list, vector or data frame as input and gives output in vector or matrix. It is useful for operations on list objects and returns a list object of same length of original set.sapply()
function does the same job aslapply()
function but returns a vector.
> dt <- cars
> (lmn_cars <- lapply(dt, min))
## $speed
## [1] 4
##
## $dist
## [1] 2
> (smn_cars <- sapply(dt, min))
## speed dist
## 4 2
tapply()
computes a measure (mean, median, min, max, etc..) or a function for each factor variable in a vector. It is a very useful function that lets you create a subset of a vector and then apply some functions to each of the subset.
tapply(OBJ, INDEX, FUN)
OBJ: an object (usually a vector)
INDEX: a list containing a factor
FUN: function to apply
Example: The iris dataset. This dataset is very famous in the world of machine learning. The purpose of this dataset is to predict the class of each of the three flower species (factors): Setosa, Versicolor, Virginica. The dataset collects information for each species about their length and width.
> iris
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5.0 3.6 1.4 0.2 setosa
## 6 5.4 3.9 1.7 0.4 setosa
## 7 4.6 3.4 1.4 0.3 setosa
## 8 5.0 3.4 1.5 0.2 setosa
## 9 4.4 2.9 1.4 0.2 setosa
## 10 4.9 3.1 1.5 0.1 setosa
## 11 5.4 3.7 1.5 0.2 setosa
## 12 4.8 3.4 1.6 0.2 setosa
## 13 4.8 3.0 1.4 0.1 setosa
## 14 4.3 3.0 1.1 0.1 setosa
## 15 5.8 4.0 1.2 0.2 setosa
## 16 5.7 4.4 1.5 0.4 setosa
## 17 5.4 3.9 1.3 0.4 setosa
## 18 5.1 3.5 1.4 0.3 setosa
## 19 5.7 3.8 1.7 0.3 setosa
## 20 5.1 3.8 1.5 0.3 setosa
## 21 5.4 3.4 1.7 0.2 setosa
## 22 5.1 3.7 1.5 0.4 setosa
## 23 4.6 3.6 1.0 0.2 setosa
## 24 5.1 3.3 1.7 0.5 setosa
## 25 4.8 3.4 1.9 0.2 setosa
## 26 5.0 3.0 1.6 0.2 setosa
## 27 5.0 3.4 1.6 0.4 setosa
## 28 5.2 3.5 1.5 0.2 setosa
## 29 5.2 3.4 1.4 0.2 setosa
## 30 4.7 3.2 1.6 0.2 setosa
## 31 4.8 3.1 1.6 0.2 setosa
## 32 5.4 3.4 1.5 0.4 setosa
## 33 5.2 4.1 1.5 0.1 setosa
## 34 5.5 4.2 1.4 0.2 setosa
## 35 4.9 3.1 1.5 0.2 setosa
## 36 5.0 3.2 1.2 0.2 setosa
## 37 5.5 3.5 1.3 0.2 setosa
## 38 4.9 3.6 1.4 0.1 setosa
## 39 4.4 3.0 1.3 0.2 setosa
## 40 5.1 3.4 1.5 0.2 setosa
## 41 5.0 3.5 1.3 0.3 setosa
## 42 4.5 2.3 1.3 0.3 setosa
## 43 4.4 3.2 1.3 0.2 setosa
## 44 5.0 3.5 1.6 0.6 setosa
## 45 5.1 3.8 1.9 0.4 setosa
## 46 4.8 3.0 1.4 0.3 setosa
## 47 5.1 3.8 1.6 0.2 setosa
## 48 4.6 3.2 1.4 0.2 setosa
## 49 5.3 3.7 1.5 0.2 setosa
## 50 5.0 3.3 1.4 0.2 setosa
## 51 7.0 3.2 4.7 1.4 versicolor
## 52 6.4 3.2 4.5 1.5 versicolor
## 53 6.9 3.1 4.9 1.5 versicolor
## 54 5.5 2.3 4.0 1.3 versicolor
## 55 6.5 2.8 4.6 1.5 versicolor
## 56 5.7 2.8 4.5 1.3 versicolor
## 57 6.3 3.3 4.7 1.6 versicolor
## 58 4.9 2.4 3.3 1.0 versicolor
## 59 6.6 2.9 4.6 1.3 versicolor
## 60 5.2 2.7 3.9 1.4 versicolor
## 61 5.0 2.0 3.5 1.0 versicolor
## 62 5.9 3.0 4.2 1.5 versicolor
## 63 6.0 2.2 4.0 1.0 versicolor
## 64 6.1 2.9 4.7 1.4 versicolor
## 65 5.6 2.9 3.6 1.3 versicolor
## 66 6.7 3.1 4.4 1.4 versicolor
## 67 5.6 3.0 4.5 1.5 versicolor
## 68 5.8 2.7 4.1 1.0 versicolor
## 69 6.2 2.2 4.5 1.5 versicolor
## 70 5.6 2.5 3.9 1.1 versicolor
## 71 5.9 3.2 4.8 1.8 versicolor
## 72 6.1 2.8 4.0 1.3 versicolor
## 73 6.3 2.5 4.9 1.5 versicolor
## 74 6.1 2.8 4.7 1.2 versicolor
## 75 6.4 2.9 4.3 1.3 versicolor
## 76 6.6 3.0 4.4 1.4 versicolor
## 77 6.8 2.8 4.8 1.4 versicolor
## 78 6.7 3.0 5.0 1.7 versicolor
## 79 6.0 2.9 4.5 1.5 versicolor
## 80 5.7 2.6 3.5 1.0 versicolor
## 81 5.5 2.4 3.8 1.1 versicolor
## 82 5.5 2.4 3.7 1.0 versicolor
## 83 5.8 2.7 3.9 1.2 versicolor
## 84 6.0 2.7 5.1 1.6 versicolor
## 85 5.4 3.0 4.5 1.5 versicolor
## 86 6.0 3.4 4.5 1.6 versicolor
## 87 6.7 3.1 4.7 1.5 versicolor
## 88 6.3 2.3 4.4 1.3 versicolor
## 89 5.6 3.0 4.1 1.3 versicolor
## 90 5.5 2.5 4.0 1.3 versicolor
## 91 5.5 2.6 4.4 1.2 versicolor
## 92 6.1 3.0 4.6 1.4 versicolor
## 93 5.8 2.6 4.0 1.2 versicolor
## 94 5.0 2.3 3.3 1.0 versicolor
## 95 5.6 2.7 4.2 1.3 versicolor
## 96 5.7 3.0 4.2 1.2 versicolor
## 97 5.7 2.9 4.2 1.3 versicolor
## 98 6.2 2.9 4.3 1.3 versicolor
## 99 5.1 2.5 3.0 1.1 versicolor
## 100 5.7 2.8 4.1 1.3 versicolor
## 101 6.3 3.3 6.0 2.5 virginica
## 102 5.8 2.7 5.1 1.9 virginica
## 103 7.1 3.0 5.9 2.1 virginica
## 104 6.3 2.9 5.6 1.8 virginica
## 105 6.5 3.0 5.8 2.2 virginica
## 106 7.6 3.0 6.6 2.1 virginica
## 107 4.9 2.5 4.5 1.7 virginica
## 108 7.3 2.9 6.3 1.8 virginica
## 109 6.7 2.5 5.8 1.8 virginica
## 110 7.2 3.6 6.1 2.5 virginica
## 111 6.5 3.2 5.1 2.0 virginica
## 112 6.4 2.7 5.3 1.9 virginica
## 113 6.8 3.0 5.5 2.1 virginica
## 114 5.7 2.5 5.0 2.0 virginica
## 115 5.8 2.8 5.1 2.4 virginica
## 116 6.4 3.2 5.3 2.3 virginica
## 117 6.5 3.0 5.5 1.8 virginica
## 118 7.7 3.8 6.7 2.2 virginica
## 119 7.7 2.6 6.9 2.3 virginica
## 120 6.0 2.2 5.0 1.5 virginica
## 121 6.9 3.2 5.7 2.3 virginica
## 122 5.6 2.8 4.9 2.0 virginica
## 123 7.7 2.8 6.7 2.0 virginica
## 124 6.3 2.7 4.9 1.8 virginica
## 125 6.7 3.3 5.7 2.1 virginica
## 126 7.2 3.2 6.0 1.8 virginica
## 127 6.2 2.8 4.8 1.8 virginica
## 128 6.1 3.0 4.9 1.8 virginica
## 129 6.4 2.8 5.6 2.1 virginica
## 130 7.2 3.0 5.8 1.6 virginica
## 131 7.4 2.8 6.1 1.9 virginica
## 132 7.9 3.8 6.4 2.0 virginica
## 133 6.4 2.8 5.6 2.2 virginica
## 134 6.3 2.8 5.1 1.5 virginica
## 135 6.1 2.6 5.6 1.4 virginica
## 136 7.7 3.0 6.1 2.3 virginica
## 137 6.3 3.4 5.6 2.4 virginica
## 138 6.4 3.1 5.5 1.8 virginica
## 139 6.0 3.0 4.8 1.8 virginica
## 140 6.9 3.1 5.4 2.1 virginica
## 141 6.7 3.1 5.6 2.4 virginica
## 142 6.9 3.1 5.1 2.3 virginica
## 143 5.8 2.7 5.1 1.9 virginica
## 144 6.8 3.2 5.9 2.3 virginica
## 145 6.7 3.3 5.7 2.5 virginica
## 146 6.7 3.0 5.2 2.3 virginica
## 147 6.3 2.5 5.0 1.9 virginica
## 148 6.5 3.0 5.2 2.0 virginica
## 149 6.2 3.4 5.4 2.3 virginica
## 150 5.9 3.0 5.1 1.8 virginica
> tapply(iris$Sepal.Width, iris$Species, mean)
## setosa versicolor virginica
## 3.428 2.770 2.974
- Summary:
Function | Arguments | Objective | Input | Output |
---|---|---|---|---|
apply |
apply(x, MARGIN, FUN) |
Apply a function to the rows or columns or both | Data frame or matrix | vector, list, array |
lapply |
lapply(x, FUN) |
Apply a function to all the elements of the input | List, vector or data frame | list |
sapply |
sapply(x, FUN) |
Apply a function to all the elements of the input | List, vector or data frame | vector or matrix |
tapply |
tapply(x, INDEX, FUN) |
Apply a function to each factor | Vector or data frame | array |