Matriz (Matrix)

Santiago Humberto Londoño Restrepo

March 30, 2016

Matriz

Esta semana aprenderemos sobre un importante objeto de almacenamiento, denominado Matriz. El objetivo de enseñar este objeto de almacenamiento es que ustedes continuen socializandose con la programación, de esa manera se practicará la creación de objetos a partir de funciones, el uso de argumentos de funciones, la selección de elementos de un objeto de almacenamiento y la aplicación de funciones que calculan métodos estadísticos sobre selecciones predefinidas.

¿Qué es una matriz?

En R, una matriz es un objeto de almacenamiento de datos del mismo tipo (numericos, caracter, lógicos, etc), organizados dentro de un número fijo de columnas y filas.

Usted puede crear una matriz con la función matrix()

Ejemplo

m1 <- matrix(1:9, nrow = 3, ncol = 3, byrow = FALSE, dimnames = NULL)
m1
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9

¿Usted notó que se usaron diferentes argumentos de la función matrix()?¿Cuántos argumentos tendrá?

Recuerda que para averiguar los argumentos de una función y el significado de cada uno de ellos simplemente digitamos el siguiente código:

También podemos utilizar

?matrix
## starting httpd help server ...
##  done

La función matrix() tiene 5 argumentos.

Ejemplo

m1 <- matrix(1:9, nrow = 3, ncol = 3, byrow = FALSE, dimnames = NULL)
m1
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9

Ejemplo

m2 <- matrix(1:9, nrow = 3, ncol = 3, byrow = TRUE, dimnames = NULL)
m2
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    5    6
## [3,]    7    8    9

Utilizando el argumento dimnames

Los siguientes vectores almacenan la taquilla en millones de dólares de las primeras 3 peliculas de Star Wars. El primer elemento de cada vector indica la taquilla realizada en Estados Unidos y el segundo elemento indica la taquilla realizada fuera de Estados Unidos (el resto del mundo). Con esos elementos construir una matriz que almacene la taquilla de las tres películas tanto en EEUU como en el resto del mundo. Tenga en cuenta que las filas deben corresponder con el nombre de las peliculas y las columnas con el nombre del lugar donde se realizaron las taquillas. Recuerda que la primera película se llamó “A new hope”, la segunda “The empire strikes back” y la tercera “Return of the Jedi”

new_hope <- c(461, 314.4)
empire_strikes <- c(290.5, 247.9)
return_jedi <- c(309.3, 165.8)
nombre_filas <- c("A new hope", "The empire strikes back", "Return of the Jedi")
nombre_columnas <- c("EEUU", "Resto del mundo")

# Creamos la matriz solicitada
star_wars_matrix <- matrix(c(new_hope, empire_strikes, return_jedi), 
                           nrow = 3, 
                           ncol = 2,
                           byrow = TRUE,
                           dimnames = list(nombre_filas, nombre_columnas))
#Imprimimos
star_wars_matrix
##                          EEUU Resto del mundo
## A new hope              461.0           314.4
## The empire strikes back 290.5           247.9
## Return of the Jedi      309.3           165.8

Selección de los elementos de una matriz (1)

Al igual que los vectores, para seleccionar elementos de una matriz utilizamos los corchetes []. Utilizamos la misma lógica, dentro de los corchetes colocamos lo que se desea seleccionar.

Los vectores son objetos de una dimensión, viendolo desde el punto de vista de matrices los vectores tienen muchas filas y una sola columna. En cambio, las matrices tienen multiples columnas y filas, de esa manera se dice que las matrices son objetos de dos dimensiones.

Dado lo anterior, tu debes usar una coma , dentro de los corchetes para decirle a R que quieres seleccionar de las filas (antes de la coma) y que deseas seleccionar de las columnas (después de la coma).

Ejemplo

Supongamos que deseas seleccionar de la matriz star_wars_matrix el elemento que se encuentra en la fila 1, columna 1. - star_wars_matrix[1,1]

Para seleccionar el elemento de la fila 3, columna 2 - star_wars_matrix[3, 2]

Para seleccionar los elementos que se encuentran en las filas 2 y 3 de las columnas 1 y 2 - star_wars_matrix[c(2:3), c(1:2)]

Para seleccionar los elementos que se encuentran en las filas 1 y 3 de las columnas 1 y 2 - star_wars_matrix[c(1, 3), c(1:2)]

Para seleccionar todos los elementos que se encuentran en la segunda columna - star_wars_matrix[ ,2]

Para seleccionar todos los elementos que se encuentran en la tercera fila - star_wars_matrix[3, ]

