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
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
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