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:
> for (var in num1:num2){
>   instruction1
>   instruction2
>   ...
> }
  • Example:
> y <- sample(1:5)
> z <- c()
> for (i in 1:5){
+   z[i] <- y[i]^2
+ }
> z
## [1] 16  4  9 25  1
  • 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:

if (condition){
  expression_if_true else expression_if_false
}
  • 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…
> ifelse(condition, expression_if_true, expression_if_false)
> (x <- rnorm(2,0,1))
## [1]  1.6986 -0.1313
> ifelse(x[1] < x[2], "True", "False")
## [1] "False"

7.3 While loop example

  • The while loop: while(cond) expr
> x <- 1
> while (x < 5) {
+   x <- x+1
+   print(x)
+ }
## [1] 2
## [1] 3
## [1] 4
## [1] 5
> x <- 1
> while (x < 5) {
+   print(x)
+   x <- x+1
+ }
## [1] 1
## [1] 2
## [1] 3
## [1] 4

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.
apply(X, MARGIN, FUN)

X: data frame or matrix
MARGIN: 1 if row, 2 if column
FUN: function to apply
> (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.
lapply(OBJ, FUN)

OBJ: an object
FUN: function to apply
> 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 as lapply() function but returns a vector.
sapply(OBJ, FUN)

OBJ: an object
FUN: function to apply
> 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