new_hope <- c(461, 314.4)
empire_strikes <- c(290.5, 247.9)
return_jedi <- c(309.3, 165.8)
nombre_filas <- c("A new hope", "The empire strikes back", "Return of the Jedi")
nombre_columnas <- c("EEUU", "Resto del mundo")

# Matriz
star_wars_matrix <- matrix(c(new_hope, empire_strikes, return_jedi), 
                           nrow = 3, 
                           ncol = 2,
                           byrow = TRUE,
                           dimnames = list(nombre_filas, nombre_columnas))

#Elemento de la fila 1, columna 1
star_wars_matrix[1, 1]
## [1] 461
#Para seleccionar el elemento de la fila 3, columna 2
star_wars_matrix[3, 2]
## [1] 165.8
#Para seleccionar los elementos que se encuentran en 
#las filas 2 y 3 de las columnas 1 y 2
star_wars_matrix[c(2:3), c(1:2)]
##                          EEUU Resto del mundo
## The empire strikes back 290.5           247.9
## Return of the Jedi      309.3           165.8
#Para seleccionar los elementos que se encuentran en 
#las filas 1 y 3 de las columnas 1 y 2
star_wars_matrix[c(1, 3), c(1:2)]
##                     EEUU Resto del mundo
## A new hope         461.0           314.4
## Return of the Jedi 309.3           165.8
#Para seleccionar todos los elementos que se encuentran en la segunda columna
star_wars_matrix[ ,2]
##              A new hope The empire strikes back      Return of the Jedi 
##                   314.4                   247.9                   165.8
#Para seleccionar todos los elementos que se encuentran en la tercera fila
star_wars_matrix[3, ]
##            EEUU Resto del mundo 
##           309.3           165.8

Ejercicio

Ahora pongamos en practica todo lo que has aprendido. A partir de la matriz star_wars_matrix, escriba un código que le permita responder las siguientes preguntas:

Recuerden que la matriz star_wars_matrix tiene la siguiente forma

##                          EEUU Resto del mundo
## A new hope              461.0           314.4
## The empire strikes back 290.5           247.9
## Return of the Jedi      309.3           165.8

Solución

new_hope <- c(461, 314.4)
empire_strikes <- c(290.5, 247.9)
return_jedi <- c(309.3, 165.8)
nombre_filas <- c("A new hope", "The empire strikes back", "Return of the Jedi")
nombre_columnas <- c("EEUU", "Resto del mundo")

# Matriz
star_wars_matrix <- matrix(c(new_hope, empire_strikes, return_jedi), 
                           nrow = 3, 
                           ncol = 2,
                           byrow = TRUE,
                           dimnames = list(nombre_filas, nombre_columnas))


#¿Cuál es el promedio de taquilla para todas las películas fuera de EEUU?
mean(star_wars_matrix[, 2])
## [1] 242.7
#¿Cuál es el promedio de taquilla para las películas "A new hope" y "Return of the Jedi" en EEUU?
mean(star_wars_matrix[c(1, 3), 1])
## [1] 385.15
#Cree un vector que almacene la taquilla a nivel mundial de cada una de las películas,
#llamelo: **taq_niv_mund_x_peli** e imprimalo.
taq_niv_mund_x_peli <- star_wars_matrix[,1] + star_wars_matrix[,2]
taq_niv_mund_x_peli
##              A new hope The empire strikes back      Return of the Jedi 
##                   775.4                   538.4                   475.1
#¿Cuál es la taquilla total de las tres películas en todo el mundo?
sum(taq_niv_mund_x_peli)
## [1] 1788.9
#¿Cuál es la taquilla total de las tres películas para EEUU y par el resto del mundo?
star_wars_matrix[1, ] + star_wars_matrix[2, ] + star_wars_matrix[3, ]
##            EEUU Resto del mundo 
##          1060.8           728.1

Aritmética básica con matrices 1

Al igual que con los vectores, las operaciones aritméticas como +, -, / y * se usan con las matrices. Esos operadoreres trabajan elemento a elemento sobre las matrices. Mira el siguiente ejemplo

star_wars_matrix
##                          EEUU Resto del mundo
## A new hope              461.0           314.4
## The empire strikes back 290.5           247.9
## Return of the Jedi      309.3           165.8
2 * star_wars_matrix
##                          EEUU Resto del mundo
## A new hope              922.0           628.8
## The empire strikes back 581.0           495.8
## Return of the Jedi      618.6           331.6

Ejercicio Suponga que el jefe George Lucas, creador de Star Wars, te contrata para que averigues cuantas personas fueron a ver cada película por cada zona geográfica. Asume que la entrada para cada película fue de 5 dólares. ¿Qué codigo escribirias para satisfacer las necesidades del gran jefe?

Solución

