Matrices in R

Filed Under: R Programming
Matrices

Matrices are a very important concept in R programming, mostly used for statistics and data manipulation. Where vectors are a set of values stored across a single dimension, matrices are collections of stored values across multiple dimensions. Matrices can be simply thought of as a number of vectors that are saved and can be manipulated together. R has several powerful functions for this.

Creating Matrices in R Programming

The subscripting in matrices begins with 1. Therefore, [1,1] represents the element corresponding to the first-row first column, [1,2] represents the element at the first row and second column and so on.

Matrices in R are created in the following manner:

mymat <- matrix(c(2,4,6,8),ncol=2,nrow=2)

The first argument we pass to the matrix creation is a vector of values to populate the matrix with. Then we need to specify the no. of columns and rows, as indicated by the ncol and nrow arguments. The number of elements in the vector should always be equal to ncol * nrow.

R stores matrices in a column first manner by default, i.e., it fills the first column and then moves on to the next column left to right. Let us display the mymat matrix we created above.

> mymat
     [,1] [,2]
[1,]    2    6
[2,]    4    8

To fill the matrix in a row first manner, you need to provide an additional argument byrow=TRUE to the above matrix creation function.

> mymat <- matrix(c(2,4,6,8),ncol=2,nrow=2,byrow=TRUE)
> mymat
     [,1] [,2]
[1,]    2    4
[2,]    6    8

You can also pre-create a matrix by specifying its size and populate it later accordingly.

#Create space for matrix
> xmat <-matrix(ncol=3,nrow=3)
#Populate elements of the matrix
> xmat[1,1]=5
> xmat[1,2]=10
> xmat[1,3]=15
> xmat[2,1]=20
> xmat[2,2]=25
> xmat[2,3]=30
> xmat[3,1]=35
> xmat[3,2]=40
> xmat[3,3]=45
> xmat
     [,1] [,2] [,3]
[1,]    5   10   15
[2,]   20   25   30
[3,]   35   40   45

It is also possible to assign names to columns and rows in a matrix. This will help document your datasets better and erases the confusion. The names to rows and columns in R can be supplied through a list using the dimnames argument.

Suppose that we wish to create a matrix to hold the vital statistics of 3 boys, with columns age, height and weight. We need the rows to represent each boy’s name and columns to represent each of the vital stats. We can do that using the following code:

vitals <- matrix(c(7,90.8,45,8,75.5,37,10,100.1,50),ncol=3,nrow=3,byrow=TRUE, dimnames = list(c("Raj","Rahul","Ravi"),c("Age","Height","Weight")))

Let us now display the matrix.

> vitals
      Age Height Weight
Raj     7   90.8     45
Rahul   8   75.5     37
Ravi   10  100.1     50

The names of the rows and columns can be retrieved using the colnames() and rownames() functions over the matrix object.

> colnames(vitals)
[1] "Age"    "Height" "Weight"
> rownames(vitals)
[1] "Raj"   "Rahul" "Ravi"

It is also possible to reassign the row and column names using these functions. Suppose we need to change the column name Height and Weight to include some more info on the units in which they are measured, we can do that in the following manner:

> colnames(vitals) <- c("Age", "Height in cm", "Weight in KG")
> vitals
      Age Height in cm Weight in KG
Raj     7         90.8           45
Rahul   8         75.5           37
Ravi   10        100.1           50

Operations on Matrices in R Programming

Matrices in R support basic linear algebra operations such as addition, multiplication (both element-wise and matrix multiplication) and multiplication by a scalar.

Matrix addition is very straightforward and needs both the operand matrices to be of the same dimension.

> x<-matrix(c(3,4,5,2,6,7,8,9,11),ncol=3,nrow=3)
> y<-matrix(c(3,2,6,7,8,22,1,54,10),ncol=3,nrow=3)
> x
     [,1] [,2] [,3]
[1,]    3    2    8
[2,]    4    6    9
[3,]    5    7   11
> y
     [,1] [,2] [,3]
[1,]    3    7    1
[2,]    2    8   54
[3,]    6   22   10
> x+y
     [,1] [,2] [,3]
[1,]    6    9    9
[2,]    6   14   63
[3,]   11   29   21

For element-wise multiplication, we need both the matrices to have the same dimension, whereas, for matrix multiplication of an m x n with a p x q matrix, n and p should always be the same. Both examples are illustrated below.

Element-wise multiplication and multiplication by a scalar are specified using a * symbol and matrix multiplication is specified using a %*% symbol.

> x*y
     [,1] [,2] [,3]
[1,]    9   14    8
[2,]    8   48  486
[3,]   30  154  110

> x*2
     [,1] [,2] [,3]
[1,]    6    4   16
[2,]    8   12   18
[3,]   10   14   22

> x%*%y
     [,1] [,2] [,3]
[1,]   61  213  191
[2,]   78  274  418
[3,]   95  333  493

A few more advanced matrix operations will be covered in our next post on matrix algebra.

Indexing Matrices in R Language

We have already seen the process of indexing vectors and extracting subsets in the previous post. Matrix indexing works in a similar fashion as illustrated below. Negative subscripts work for excluding a particular row or column.

#Defined matrix x
> x
     [,1] [,2] [,3]
[1,]    3    2    8
[2,]    4    6    9
[3,]    5    7   11
#Display only the first row
> x[1,]
[1] 3 2 8

#Display only the first column
> x[,1]
[1] 3 4 5

#Display the rows 1 to 2
> x[1:2,]
     [,1] [,2] [,3]
[1,]    3    2    8
[2,]    4    6    9

#Display the columns 2 to 3
> x[,2:3]
     [,1] [,2]
[1,]    2    8
[2,]    6    9
[3,]    7   11

#Display all rows except the second
> x[-2,]
     [,1] [,2] [,3]
[1,]    3    2    8
[2,]    5    7   11

You can also reassign these submatrices with new values in the following manner. Both columns 2 and 3 are changed to the specified new values.

> x[,2:3] <- matrix(c(2,2,2,2,2,2),ncol=2)
> x
     [,1] [,2] [,3]
[1,]    3    2    2
[2,]    4    2    2
[3,]    5    2    2

Leave a Reply

Your email address will not be published. Required fields are marked *

close
Generic selectors
Exact matches only
Search in title
Search in content
Search in posts
Search in pages