Matrices en R

Al igual que los vectores, las matrices pueden ser de diversos tipos

# ? matrix

Hay varias maneras de generar matrices

matrix(0,3,3)
##      [,1] [,2] [,3]
## [1,]    0    0    0
## [2,]    0    0    0
## [3,]    0    0    0
matrix(1:9,3,3)
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9
matrix(1:9,3,3,byrow=TRUE)
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    5    6
## [3,]    7    8    9
matrix(1:10,3,3) #extiende una advertencia
## Warning in matrix(1:10, 3, 3): la longitud de los datos [10] no es un
## submúltiplo o múltiplo del número de filas [3] en la matriz
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9
matrix(c("hola", "adios"),3,3) #extiende una advertencia
## Warning in matrix(c("hola", "adios"), 3, 3): la longitud de los datos [2]
## no es un submúltiplo o múltiplo del número de filas [3] en la matriz
##      [,1]    [,2]    [,3]   
## [1,] "hola"  "adios" "hola" 
## [2,] "adios" "hola"  "adios"
## [3,] "hola"  "adios" "hola"

Generando una matriz con datos aleatorios

vec <- sample(1:20, 20, replace = TRUE)
vec
##  [1] 12  3  6 10 19 15 19  1  6  7  1 18  2  1  2  8 15 12  9 11
mat <- matrix(vec, nrow = 4, ncol = 5, byrow = FALSE)
mat
##      [,1] [,2] [,3] [,4] [,5]
## [1,]   12   19    6    2   15
## [2,]    3   15    7    1   12
## [3,]    6   19    1    2    9
## [4,]   10    1   18    8   11

Accediendo a elementos de una matriz

mat[2,1]    # Renglón 2 columna 1]
## [1] 3
mat[1,]     # El renglón 1 y toda la columna
## [1] 12 19  6  2 15
mat[,2]     # La columna 2 y todo el renglón
## [1] 19 15 19  1

Cambiar el orden de una matrix mediante t()

mat
##      [,1] [,2] [,3] [,4] [,5]
## [1,]   12   19    6    2   15
## [2,]    3   15    7    1   12
## [3,]    6   19    1    2    9
## [4,]   10    1   18    8   11
tmat <- t(mat)
tmat
##      [,1] [,2] [,3] [,4]
## [1,]   12    3    6   10
## [2,]   19   15   19    1
## [3,]    6    7    1   18
## [4,]    2    1    2    8
## [5,]   15   12    9   11

Operaciones matematicas con matrices

 mat * 2
##      [,1] [,2] [,3] [,4] [,5]
## [1,]   24   38   12    4   30
## [2,]    6   30   14    2   24
## [3,]   12   38    2    4   18
## [4,]   20    2   36   16   22
 mat ^ 2
##      [,1] [,2] [,3] [,4] [,5]
## [1,]  144  361   36    4  225
## [2,]    9  225   49    1  144
## [3,]   36  361    1    4   81
## [4,]  100    1  324   64  121
 mat * mat
##      [,1] [,2] [,3] [,4] [,5]
## [1,]  144  361   36    4  225
## [2,]    9  225   49    1  144
## [3,]   36  361    1    4   81
## [4,]  100    1  324   64  121

Operaciones de matrices

mat1 <- matrix(sample(1:9, 9, replace = TRUE), nrow = 3, ncol = 3, byrow = FALSE)
mat1
##      [,1] [,2] [,3]
## [1,]    9    8    1
## [2,]    5    5    9
## [3,]    8    6    3
mat2 <- matrix(sample(1:9, 9, replace = TRUE), nrow = 3, ncol = 3, byrow = FALSE)

mat2
##      [,1] [,2] [,3]
## [1,]    9    4    1
## [2,]    4    7    3
## [3,]    7    8    6
mat3 <- mat1 + mat2
mat3
##      [,1] [,2] [,3]
## [1,]   18   12    2
## [2,]    9   12   12
## [3,]   15   14    9
mat3 <- mat1 * mat2
mat3
##      [,1] [,2] [,3]
## [1,]   81   32    1
## [2,]   20   35   27
## [3,]   56   48   18

Operaciones estadísticas con matrices