#Los datos se encuentran en la matriz star_wars_matrix
star_wars_matrix
##                          EEUU Resto del mundo
## A new hope              461.0           314.4
## The empire strikes back 290.5           247.9
## Return of the Jedi      309.3           165.8
star_wars_matrix/5
##                          EEUU Resto del mundo
## A new hope              92.20           62.88
## The empire strikes back 58.10           49.58
## Return of the Jedi      61.86           33.16

Aritmética básica con matrices 2

Así como 2 * star_wars_matrix multiplico cada elemento de la matriz por dos, matriz_1 * matriz_2 crea una matriz donde cada elemento es la multiplicación de los elementos correspondientes de matriz_1 y de matriz_2.

Ejemplo

matriz_1 <- matrix(1:4, nrow = 2, ncol = 2, byrow = FALSE, dimnames = NULL)
matriz_1
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4
matriz_2 <- matrix(c(10, 10, 10, 10), nrow = 2, ncol = 2, byrow = TRUE, dimnames = NULL)
matriz_2
##      [,1] [,2]
## [1,]   10   10
## [2,]   10   10
matriz_1 * matriz_2
##      [,1] [,2]
## [1,]   10   30
## [2,]   20   40

Ejercicio para que practiques en casa Suponga que el gran jefe George Lucas te pide, nuevamente, que calcules la cantidad de visitantes por película y por zona geográfica, ya que asumir un precio de entrada constante para cada pelicula es algo irrealista.

Tu, cómo buen investigador, encuentras el precio real de entrada por película:

¿Qué código escribirías para resolver esta nueva inquietud?

Adicionando Columnas

Supongamos que en cualquier ejercicio tienes la necesidad de adicionar una columna a una matriz previamente creada.

Tu puedes adicionar una o varias columnas a un matriz utilizando la función cbind()

Mira funcionando esta útil función en el campo de batalla

#Matriz star_wars_matrix
star_wars_matrix
##                          EEUU Resto del mundo
## A new hope              461.0           314.4
## The empire strikes back 290.5           247.9
## Return of the Jedi      309.3           165.8
#Asume que en un ejercicio pasado te solicitaron crear un vector con la taquilla total
#por película a nivel mundial.

Taquilla_x_peli <- star_wars_matrix[, 1] + star_wars_matrix[, 2]
Taquilla_x_peli
##              A new hope The empire strikes back      Return of the Jedi 
##                   775.4                   538.4                   475.1
#Luego te piden que adiciones o adjuntes el vector Taquilla_x_peli como una nueva columna
#a la matriz star_wars_matrix

star_wars_matrix <- cbind(star_wars_matrix, Taquilla_x_peli)
star_wars_matrix
##                          EEUU Resto del mundo Taquilla_x_peli
## A new hope              461.0           314.4           775.4
## The empire strikes back 290.5           247.9           538.4
## Return of the Jedi      309.3           165.8           475.1

Adicionando filas

Para adicionar una o varias filas debes utilizar la función rbind()

Observemos como funciona esta maravillosa función en el ejemplo anterior

#Supongamos que estamos trabajando con la siguiente matriz
new_hope <- c(461, 314.4)
empire_strikes <- c(290.5, 247.9)
return_jedi <- c(309.3, 165.8)
nombre_filas <- c("A new hope", "The empire strikes back", "Return of the Jedi")
nombre_columnas <- c("EEUU", "Resto del mundo")

# Matriz
star_wars_matrix <- matrix(c(new_hope, empire_strikes, return_jedi), 
                           nrow = 3, 
                           ncol = 2,
                           byrow = TRUE,
                           dimnames = list(nombre_filas, nombre_columnas))
#Imprimo matriz
star_wars_matrix
##                          EEUU Resto del mundo
## A new hope              461.0           314.4
## The empire strikes back 290.5           247.9
## Return of the Jedi      309.3           165.8
#Supon que te piden que adiciones a la matriz star_wars_matrix un fila que contenga 
#la taquilla recolectada en EEUU y en el resto del Mundo para todas las tres peliculas

#Creo un vector que almacene la taquilla por zona geográfica para todas las películas
Taquilla_x_zona <- star_wars_matrix[1,] + star_wars_matrix[2, ] + star_wars_matrix[3, ]
Taquilla_x_zona
##            EEUU Resto del mundo 
##          1060.8           728.1
#Finalmente adjunto el vector Taquilla_x_zona como una nueva fila de la matriz
#star_wars_matrix

star_wars_matrix <- rbind(star_wars_matrix, Taquilla_x_zona)
star_wars_matrix
##                           EEUU Resto del mundo
## A new hope               461.0           314.4
## The empire strikes back  290.5           247.9
## Return of the Jedi       309.3           165.8
## Taquilla_x_zona         1060.8           728.1