Chapter 7 MATRICES.

El uso de matrices es muy importante para resolver problemas de optimización estática y dinámica. Pero si se tiene un perfil estadístico su uso es menor, ya que la mayoría de procedimientos estadísticos ya están desarrollados en packages. El principal uso que se le da es para la creación de funciones, para aprender como se selecciona filas y columnas, esto nos dará una visión muy amplia cuando tengamos que crear un data frame, que se verá en los siguientes capítulos.

7.1 Creación de matrices.

Al igual que un curso de álgebra lineal en el software R la construcción de matrices se hace a través de vectores. La función que crea matrices es la función matrix(), que tiene los siguientes argumentos:

matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)

Donde:
data = Es un vector.
nrow = El número de filas que tendrá la matriz, el valor de defecto es de 1 fila.
ncol = El número de columnas que tendrá la matriz, el valor de defecto es de 1 columna.
byrow = Es un argumento lógico que si toma el valor de TRUE, entonces, creará la matriz ordenando los elementos por filas. Su valor por defecto es FALSE, lo que implica que crea la matriz ordenando los elementos por columnas.
dimnames = Es una lista en donde se colocará los nombres de las filas y columnas. Su valor por defecto es NULL, lo que implica que las filas como las columnas no tendrán nombres.

Veamos un sencillo ejemplo en donde crearemos una matriz de 2x2.

# Creando una matriz 2x2.
matrix(1:4, nrow = 2)
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4

En efecto, se ha creado la matriz de 2x2 en donde se usó los elementos del 1 al 4 (1:4) y se indicó que el número de filas sea de 2 (nrow = 2). Además ordenó los elementos por columnas, ya que el valor por defecto de byrow es FALSE (byrow = FALSE).

Ahora veamos como crear una matriz 3x2, es decir, que tenga 3 filas y 2 columnas.

# Creando la matriz 3x2.
matrix(1:6, nrow = 3, ncol = 2)
##      [,1] [,2]
## [1,]    1    4
## [2,]    2    5
## [3,]    3    6

Se ha creado la matriz 3x2, en este caso se ha tenido que especificar el número de filas con el argumento nrow = 3 y el número de columnas con el argumento ncol = 2.

El siguiente ejemplo, será similar al anterior pero en este caso vamos a usar el argumento byrow. Lo que implica que se ordenará los elementos por filas.

# Creando una matriz donde los elementos se ordenan por filas. 
matrix(1:6, nrow = 3, ncol = 2, byrow = T)
##      [,1] [,2]
## [1,]    1    2
## [2,]    3    4
## [3,]    5    6

En efecto, ahora los elementos se han completado por filas, anteriormente este ordenamiento se daba por columnas.

Por último, veremos un ejemplo en donde las filas como las columnas tengan nombres.

# Creando una matriz donde las filas y columnas tengan nombres. 
matrix(1:6, nrow = 3, ncol = 2, byrow = T,
       dimnames = list(c("Año 2020","Año 2021","Año 2022"),
                       c("Sexo Masculino","Sexo Femenino")))
##          Sexo Masculino Sexo Femenino
## Año 2020              1             2
## Año 2021              3             4
## Año 2022              5             6

Ahora, veamos el caso en donde se desea crear una matriz 4x4 pero sólo se le brinda un vector de 10 elementos. En este caso el número de elementos es inferior al que requerirá una matriz 4x4, lo que hará el software es completar los elementos faltantes con los primeros elementos del vector hasta completar 16 elementos.

# Creando una matriz con menos elementos que la matriz. 
matrix(1:10, ncol = 4, nrow = 4)
## Warning in matrix(1:10, ncol = 4, nrow = 4): la longitud de los datos [10] no es
## un submúltiplo o múltiplo del número de filas [4] en la matriz
##      [,1] [,2] [,3] [,4]
## [1,]    1    5    9    3
## [2,]    2    6   10    4
## [3,]    3    7    1    5
## [4,]    4    8    2    6

Si nos fijamos bien, agregó los elementos 1, 2, 3, 4, 5, 6 en la matriz, ya que sólo se le brindó 10 elementos. Asimismo, nos ha arrojado un mensaje de advertencia en donde nos dice que la longitud de los datos [10] no es un submúltiplo o múltiplo del número de filas [4] en la matriz.

Resultado contrario arrojará cuando se le asigne un vector con más elementos que elementos de la matriz. Por ejemplo se le brindará 10 elementos, pero le especificamos una matriz de 2x2.

# Creando una matriz con más elementos que la matriz. 
matrix(1:10, ncol = 2, nrow = 2)
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4

Sólo a colocado los 4 primeros elementos.

7.2 Concatenar matrices por filas o columnas.

Si nosotros queremos juntar matrices por filas, es decir, apilar matrices por filas entonces usaremos la función rbind(). Veamos una ejemplo.

Vamos a juntar 2 matrices por las filas. Para lo cual creamos las dos matrices.

# La primera matriz. 
m1<-matrix(c("Azul","Rojo","Amarillo","Verde"), ncol = 2)
m1
##      [,1]   [,2]      
## [1,] "Azul" "Amarillo"
## [2,] "Rojo" "Verde"
# La segunda matriz. 
m2<-matrix(1:4, ncol = 2)
m2
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4

La primera matriz se guardó en el objeto m1 y la segundo en el objeto m2. Las vamos a concatenar por filas, es decir, vamos a crear una matriz 4x2.

# concatenando las matrices por filas.
rbind(m1,m2)
##      [,1]   [,2]      
## [1,] "Azul" "Amarillo"
## [2,] "Rojo" "Verde"   
## [3,] "1"    "3"       
## [4,] "2"    "4"