mat
##      [,1] [,2] [,3] [,4] [,5]
## [1,]   12   19    6    2   15
## [2,]    3   15    7    1   12
## [3,]    6   19    1    2    9
## [4,]   10    1   18    8   11
colMeans(mat)    # ; mean(c(mat[1,1], mat[2,1], mat[3,1], mat[4,1]))
## [1]  7.75 13.50  8.00  3.25 11.75
rowMeans(mat)    # ; mean(c(mat[1,1], mat[1,2], mat[1,3], mat[1,4], mat[1,5]))
## [1] 10.8  7.6  7.4  9.6

Agregando una nueva columna a mat

mat
##      [,1] [,2] [,3] [,4] [,5]
## [1,]   12   19    6    2   15
## [2,]    3   15    7    1   12
## [3,]    6   19    1    2    9
## [4,]   10    1   18    8   11
cbind(mat, c(10, 9, 14, 19)) # Solo muestra la nueva columna en mat
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]   12   19    6    2   15   10
## [2,]    3   15    7    1   12    9
## [3,]    6   19    1    2    9   14
## [4,]   10    1   18    8   11   19
mat <- cbind(mat, c(10, 9, 14, 19)) # Agrega definitivamente la nueva columna

mat
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]   12   19    6    2   15   10
## [2,]    3   15    7    1   12    9
## [3,]    6   19    1    2    9   14
## [4,]   10    1   18    8   11   19

Agregando nuevo renglón a mat

mat
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]   12   19    6    2   15   10
## [2,]    3   15    7    1   12    9
## [3,]    6   19    1    2    9   14
## [4,]   10    1   18    8   11   19
rbind(mat, c(12, 8, 6, 18, 9, NA)) # Solo muestra nuevo Ren
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]   12   19    6    2   15   10
## [2,]    3   15    7    1   12    9
## [3,]    6   19    1    2    9   14
## [4,]   10    1   18    8   11   19
## [5,]   12    8    6   18    9   NA
mat <- rbind(mat, c(12, 8, 6, 18, 9, NA)) # Agrega definitivamente nuevo  renglón 

mat
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]   12   19    6    2   15   10
## [2,]    3   15    7    1   12    9
## [3,]    6   19    1    2    9   14
## [4,]   10    1   18    8   11   19
## [5,]   12    8    6   18    9   NA

Agregando las medias de renglones y columnas a mat

# Nueva columna con media de renglones

mat <- cbind(mat, rowMeans(mat)) # Agrega

mat
##      [,1] [,2] [,3] [,4] [,5] [,6]      [,7]
## [1,]   12   19    6    2   15   10 10.666667
## [2,]    3   15    7    1   12    9  7.833333
## [3,]    6   19    1    2    9   14  8.500000
## [4,]   10    1   18    8   11   19 11.166667
## [5,]   12    8    6   18    9   NA        NA
mat <- rbind(mat, colMeans(mat)) # Agrega

mat
##      [,1] [,2] [,3] [,4] [,5] [,6]      [,7]
## [1,] 12.0 19.0  6.0  2.0 15.0   10 10.666667
## [2,]  3.0 15.0  7.0  1.0 12.0    9  7.833333
## [3,]  6.0 19.0  1.0  2.0  9.0   14  8.500000
## [4,] 10.0  1.0 18.0  8.0 11.0   19 11.166667
## [5,] 12.0  8.0  6.0 18.0  9.0   NA        NA
## [6,]  8.6 12.4  7.6  6.2 11.2   NA        NA

Preguntar si es una matrix

  • is.vector
  • is.list
  • is.matrix
is.matrix(mat)
## [1] TRUE

Función apply con matrices

Con una matriz sencilla de 3 X 3

# Nuevo valor de la matrix mat
mat <- matrix(c(3,4,5,6,8,4), nrow=3, ncol= 3)
mat
##      [,1] [,2] [,3]
## [1,]    3    6    3
## [2,]    4    8    4
## [3,]    5    4    5
# ? apply
apply(mat, 1, mean)
## [1] 4.000000 5.333333 4.666667
apply(mat, 2, mean)
## [1] 4 6 4
# Entonces agregando con rbind y cbind nuevo renglón y nueva columna
# apply
mat <- cbind(mat, apply(mat, 1, mean)) 
mat
##      [,1] [,2] [,3]     [,4]
## [1,]    3    6    3 4.000000
## [2,]    4    8    4 5.333333
## [3,]    5    4    5 4.666667
mat <- rbind(mat, apply(mat, 2, mean))
mat
##      [,1] [,2] [,3]     [,4]
## [1,]    3    6    3 4.000000
## [2,]    4    8    4 5.333333
## [3,]    5    4    5 4.666667
## [4,]    4    6    4 4.666667