Getting Started with R - Part 6: Matrices - Captions

4 minute read

Adding Captions to matrices make them more readable and allows us to retain information when we subset the matrix.

I am posting this tutorial as I learn R. I will respond to feedback for errata in the comments.

Adding columns after construction

You should remember how we added names to our vector values. In that case we used the names() function. If you need a second look, then head back to Part 2: Vector Basics.

We have two similar functions for matrices: rownames and colnames. Let us retry our previous subset

matrix_dim <- 10  
x_matrix <- matrix(ncol=matrix_dim, nrow=matrix_dim)
rownames(x_matrix) <- 1:matrix_dim
colnames(x_matrix) <- 1:matrix_dim
x_matrix[] <- " "
x_matrix[c(3:5, 9), c(3, 7:9)] <- "X"
x_matrix[, c(1, 10)] <- "|"
x_matrix
x_matrix[3:4, 9:10]

This gives us a more understandable result:

    1   2   3   4   5   6   7   8   9   10 
1  "|" " " " " " " " " " " " " " " " " "|"
2  "|" " " " " " " " " " " " " " " " " "|"
3  "|" " " "X" " " " " " " "X" "X" "X" "|"
4  "|" " " "X" " " " " " " "X" "X" "X" "|"
5  "|" " " "X" " " " " " " "X" "X" "X" "|"
6  "|" " " " " " " " " " " " " " " " " "|"
7  "|" " " " " " " " " " " " " " " " " "|"
8  "|" " " " " " " " " " " " " " " " " "|"
9  "|" " " "X" " " " " " " "X" "X" "X" "|"
10 "|" " " " " " " " " " " " " " " " " "|"

  9   10 
3 "X" "|"
4 "X" "|"

Now we can see the original row and columns that were the source of the subset.

Of course we are not limited to just numeric ranges for captions. Just like with our vectors we can also use characters.

Adding captions during matrix construction

To add the captions during construction I can use the dimnames parameter. This parameter takes a list() with two vectors: The row captions, then the column captions

month_names <- c('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')
calendar_matrix <- matrix(nrow=31, ncol=12, dimnames = list(1:31, month_names))

calendar_matrix[1:31, months_31days]

months_31days <- c(1,3,5,7,8,10,12)
months_30days <- c(4,6,9,11)
calendar_matrix[1:31, months_31days] <- ''
calendar_matrix[1:30, months_30days] <- ''
calendar_matrix[1:28, 'Feb'] <- ''
# Invalid calendar positions are now NA, valid ones are an empty string

oldw <- getOption("warn")
  # We have to turn off a warning because the days of the week do not even divide - there is a remainder of 1
  options(warn = -1) 
  calendar_matrix[!is.na(calendar_matrix)] <- c('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun') # assuming Jan 1 fell on a Monday
options(warn = oldw)

calendar_matrix

If you know of a way I can simplify the selection, please comment below so I can learn and share with others. For those that are curious, here is the matrix output

   Jan   Feb   Mar   Apr   May   Jun   Jul   Aug   Sep   Oct   Nov   Dec  