En efecto, se tiene un matriz 4x2.

Ahora veamos el caso de concatenar matrices por columnas, para esto se usará la función cbind(). Vamos a concatenar 2 matrices 3x2 para que el resultado sea una matriz 3x4.

Primero vamos a crear las 2 matrices 3x2.

# Primera matriz.
ma1<-matrix(c("A","B","C","D","E","F"), ncol = 2, nrow = 3)
ma1
##      [,1] [,2]
## [1,] "A"  "D" 
## [2,] "B"  "E" 
## [3,] "C"  "F"
# Segunda matriz. 
ma2<-matrix(2012:2017, ncol = 2, nrow = 3)
ma2
##      [,1] [,2]
## [1,] 2012 2015
## [2,] 2013 2016
## [3,] 2014 2017

Hemos creado las 2 matrices 3x2 que han sido guardadas en los objetos ma1 y ma2. Ahora los concatenamos por columnas con la función cbind().

# Concatenando las matrices por columnas. 
cbind(ma1,ma2)
##      [,1] [,2] [,3]   [,4]  
## [1,] "A"  "D"  "2012" "2015"
## [2,] "B"  "E"  "2013" "2016"
## [3,] "C"  "F"  "2014" "2017"

En efecto, se ha creado la matriz 3x4.

El uso de las funciones rbind() y cbind() también se podrá usar cuando queramos juntar data frames.

7.3 Selecionar elementos de una matriz.

En capítulos anteriores se seleccionaba elementos de vectores usando corchetes [] y de las listas usando doble corchete [[]] o con el símbolo de dólar $. En el caso de matrices también se usan los corchetes [], pero dentro de ellos debe de ir un indicador de la fila y la columna del vector. La estructura será la siguiente:

matriz[fila,columna]

Si queremos seleccionar elementos de la matriz, primero se colocará el objeto matriz, luego los corchetes, dentro de estos corchetes dos números: el primero indica la fila y el segundo la columna de la matriz.

Para ver ejemplos, crearemos una matriz 5x4 con elementos aleatorios.

# Creando la matriz 5x4.
set.seed(2021)
m<-matrix(sample(1:100, 20), ncol = 4, nrow = 5)
m
##      [,1] [,2] [,3] [,4]
## [1,]    7   70   76    3
## [2,]   38   64   51   98
## [3,]   46   99   60   26
## [4,]   58   69   18   36
## [5,]   12   23   88   31

La matriz que se ha creado se ha guardado en el objeto m.

Si queremos seleccionar el elemento de la fila 1 y columna 2, la sintaxis sería la siguiente:

# Seleccionando el elemento de la fila 1 y columna 2.
m[1,2]
## [1] 70

con m llamamos a la matriz, con [1,2] llamamos al elemento de la primera fila y de la segunda columna. El resultado es 70.

A continuación se muestra dos ejemplos adicionales de selección de elementos.

# Seleccionando el elemento de la fila 3 y columna 4.
m[3,4]
## [1] 26
# Seleccoando el elemento de la fila 4 y columna 2.
m[4,2]
## [1] 69

Si queremos seleccionar todo una fila o toda una columna.

# Seleccionado toda la columna 2.
m[,2]
## [1] 70 64 99 69 23
# Seleccioando toda la fila 3.
m[3,]
## [1] 46 99 60 26

Si se quiere seleccionar más de una fila o columna.

# Seleccioando las filas 2 y 3. 
m[2:3,]
##      [,1] [,2] [,3] [,4]
## [1,]   38   64   51   98
## [2,]   46   99   60   26
# Seleccioando las columnas 1 y 4.
m[,c(1,4)]
##      [,1] [,2]
## [1,]    7    3
## [2,]   38   98
## [3,]   46   26
## [4,]   58   36
## [5,]   12   31

Si se quiere excluir filas o columnas.

# Excluyendo la fila 2. 
m[-2,]
##      [,1] [,2] [,3] [,4]
## [1,]    7   70   76    3
## [2,]   46   99   60   26
## [3,]   58   69   18   36
## [4,]   12   23   88   31
# Excluyendo la columna 1.
m[,-1]
##      [,1] [,2] [,3]
## [1,]   70   76    3
## [2,]   64   51   98
## [3,]   99   60   26
## [4,]   69   18   36
## [5,]   23   88   31
# Excluyendo las columnas 2 y 4.
m[,-c(2,4)]
##      [,1] [,2]
## [1,]    7   76
## [2,]   38   51
## [3,]   46   60
## [4,]   58   18
## [5,]   12   88

La forma en la que se ha seleccionado elementos, filas o columnas será el mismo que usaremos para hacer selecciones en los objetos data frame.

7.4 Dimensiones de la matriz.

Las matrices tiene filas y columnas. Si nosotros nos encontramos con un objeto que es una matriz, sabremos el número de filas y el de columnas con la función dim().

Por ejemplo deseamos saber cual es el número de filas y columnas de la matriz m.

# Para saber el número de filas y columnas de la matriz.
dim(m)
## [1] 5 4

Nos indica que son 5 filas y 4 columnas. Ahora si queremos saber sólo el número de filas, entonces usaremos la siguiente sintaxis.

# Para saber el número de filas. 
dim(m)[1]
## [1] 5

Y para saber el número de columnas.

# Para saber el número de columnas.
dim(m)[2]
## [1] 4

Y para saber el número de elementos de la matriz usaremos la función length()

# Para saber el número de elementos de la matriz.
length(m)
## [1] 20

Por último, para saber si un objeto es una matriz. Usaremos la función is.matrix().

is.matrix(m)
## [1] TRUE

En el siguiente capítulo se mostrará como realizar operaciones matemáticas y estadísticas con matrices.