Matriz

es una extensión de un vector a dos dimensiones, lo que implica que dispone del atributo dimension. El atributo dimensión es en si mismo un vector de longitud 2 (numero de filas, numero de columnas). Una matriz se utiliza para representar datos de un único tipo en dos dimensiones.

Las matrices son vectores, pero que están dispuestos en renglones y columnas, por ejemplo:

m1 <- matrix(1:20, nrow = 4, ncol = 5)

Genera una matriz de 4 renglones por 5 columnas. Experimenta con:

print(m1)
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    5    9   13   17
## [2,]    2    6   10   14   18
## [3,]    3    7   11   15   19
## [4,]    4    8   12   16   20

Nota que para hacer alusión a un elemento particular de una matriz se deben especificar dos subíndices, el primero para el reglón y el segundo para la columna. Así, si queremos saber el valor del elemento en el renglón 3, columna 2, debemos escribir:

m1[3,2]
## [1] 7

Para obtener un renglón completo de una matriz, por ejemplo e renglón 4, escribimos:

m1[4, ]
## [1]  4  8 12 16 20

De la misma manera podemos hacerlo para una columna completa, por ejemplo la 3:

m1[, 3]
## [1]  9 10 11 12

¿Qué hacen los siguientes estatutos?

m1[2, 1:3]   #fila 2, columnas del 1 al 3 
## [1]  2  6 10
m1[3, -5]    #fila3, columnas...todas menos la columna5
## [1]  3  7 11 15
m1[2:4, 1]   #fila 2 a 4, columna 1
## [1] 2 3 4
m1[-3, 4]    # todas menos la fila 3, columna 4 
## [1] 13 14 16

A partir de un vector, si le añadimos el atributo dimensión podemos obtener una matriz:

m <- 1:12
m
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12
dim(m) <- c(4, 3)
m
##      [,1] [,2] [,3]
## [1,]    1    5    9
## [2,]    2    6   10
## [3,]    3    7   11
## [4,]    4    8   12

Cuando creamos una matriz, los valores que pasamos son ordenados por columnas. Pero también es posible llenar la matriz por filas especificando el argumento byrow = TRUE:

matriz <- matrix(1:12, nrow = 4, byrow = TRUE)
matriz
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    5    6
## [3,]    7    8    9
## [4,]   10   11   12
matriz <- matrix(1:12, nrow = 4, ncol = 3)
matriz
##      [,1] [,2] [,3]
## [1,]    1    5    9
## [2,]    2    6   10
## [3,]    3    7   11
## [4,]    4    8   12

En el siguiente ejemplo hacemos uso del argumento dimnames para dar nombre a las filas y columnas:

automoviles <- matrix(
                 1:12,
                 nrow = 4,
                 byrow = TRUE,
                 dimnames = list(
                   c("Blanco", "Rojo", "Negro", "Gris"),
                   c("Toyota", "Audi", "Nissan")
                 )
 )
automoviles
##        Toyota Audi Nissan
## Blanco      1    2      3
## Rojo        4    5      6
## Negro       7    8      9
## Gris       10   11     12

Mediante las funciones cbind() y rbind() es posible crear matrices por columnas o por filas a partir de dos vectores de la misma longitud:

v1 <- c(1, 2, 3)
v2 <- c(4, 5, 6)
m1 <- cbind(v1, v2) #unir por columnas
m1
##      v1 v2
## [1,]  1  4
## [2,]  2  5
## [3,]  3  6
v1 <- c(1, 2, 3)
v2 <- c(4, 5, 6)
m1 <- rbind(v1, v2) #unir por filas
m1
##    [,1] [,2] [,3]
## v1    1    2    3
## v2    4    5    6

Además con las funciones nrow() y ncol() podemos conocer el número de filas y columnas, respectivamente:

nrow(automoviles)
## [1] 4
ncol(automoviles)
## [1] 3

La función length() que hemos visto con anterioridad en los vectores, también funciona en matrices. Cuando trabajamos con matrices; no obstante, devuelve el producto de cada una de las dimensiones:

length(automoviles)  
## [1] 12

Del mismo modo que los vectores poseen el atributo names para sus elementos, las matrices disponen de rownames y colnames para las filas y columnas.

