Santiago Humberto Londoño Restrepo
March 30, 2016
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.
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.
El primero son los elementos que se desean almacenar, los cuales R organizará dentro de columanas y filas. En el ejemplo anterior los elementos almacenados en la matriz m1 fueron los números 1 hasta el 9.
El segundo permite configurar el número de filas
El tercero perimite configurar el número de columnas
El cuarto indica el orden con que los elementos seran ordenados dentro de la matriz
El quinto es para proporcionar el nombre a las filas y a las columnas
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
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
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
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:
¿Cuál es el promedio de taquilla para todas las películas fuera de EEUU?
¿Cuál es el promedio de taquilla para las películas “A new hope” y “Return of the Jedi” en EEUU?
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.
¿Cuál es la taquilla total de las tres películas en todo el mundo?
¿Cuál es la taquilla total de las tres películas para EEUU y par el resto del mundo?
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
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
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?
#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
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?
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
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