5.4 Apply Family
Apply family is a very convenient tools to loop over data structure (vector, array, matrix and list). The most useful for our purposes are:
- apply(),
- sapply(), and
- lapply().
5.4.1 apply
We will to apply a function to each row or each column on a matrix. It will apply a function by-column (=2) or by-row (=1).
x <- matrix(1:9, nrow = 3, ncol=3)
x
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
apply(x,1,mean) # average each row
## [1] 4 5 6
apply(x,2,mean) # average each column
## [1] 2 5 8
5.4.2 sapply and lapply
Sometimes, we will apply a function repeatedly on each element of a vector (or a list). Then sapply is more convenient then a for loop.
Consider the following for loop that returns the square of each element
x <- c(1,3,5)
for (i in 1:length(x)) {
x[i] <- x[i]^2
}
x
## [1] 1 9 25
We can do the same using sapply() with much cleaner code.
x <- c(1,3,5)
x <- sapply(x, function(x) x^2)
x
## [1] 1 9 25
lapply() is the same as sapply() but we end up with a list instead of vector. We can use unlist to get back the same result as sapply().
x <- c(1,3,5)
x <- lapply(x, function(x) x^2)
x
## [[1]]
## [1] 1
##
## [[2]]
## [1] 9
##
## [[3]]
## [1] 25
x <- unlist(x)