colores <- rownames(automoviles)
colores
## [1] "Blanco" "Rojo"   "Negro"  "Gris"
marcas <- colnames(automoviles)
marcas
## [1] "Toyota" "Audi"   "Nissan"

Por medio de la función dimnames() obtendremos una lista que contiene dos vectores con los atributos rownames y colnames:

 dimnames(automoviles)
## [[1]]
## [1] "Blanco" "Rojo"   "Negro"  "Gris"  
## 
## [[2]]
## [1] "Toyota" "Audi"   "Nissan"

Operaciones con Matrices

La función diag() extrae la diagonal principal de una matriz:

A <- matrix(c(1, 2, 3, 4, 5, 6, 7, 8, 9), nrow = 3, ncol = 3, byrow = TRUE)
A
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    5    6
## [3,]    7    8    9
diag(A)
## [1] 1 5 9

Además, diag() nos permite crear matrices diagonales:

diag(c(1, 2, 3, 4))
##      [,1] [,2] [,3] [,4]
## [1,]    1    0    0    0
## [2,]    0    2    0    0
## [3,]    0    0    3    0
## [4,]    0    0    0    4

La matriz identidad es muy fácil de crear en R. Por ejemplo, la matriz identidad de dimensión 4 es:

Id<- diag(1, nrow = 4)
Id
##      [,1] [,2] [,3] [,4]
## [1,]    1    0    0    0
## [2,]    0    1    0    0
## [3,]    0    0    1    0
## [4,]    0    0    0    1

Selección de Elementos

Los elementos de una matriz están indexados con dos índices lo cual hace que resulte fácil acceder a los elementos y trabajar con ellos si lo que nos interesa es sólo una parte de la información contenida en una matriz y no la matriz entera, esto se logra con el operador de indexación [i, j] donde i es el elemento fila y j es el elemento columna.

Siguiendo con el ejemplo anterior, si quisiéramos seleccionar el número de automóviles blancos correspondiente a la marca Audi podríamos hacerlo de dos maneras:

Escribiendo el nombre de la matriz y entre corchetes los nombres de la fila y columnas entre comillas:

automoviles["Blanco", "Audi"]
## [1] 2

Alternativamente, podemos utilizar la notación de índices:

automoviles[1, 2]
## [1] 2

También podemos seleccionar columnas y filas enteras, de manera que si queremos seleccionar todos los automóviles blancos lo haríamos del siguiente modo:

automoviles[1,]
## Toyota   Audi Nissan 
##      1      2      3
# otra forma de hacerlo es
automoviles["Blanco",]
## Toyota   Audi Nissan 
##      1      2      3

Agregar Filas y Columnas

Podemos emplear las funciones cbind() y rbind() para agregar filas y columnas a una matriz que hemos creado con anterioridad:

# Añadimos una nueva fila a la matriz
verde <- c(8, 5, 7)
automoviles <- rbind(automoviles, verde)
automoviles
##        Toyota Audi Nissan
## Blanco      1    2      3
## Rojo        4    5      6
## Negro       7    8      9
## Gris       10   11     12
## verde       8    5      7
 # Añadimos una nueva columna
Ford <- c(2, 7, 3, 5, 9)
automoviles <- cbind(automoviles, Ford)
automoviles
##        Toyota Audi Nissan Ford
## Blanco      1    2      3    2
## Rojo        4    5      6    7
## Negro       7    8      9    3
## Gris       10   11     12    5
## verde       8    5      7    9

Eliminar Filas y Columnas

Para eliminar filas utilizaremos la notación [-i,], de forma similar para eliminar columnas utilizaremos la notación [, -j]. A modo de ejemplo, vamos a eliminar la fila y columna que hemos añadido en el apartado anterior:

#Eliminando la fila verde
automoviles[-5, ]
##        Toyota Audi Nissan Ford
## Blanco      1    2      3    2
## Rojo        4    5      6    7
## Negro       7    8      9    3
## Gris       10   11     12    5
# Eliminando columna ford
automoviles[, -4]
##        Toyota Audi Nissan
## Blanco      1    2      3
## Rojo        4    5      6
## Negro       7    8      9
## Gris       10   11     12
## verde       8    5      7