Introduction
In the previous post, we learnt to index/subset vectors. In this post, we will learn to create matrices. A matrix is a regular array of data elements, arranged in rows and columns. Matrices in R are homogeneous i.e. they can hold a single type of data. Matrix elements are indexed by specifying the row and column index and the elements of a matrix can filled either by row or column. In the first section, we look at various ways of creating matrices in R.
Creating Matrix
The easiest way to create a matrix in R is to use the matrix()
function. Let us look at its syntax:
args(matrix)
## function (data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)
## NULL
Now that we have understood the syntax of the matrix()
function, let us create a simple numeric matrix.
# matrix of 3 rows filled by columns
mat <- matrix(data = 1:9, nrow = 3, byrow = FALSE)
mat
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
In the above example, we created a matrix of 3 rows where the data elements are filled by columns. We need to specify either the
number of rows
or columns
and R will automatically compute the other. The number of data elements should be equal to the product of the rows and columns, else R will return a warning.
matrix(data = 1:9, nrow = 2, byrow = FALSE)
## Warning in matrix(data = 1:9, nrow = 2, byrow = FALSE): data length [9] is not a
## sub-multiple or multiple of the number of rows [2]
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 3 5 7 9
## [2,] 2 4 6 8 1
matrix(data = 1:10, nrow = 3, byrow = FALSE)
## Warning in matrix(data = 1:10, nrow = 3, byrow = FALSE): data length [10] is not
## a sub-multiple or multiple of the number of rows [3]
## [,1] [,2] [,3] [,4]
## [1,] 1 4 7 10
## [2,] 2 5 8 1
## [3,] 3 6 9 2
We can follow some general rules to avoid the mistakes made in the previous examples:
if the number of elements is odd, both the number of rows and columns must be odd and their product should equal the number of data elements
if the number of elements is even, either the number of rows or columns must be even. In some cases, both the rows and columns must be even
Let us continue to explore the syntax of the matrix()
function.
Fill Data by Row
matrix(data = 1:9, nrow = 3, byrow = TRUE)
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 4 5 6
## [3,] 7 8 9
Fill Data by Column
matrix(data = 1:9, nrow = 3, byrow = FALSE)
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
Specify Rows
matrix(data = 1:10, nrow = 2)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 3 5 7 9
## [2,] 2 4 6 8 10
Specify Columns
matrix(data = 1:10, ncol = 5)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 3 5 7 9
## [2,] 2 4 6 8 10
Row & Column Names
You can specify names for the rows and columns of a matrix. To do so, we need to use list
. Lists can contain other data structures such as vectors, matrices and even other lists. They are heterogeneous i.e. they can contain different data types. We will learn more about lists in a future post, for the time being let us learn how to create a basic list using the list()
function:
# character vector
first_name <- c("John", "Jill", "Jack")
# numeric vector
age <- c(20, 24, 32)
# list
details <- list(first_name, age)
details
## [[1]]
## [1] "John" "Jill" "Jack"
##
## [[2]]
## [1] 20 24 32
Now that we know how to create a list, let us go ahead and create a matrix and name its rows and columns.
# row names
row_names <- c('row_1', 'row_2', 'row_3')
# column names
col_names <- c('col_1', 'col_2', 'col_3')
# matrix with row and column names
matrix(data = 1:9, nrow = 3, dimnames = list(row_names, col_names))
## col_1 col_2 col_3
## row_1 1 4 7
## row_2 2 5 8
## row_3 3 6 9
Matrix Dimension
Another useful function is dim()
. It can be used to:
- check the dimension (rows and columns) of a matrix
- modify the dimension of a matrix
- coerce a vector to a matrix
Check dimension of a matrix
mat <- matrix(data = 1:9, nrow = 3, byrow = TRUE)
dim(mat)
## [1] 3 3
Modify dimension of a matrix
# sample matrix
mat <- matrix(data = 1:12, nrow = 3, byrow = TRUE)
dim(mat)
## [1] 3 4
# change the dimension to 4 x 3
dim(mat) <- c(4, 3)
dim(mat)
## [1] 4 3
Coerce vector to matrix
# numeric vector
vect1 <- 1:12
vect1
## [1] 1 2 3 4 5 6 7 8 9 10 11 12
# coerce vect1 to a 4 x 3 matrix
dim(vect1) <- c(4, 3)
vect1
## [,1] [,2] [,3]
## [1,] 1 5 9
## [2,] 2 6 10
## [3,] 3 7 11
## [4,] 4 8 12
Another way to coerce an R data structure to matrix
is to use the as.matrix()
function. Since the only other data structure we have learnt so far is the vector, we will coerce a vector into a matric using as.matrix()
. We will deal with the other data structures as and when we learn them.
# numeric vector
vect1 <- 1:12
vect1
## [1] 1 2 3 4 5 6 7 8 9 10 11 12
# coerce vect1 to a matrix
as.matrix(vect1)
## [,1]
## [1,] 1
## [2,] 2
## [3,] 3
## [4,] 4
## [5,] 5
## [6,] 6
## [7,] 7
## [8,] 8
## [9,] 9
## [10,] 10
## [11,] 11
## [12,] 12
Regardless of the data type of the vector, all of them will be coerced to a matrix of dimension n x 1
i.e. they will all have only one column.