1  "Mon" "Thu" "Thu" "Sun" "Tue" "Fri" "Sun" "Wed" "Sat" "Mon" "Thu" "Sat"
2  "Tue" "Fri" "Fri" "Mon" "Wed" "Sat" "Mon" "Thu" "Sun" "Tue" "Fri" "Sun"
3  "Wed" "Sat" "Sat" "Tue" "Thu" "Sun" "Tue" "Fri" "Mon" "Wed" "Sat" "Mon"
4  "Thu" "Sun" "Sun" "Wed" "Fri" "Mon" "Wed" "Sat" "Tue" "Thu" "Sun" "Tue"
5  "Fri" "Mon" "Mon" "Thu" "Sat" "Tue" "Thu" "Sun" "Wed" "Fri" "Mon" "Wed"
6  "Sat" "Tue" "Tue" "Fri" "Sun" "Wed" "Fri" "Mon" "Thu" "Sat" "Tue" "Thu"
7  "Sun" "Wed" "Wed" "Sat" "Mon" "Thu" "Sat" "Tue" "Fri" "Sun" "Wed" "Fri"
8  "Mon" "Thu" "Thu" "Sun" "Tue" "Fri" "Sun" "Wed" "Sat" "Mon" "Thu" "Sat"
9  "Tue" "Fri" "Fri" "Mon" "Wed" "Sat" "Mon" "Thu" "Sun" "Tue" "Fri" "Sun"
10 "Wed" "Sat" "Sat" "Tue" "Thu" "Sun" "Tue" "Fri" "Mon" "Wed" "Sat" "Mon"
11 "Thu" "Sun" "Sun" "Wed" "Fri" "Mon" "Wed" "Sat" "Tue" "Thu" "Sun" "Tue"
12 "Fri" "Mon" "Mon" "Thu" "Sat" "Tue" "Thu" "Sun" "Wed" "Fri" "Mon" "Wed"
13 "Sat" "Tue" "Tue" "Fri" "Sun" "Wed" "Fri" "Mon" "Thu" "Sat" "Tue" "Thu"
14 "Sun" "Wed" "Wed" "Sat" "Mon" "Thu" "Sat" "Tue" "Fri" "Sun" "Wed" "Fri"
15 "Mon" "Thu" "Thu" "Sun" "Tue" "Fri" "Sun" "Wed" "Sat" "Mon" "Thu" "Sat"
16 "Tue" "Fri" "Fri" "Mon" "Wed" "Sat" "Mon" "Thu" "Sun" "Tue" "Fri" "Sun"
17 "Wed" "Sat" "Sat" "Tue" "Thu" "Sun" "Tue" "Fri" "Mon" "Wed" "Sat" "Mon"
18 "Thu" "Sun" "Sun" "Wed" "Fri" "Mon" "Wed" "Sat" "Tue" "Thu" "Sun" "Tue"
19 "Fri" "Mon" "Mon" "Thu" "Sat" "Tue" "Thu" "Sun" "Wed" "Fri" "Mon" "Wed"
20 "Sat" "Tue" "Tue" "Fri" "Sun" "Wed" "Fri" "Mon" "Thu" "Sat" "Tue" "Thu"
21 "Sun" "Wed" "Wed" "Sat" "Mon" "Thu" "Sat" "Tue" "Fri" "Sun" "Wed" "Fri"
22 "Mon" "Thu" "Thu" "Sun" "Tue" "Fri" "Sun" "Wed" "Sat" "Mon" "Thu" "Sat"
23 "Tue" "Fri" "Fri" "Mon" "Wed" "Sat" "Mon" "Thu" "Sun" "Tue" "Fri" "Sun"
24 "Wed" "Sat" "Sat" "Tue" "Thu" "Sun" "Tue" "Fri" "Mon" "Wed" "Sat" "Mon"
25 "Thu" "Sun" "Sun" "Wed" "Fri" "Mon" "Wed" "Sat" "Tue" "Thu" "Sun" "Tue"
26 "Fri" "Mon" "Mon" "Thu" "Sat" "Tue" "Thu" "Sun" "Wed" "Fri" "Mon" "Wed"
27 "Sat" "Tue" "Tue" "Fri" "Sun" "Wed" "Fri" "Mon" "Thu" "Sat" "Tue" "Thu"
28 "Sun" "Wed" "Wed" "Sat" "Mon" "Thu" "Sat" "Tue" "Fri" "Sun" "Wed" "Fri"
29 "Mon" NA    "Thu" "Sun" "Tue" "Fri" "Sun" "Wed" "Sat" "Mon" "Thu" "Sat"
30 "Tue" NA    "Fri" "Mon" "Wed" "Sat" "Mon" "Thu" "Sun" "Tue" "Fri" "Sun"
31 "Wed" NA    "Sat" NA    "Thu" NA    "Tue" "Fri" NA    "Wed" NA    "Mon"

In the next post we will see how we can improve on our days of the week, by using factors

Leave a Comment