En R una matriz es una estructura bidimensional de datos homogéneos, mientras que un array permite trabajar con tres o más dimensiones. Una lista puede almacenar objetos de diferentes tipos y tamaños, y un data frame organiza variables en columnas y observaciones en filas.
En este documento se estudian estas estructuras desde lo básico hasta operaciones estadísticas y conversiones entre ellas.
A <- matrix(c(1,2,3,
4,5,6),
nrow = 2,
byrow = TRUE)
A
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 4 5 6
La matriz tiene 2 filas y 3 columnas. El argumento
byrow = TRUE indica que los datos se llenan por filas.
dim(A)
## [1] 2 3
nrow(A)
## [1] 2
ncol(A)
## [1] 3
A[1,1]
## [1] 1
A[2,3]
## [1] 6
A[1, ]
## [1] 1 2 3
A[, 2]
## [1] 2 5
La notación general es A[fila, columna].
B <- matrix(c(6,5,4,
3,2,1),
nrow = 2,
byrow = TRUE)
A + B
## [,1] [,2] [,3]
## [1,] 7 7 7
## [2,] 7 7 7
A - B
## [,1] [,2] [,3]
## [1,] -5 -3 -1
## [2,] 1 3 5
2 * A
## [,1] [,2] [,3]
## [1,] 2 4 6
## [2,] 8 10 12
A * B
## [,1] [,2] [,3]
## [1,] 6 10 12
## [2,] 12 10 6
A * B realiza multiplicación elemento a elemento.
Para producto matricial se usa %*%.
C <- matrix(c(1,2,
3,4,
5,6),
nrow = 3,
byrow = TRUE)
A %*% C
## [,1] [,2]
## [1,] 22 28
## [2,] 49 64
t(A)
## [,1] [,2]
## [1,] 1 4
## [2,] 2 5
## [3,] 3 6
rowSums(A)
## [1] 6 15
colSums(A)
## [1] 5 7 9
rowMeans(A)
## [1] 2 5
colMeans(A)
## [1] 2.5 3.5 4.5
M <- matrix(c(3,2,
1,4),
nrow = 2,
byrow = TRUE)
det(M)
## [1] 10
solve(M)
## [,1] [,2]
## [1,] 0.4 -0.2
## [2,] -0.1 0.3
M %*% solve(M)
## [,1] [,2]
## [1,] 1 0
## [2,] 0 1
Resolver:
\[ 2x+y=7, \qquad x+3y=11. \]
A_sis <- matrix(c(2,1,
1,3),
nrow = 2,
byrow = TRUE)
b <- c(7,11)
solucion <- solve(A_sis, b)
solucion
## [1] 2 3
A_sis %*% solucion
## [,1]
## [1,] 7
## [2,] 11
D <- matrix(c(2,1,0,
1,3,2,
0,2,4),
nrow = 3,
byrow = TRUE)
diag(D)
## [1] 2 3 4
sum(diag(D))
## [1] 9
diag(3)
## [,1] [,2] [,3]
## [1,] 1 0 0
## [2,] 0 1 0
## [3,] 0 0 1
eigen(D)
## eigen() decomposition
## $values
## [1] 5.6690791 2.4760236 0.8548973
##
## $vectors
## [,1] [,2] [,3]
## [1,] 0.1720265 0.7864357 -0.5932333
## [2,] 0.6311790 0.3743620 0.6793131
## [3,] 0.7563200 -0.4912963 -0.4319815
A3 <- array(1:24,
dim = c(2,3,4))
A3
## , , 1
##
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 2 4 6
##
## , , 2
##
## [,1] [,2] [,3]
## [1,] 7 9 11
## [2,] 8 10 12
##
## , , 3
##
## [,1] [,2] [,3]
## [1,] 13 15 17
## [2,] 14 16 18
##
## , , 4
##
## [,1] [,2] [,3]
## [1,] 19 21 23
## [2,] 20 22 24
La estructura es:
\[ 2\text{ filas}\times 3\text{ columnas}\times 4\text{ capas}. \]
dim(A3)
## [1] 2 3 4
A3[,,1]
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 2 4 6
A3[,,2]
## [,1] [,2] [,3]
## [1,] 7 9 11
## [2,] 8 10 12
A3[,,3]
## [,1] [,2] [,3]
## [1,] 13 15 17
## [2,] 14 16 18
A3[,,4]
## [,1] [,2] [,3]
## [1,] 19 21 23
## [2,] 20 22 24
A3[1,2,3]
## [1] 15
A3[2,3,4]
## [1] 24
La notación general es:
A3[fila, columna, capa].
Se registran las ventas de 3 productos durante 4 meses en 2 tiendas.
ventas <- array(
c(120,150,130,
140,160,170,
180,190,200,
210,220,230,
100,110,120,
130,140,150,
160,170,180,
190,200,210),
dim = c(3,4,2)
)
dimnames(ventas) <- list(
Producto = c("Producto A", "Producto B", "Producto C"),
Mes = c("Enero", "Febrero", "Marzo", "Abril"),
Tienda = c("Tienda 1", "Tienda 2")
)
ventas
## , , Tienda = Tienda 1
##
## Mes
## Producto Enero Febrero Marzo Abril
## Producto A 120 140 180 210
## Producto B 150 160 190 220
## Producto C 130 170 200 230
##
## , , Tienda = Tienda 2
##
## Mes
## Producto Enero Febrero Marzo Abril
## Producto A 100 130 160 190
## Producto B 110 140 170 200
## Producto C 120 150 180 210
ventas["Producto A", "Marzo", "Tienda 2"]
## [1] 160
ventas[, , "Tienda 1"]
## Mes
## Producto Enero Febrero Marzo Abril
## Producto A 120 140 180 210
## Producto B 150 160 190 220
## Producto C 130 170 200 230
ventas["Producto A", , ]
## Tienda
## Mes Tienda 1 Tienda 2
## Enero 120 100
## Febrero 140 130
## Marzo 180 160
## Abril 210 190
ventas[, "Marzo", ]
## Tienda
## Producto Tienda 1 Tienda 2
## Producto A 180 160
## Producto B 190 170
## Producto C 200 180
La función apply() tiene la estructura:
apply(X, MARGIN, FUN)
Para el array ventas:
apply(ventas, 1, mean)
## Producto A Producto B Producto C
## 153.75 167.50 173.75
apply(ventas, 2, mean)
## Enero Febrero Marzo Abril
## 121.6667 148.3333 180.0000 210.0000
apply(ventas, 3, mean)
## Tienda 1 Tienda 2
## 175 155
apply(ventas, c(1,2), mean)
## Mes
## Producto Enero Febrero Marzo Abril
## Producto A 110 135 170 200
## Producto B 130 150 180 210
## Producto C 125 160 190 220
apply(ventas, c(1,3), mean)
## Tienda
## Producto Tienda 1 Tienda 2
## Producto A 162.5 145
## Producto B 180.0 155
## Producto C 182.5 165
apply(ventas, c(2,3), mean)
## Tienda
## Mes Tienda 1 Tienda 2
## Enero 133.3333 110
## Febrero 156.6667 140
## Marzo 190.0000 170
## Abril 220.0000 200
apply(ventas, 1, sum)
## Producto A Producto B Producto C
## 1230 1340 1390
apply(ventas, 1, sd)
## Producto A Producto B Producto C
## 37.77282 35.35534 38.89087
apply(ventas, 1, var)
## Producto
## Producto A Producto B Producto C
## [1,] 1625 1000 1825
## [2,] 1550 1200 1650
## [3,] 1550 1200 1650
## [4,] 1500 1500 1500
apply(ventas, 3, max)
## Tienda 1 Tienda 2
## 230 210
apply(ventas, 3, min)
## Tienda 1 Tienda 2
## 120 100
apply(ventas, 2, median)
## Enero Febrero Marzo Abril
## 120 145 180 210
ventas5 <- array(101:160,
dim = c(3,4,5))
dimnames(ventas5) <- list(
Producto = c("Producto A", "Producto B", "Producto C"),
Mes = c("Enero", "Febrero", "Marzo", "Abril"),
Tienda = paste("Tienda", 1:5)
)
ventas5
## , , Tienda = Tienda 1
##
## Mes
## Producto Enero Febrero Marzo Abril
## Producto A 101 104 107 110
## Producto B 102 105 108 111
## Producto C 103 106 109 112
##
## , , Tienda = Tienda 2
##
## Mes
## Producto Enero Febrero Marzo Abril
## Producto A 113 116 119 122
## Producto B 114 117 120 123
## Producto C 115 118 121 124
##
## , , Tienda = Tienda 3
##
## Mes
## Producto Enero Febrero Marzo Abril
## Producto A 125 128 131 134
## Producto B 126 129 132 135
## Producto C 127 130 133 136
##
## , , Tienda = Tienda 4
##
## Mes
## Producto Enero Febrero Marzo Abril
## Producto A 137 140 143 146
## Producto B 138 141 144 147
## Producto C 139 142 145 148
##
## , , Tienda = Tienda 5
##
## Mes
## Producto Enero Febrero Marzo Abril
## Producto A 149 152 155 158
## Producto B 150 153 156 159
## Producto C 151 154 157 160
apply(ventas5, 1, mean)
## Producto A Producto B Producto C
## 129.5 130.5 131.5
apply(ventas5, 2, mean)
## Enero Febrero Marzo Abril
## 126 129 132 135
apply(ventas5, 3, mean)
## Tienda 1 Tienda 2 Tienda 3 Tienda 4 Tienda 5
## 106.5 118.5 130.5 142.5 154.5
apply(ventas5, c(1,2), mean)
## Mes
## Producto Enero Febrero Marzo Abril
## Producto A 125 128 131 134
## Producto B 126 129 132 135
## Producto C 127 130 133 136
apply(ventas5, c(1,3), mean)
## Tienda
## Producto Tienda 1 Tienda 2 Tienda 3 Tienda 4 Tienda 5
## Producto A 105.5 117.5 129.5 141.5 153.5
## Producto B 106.5 118.5 130.5 142.5 154.5
## Producto C 107.5 119.5 131.5 143.5 155.5
apply(ventas5, c(2,3), mean)
## Tienda
## Mes Tienda 1 Tienda 2 Tienda 3 Tienda 4 Tienda 5
## Enero 102 114 126 138 150
## Febrero 105 117 129 141 153
## Marzo 108 120 132 144 156
## Abril 111 123 135 147 159
apply(ventas5, 1, sd)
## Producto A Producto B Producto C
## 17.74824 17.74824 17.74824
apply(ventas5, 3, max)
## Tienda 1 Tienda 2 Tienda 3 Tienda 4 Tienda 5
## 112 124 136 148 160
apply(ventas5, 3, min)
## Tienda 1 Tienda 2 Tienda 3 Tienda 4 Tienda 5
## 101 113 125 137 149
notas <- array(
c(
4.2, 3.5, 4.0, 2.8,
3.8, 4.1, 3.6, 3.2,
4.5, 3.9, 4.3, 3.7,
4.4, 3.7, 4.2, 3.1,
4.0, 4.3, 3.8, 3.5,
4.6, 4.1, 4.5, 3.9
),
dim = c(4,3,2)
)
dimnames(notas) <- list(
Estudiante = c("Ana", "Carlos", "Laura", "Pedro"),
Asignatura = c("Estadistica", "Calculo", "Programacion"),
Corte = c("Corte 1", "Corte 2")
)
notas
## , , Corte = Corte 1
##
## Asignatura
## Estudiante Estadistica Calculo Programacion
## Ana 4.2 3.8 4.5
## Carlos 3.5 4.1 3.9
## Laura 4.0 3.6 4.3
## Pedro 2.8 3.2 3.7
##
## , , Corte = Corte 2
##
## Asignatura
## Estudiante Estadistica Calculo Programacion
## Ana 4.4 4.0 4.6
## Carlos 3.7 4.3 4.1
## Laura 4.2 3.8 4.5
## Pedro 3.1 3.5 3.9
apply(notas, 1, mean)
## Ana Carlos Laura Pedro
## 4.250000 3.933333 4.066667 3.366667
apply(notas, 2, mean)
## Estadistica Calculo Programacion
## 3.7375 3.7875 4.1875
apply(notas, 3, mean)
## Corte 1 Corte 2
## 3.800000 4.008333
apply(notas, c(1,2), mean)
## Asignatura
## Estudiante Estadistica Calculo Programacion
## Ana 4.30 3.90 4.55
## Carlos 3.60 4.20 4.00
## Laura 4.10 3.70 4.40
## Pedro 2.95 3.35 3.80
datos <- as.data.frame.table(notas,
responseName = "Nota")
datos
## Estudiante Asignatura Corte Nota
## 1 Ana Estadistica Corte 1 4.2
## 2 Carlos Estadistica Corte 1 3.5
## 3 Laura Estadistica Corte 1 4.0
## 4 Pedro Estadistica Corte 1 2.8
## 5 Ana Calculo Corte 1 3.8
## 6 Carlos Calculo Corte 1 4.1
## 7 Laura Calculo Corte 1 3.6
## 8 Pedro Calculo Corte 1 3.2
## 9 Ana Programacion Corte 1 4.5
## 10 Carlos Programacion Corte 1 3.9
## 11 Laura Programacion Corte 1 4.3
## 12 Pedro Programacion Corte 1 3.7
## 13 Ana Estadistica Corte 2 4.4
## 14 Carlos Estadistica Corte 2 3.7
## 15 Laura Estadistica Corte 2 4.2
## 16 Pedro Estadistica Corte 2 3.1
## 17 Ana Calculo Corte 2 4.0
## 18 Carlos Calculo Corte 2 4.3
## 19 Laura Calculo Corte 2 3.8
## 20 Pedro Calculo Corte 2 3.5
## 21 Ana Programacion Corte 2 4.6
## 22 Carlos Programacion Corte 2 4.1
## 23 Laura Programacion Corte 2 4.5
## 24 Pedro Programacion Corte 2 3.9
str(datos)
## 'data.frame': 24 obs. of 4 variables:
## $ Estudiante: Factor w/ 4 levels "Ana","Carlos",..: 1 2 3 4 1 2 3 4 1 2 ...
## $ Asignatura: Factor w/ 3 levels "Estadistica",..: 1 1 1 1 2 2 2 2 3 3 ...
## $ Corte : Factor w/ 2 levels "Corte 1","Corte 2": 1 1 1 1 1 1 1 1 1 1 ...
## $ Nota : num 4.2 3.5 4 2.8 3.8 4.1 3.6 3.2 4.5 3.9 ...
dim(datos)
## [1] 24 4
head(datos)
## Estudiante Asignatura Corte Nota
## 1 Ana Estadistica Corte 1 4.2
## 2 Carlos Estadistica Corte 1 3.5
## 3 Laura Estadistica Corte 1 4.0
## 4 Pedro Estadistica Corte 1 2.8
## 5 Ana Calculo Corte 1 3.8
## 6 Carlos Calculo Corte 1 4.1
Ahora cada fila representa una observación con las variables Estudiante, Asignatura, Corte y Nota.
aggregate(Nota ~ Estudiante,
data = datos,
FUN = mean)
## Estudiante Nota
## 1 Ana 4.250000
## 2 Carlos 3.933333
## 3 Laura 4.066667
## 4 Pedro 3.366667
aggregate(Nota ~ Asignatura,
data = datos,
FUN = mean)
## Asignatura Nota
## 1 Estadistica 3.7375
## 2 Calculo 3.7875
## 3 Programacion 4.1875
aggregate(Nota ~ Corte,
data = datos,
FUN = mean)
## Corte Nota
## 1 Corte 1 3.800000
## 2 Corte 2 4.008333
aggregate(Nota ~ Estudiante + Asignatura,
data = datos,
FUN = mean)
## Estudiante Asignatura Nota
## 1 Ana Estadistica 4.30
## 2 Carlos Estadistica 3.60
## 3 Laura Estadistica 4.10
## 4 Pedro Estadistica 2.95
## 5 Ana Calculo 3.90
## 6 Carlos Calculo 4.20
## 7 Laura Calculo 3.70
## 8 Pedro Calculo 3.35
## 9 Ana Programacion 4.55
## 10 Carlos Programacion 4.00
## 11 Laura Programacion 4.40
## 12 Pedro Programacion 3.80
datos[datos$Nota >= 4, ]
## Estudiante Asignatura Corte Nota
## 1 Ana Estadistica Corte 1 4.2
## 3 Laura Estadistica Corte 1 4.0
## 6 Carlos Calculo Corte 1 4.1
## 9 Ana Programacion Corte 1 4.5
## 11 Laura Programacion Corte 1 4.3
## 13 Ana Estadistica Corte 2 4.4
## 15 Laura Estadistica Corte 2 4.2
## 17 Ana Calculo Corte 2 4.0
## 18 Carlos Calculo Corte 2 4.3
## 21 Ana Programacion Corte 2 4.6
## 22 Carlos Programacion Corte 2 4.1
## 23 Laura Programacion Corte 2 4.5
datos[datos$Asignatura == "Estadistica", ]
## Estudiante Asignatura Corte Nota
## 1 Ana Estadistica Corte 1 4.2
## 2 Carlos Estadistica Corte 1 3.5
## 3 Laura Estadistica Corte 1 4.0
## 4 Pedro Estadistica Corte 1 2.8
## 13 Ana Estadistica Corte 2 4.4
## 14 Carlos Estadistica Corte 2 3.7
## 15 Laura Estadistica Corte 2 4.2
## 16 Pedro Estadistica Corte 2 3.1
datos_ordenados <- datos[order(datos$Nota,
decreasing = TRUE), ]
head(datos_ordenados)
## Estudiante Asignatura Corte Nota
## 21 Ana Programacion Corte 2 4.6
## 9 Ana Programacion Corte 1 4.5
## 23 Laura Programacion Corte 2 4.5
## 13 Ana Estadistica Corte 2 4.4
## 11 Laura Programacion Corte 1 4.3
## 18 Carlos Calculo Corte 2 4.3
datos$Estado <- ifelse(datos$Nota >= 3,
"Aprueba",
"No aprueba")
datos
## Estudiante Asignatura Corte Nota Estado
## 1 Ana Estadistica Corte 1 4.2 Aprueba
## 2 Carlos Estadistica Corte 1 3.5 Aprueba
## 3 Laura Estadistica Corte 1 4.0 Aprueba
## 4 Pedro Estadistica Corte 1 2.8 No aprueba
## 5 Ana Calculo Corte 1 3.8 Aprueba
## 6 Carlos Calculo Corte 1 4.1 Aprueba
## 7 Laura Calculo Corte 1 3.6 Aprueba
## 8 Pedro Calculo Corte 1 3.2 Aprueba
## 9 Ana Programacion Corte 1 4.5 Aprueba
## 10 Carlos Programacion Corte 1 3.9 Aprueba
## 11 Laura Programacion Corte 1 4.3 Aprueba
## 12 Pedro Programacion Corte 1 3.7 Aprueba
## 13 Ana Estadistica Corte 2 4.4 Aprueba
## 14 Carlos Estadistica Corte 2 3.7 Aprueba
## 15 Laura Estadistica Corte 2 4.2 Aprueba
## 16 Pedro Estadistica Corte 2 3.1 Aprueba
## 17 Ana Calculo Corte 2 4.0 Aprueba
## 18 Carlos Calculo Corte 2 4.3 Aprueba
## 19 Laura Calculo Corte 2 3.8 Aprueba
## 20 Pedro Calculo Corte 2 3.5 Aprueba
## 21 Ana Programacion Corte 2 4.6 Aprueba
## 22 Carlos Programacion Corte 2 4.1 Aprueba
## 23 Laura Programacion Corte 2 4.5 Aprueba
## 24 Pedro Programacion Corte 2 3.9 Aprueba
Crear una variable categórica de desempeño:
datos$Desempeno <- cut(
datos$Nota,
breaks = c(-Inf, 2.9, 3.9, 4.5, Inf),
labels = c("Bajo", "Aceptable", "Alto", "Excelente")
)
datos
## Estudiante Asignatura Corte Nota Estado Desempeno
## 1 Ana Estadistica Corte 1 4.2 Aprueba Alto
## 2 Carlos Estadistica Corte 1 3.5 Aprueba Aceptable
## 3 Laura Estadistica Corte 1 4.0 Aprueba Alto
## 4 Pedro Estadistica Corte 1 2.8 No aprueba Bajo
## 5 Ana Calculo Corte 1 3.8 Aprueba Aceptable
## 6 Carlos Calculo Corte 1 4.1 Aprueba Alto
## 7 Laura Calculo Corte 1 3.6 Aprueba Aceptable
## 8 Pedro Calculo Corte 1 3.2 Aprueba Aceptable
## 9 Ana Programacion Corte 1 4.5 Aprueba Alto
## 10 Carlos Programacion Corte 1 3.9 Aprueba Aceptable
## 11 Laura Programacion Corte 1 4.3 Aprueba Alto
## 12 Pedro Programacion Corte 1 3.7 Aprueba Aceptable
## 13 Ana Estadistica Corte 2 4.4 Aprueba Alto
## 14 Carlos Estadistica Corte 2 3.7 Aprueba Aceptable
## 15 Laura Estadistica Corte 2 4.2 Aprueba Alto
## 16 Pedro Estadistica Corte 2 3.1 Aprueba Aceptable
## 17 Ana Calculo Corte 2 4.0 Aprueba Alto
## 18 Carlos Calculo Corte 2 4.3 Aprueba Alto
## 19 Laura Calculo Corte 2 3.8 Aprueba Aceptable
## 20 Pedro Calculo Corte 2 3.5 Aprueba Aceptable
## 21 Ana Programacion Corte 2 4.6 Aprueba Excelente
## 22 Carlos Programacion Corte 2 4.1 Aprueba Alto
## 23 Laura Programacion Corte 2 4.5 Aprueba Alto
## 24 Pedro Programacion Corte 2 3.9 Aprueba Aceptable
Una lista puede almacenar objetos de diferente tipo y tamaño.
mi_lista <- list(
nombre = "Ana",
edad = 21,
notas = c(4.2, 3.8, 4.5),
aprobado = TRUE
)
mi_lista
## $nombre
## [1] "Ana"
##
## $edad
## [1] 21
##
## $notas
## [1] 4.2 3.8 4.5
##
## $aprobado
## [1] TRUE
mi_lista$nombre
## [1] "Ana"
mi_lista$notas
## [1] 4.2 3.8 4.5
mi_lista[[2]]
## [1] 21
mi_lista[1]
## $nombre
## [1] "Ana"
Diferencia importante:
[[ ]] extrae el contenido del elemento;[ ] devuelve una sublista.lista_completa <- list(
matriz = A,
array3D = ventas,
datos = datos,
resumen = summary(datos$Nota)
)
lista_completa
## $matriz
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 4 5 6
##
## $array3D
## , , Tienda = Tienda 1
##
## Mes
## Producto Enero Febrero Marzo Abril
## Producto A 120 140 180 210
## Producto B 150 160 190 220
## Producto C 130 170 200 230
##
## , , Tienda = Tienda 2
##
## Mes
## Producto Enero Febrero Marzo Abril
## Producto A 100 130 160 190
## Producto B 110 140 170 200
## Producto C 120 150 180 210
##
##
## $datos
## Estudiante Asignatura Corte Nota Estado Desempeno
## 1 Ana Estadistica Corte 1 4.2 Aprueba Alto
## 2 Carlos Estadistica Corte 1 3.5 Aprueba Aceptable
## 3 Laura Estadistica Corte 1 4.0 Aprueba Alto
## 4 Pedro Estadistica Corte 1 2.8 No aprueba Bajo
## 5 Ana Calculo Corte 1 3.8 Aprueba Aceptable
## 6 Carlos Calculo Corte 1 4.1 Aprueba Alto
## 7 Laura Calculo Corte 1 3.6 Aprueba Aceptable
## 8 Pedro Calculo Corte 1 3.2 Aprueba Aceptable
## 9 Ana Programacion Corte 1 4.5 Aprueba Alto
## 10 Carlos Programacion Corte 1 3.9 Aprueba Aceptable
## 11 Laura Programacion Corte 1 4.3 Aprueba Alto
## 12 Pedro Programacion Corte 1 3.7 Aprueba Aceptable
## 13 Ana Estadistica Corte 2 4.4 Aprueba Alto
## 14 Carlos Estadistica Corte 2 3.7 Aprueba Aceptable
## 15 Laura Estadistica Corte 2 4.2 Aprueba Alto
## 16 Pedro Estadistica Corte 2 3.1 Aprueba Aceptable
## 17 Ana Calculo Corte 2 4.0 Aprueba Alto
## 18 Carlos Calculo Corte 2 4.3 Aprueba Alto
## 19 Laura Calculo Corte 2 3.8 Aprueba Aceptable
## 20 Pedro Calculo Corte 2 3.5 Aprueba Aceptable
## 21 Ana Programacion Corte 2 4.6 Aprueba Excelente
## 22 Carlos Programacion Corte 2 4.1 Aprueba Alto
## 23 Laura Programacion Corte 2 4.5 Aprueba Alto
## 24 Pedro Programacion Corte 2 3.9 Aprueba Aceptable
##
## $resumen
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 2.800 3.675 3.950 3.904 4.225 4.600
lista_completa$matriz
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 4 5 6
lista_completa$array3D[, , 1]
## Mes
## Producto Enero Febrero Marzo Abril
## Producto A 120 140 180 210
## Producto B 150 160 190 220
## Producto C 130 170 200 230
head(lista_completa$datos)
## Estudiante Asignatura Corte Nota Estado Desempeno
## 1 Ana Estadistica Corte 1 4.2 Aprueba Alto
## 2 Carlos Estadistica Corte 1 3.5 Aprueba Aceptable
## 3 Laura Estadistica Corte 1 4.0 Aprueba Alto
## 4 Pedro Estadistica Corte 1 2.8 No aprueba Bajo
## 5 Ana Calculo Corte 1 3.8 Aprueba Aceptable
## 6 Carlos Calculo Corte 1 4.1 Aprueba Alto
lista_completa$resumen
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 2.800 3.675 3.950 3.904 4.225 4.600
Siempre devuelve una lista.
lista_numeros <- list(
A = c(1,2,3,4),
B = c(10,20,30),
C = c(5,8,12,15,20)
)
lapply(lista_numeros, mean)
## $A
## [1] 2.5
##
## $B
## [1] 20
##
## $C
## [1] 12
Intenta simplificar el resultado.
sapply(lista_numeros, mean)
## A B C
## 2.5 20.0 12.0
sapply(lista_numeros, sd)
## A B C
## 1.290994 10.000000 5.873670
Permite especificar el tipo esperado.
vapply(lista_numeros,
mean,
FUN.VALUE = numeric(1))
## A B C
## 2.5 20.0 12.0
M1 <- matrix(1:6, nrow = 2, byrow = TRUE)
M2 <- matrix(7:12, nrow = 2, byrow = TRUE)
rbind(M1, M2)
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 4 5 6
## [3,] 7 8 9
## [4,] 10 11 12
cbind(M1, M2)
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 2 3 7 8 9
## [2,] 4 5 6 10 11 12
which(M1 > 3)
## [1] 2 4 6
which(M1 > 3, arr.ind = TRUE)
## row col
## [1,] 2 1
## [2,] 2 2
## [3,] 2 3
M1_mod <- M1
M1_mod[M1_mod > 3] <- 99
M1_mod
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 99 99 99
M1 > 3
## [,1] [,2] [,3]
## [1,] FALSE FALSE FALSE
## [2,] TRUE TRUE TRUE
M1 == 2
## [,1] [,2] [,3]
## [1,] FALSE TRUE FALSE
## [2,] FALSE FALSE FALSE
M1 %% 2 == 0
## [,1] [,2] [,3]
## [1,] FALSE TRUE FALSE
## [2,] TRUE FALSE TRUE
max(M1)
## [1] 6
min(M1)
## [1] 1
sum(M1)
## [1] 21
mean(M1)
## [1] 3.5
length(M1)
## [1] 6
range(M1)
## [1] 1 6
apply(ventas5, 3, sum)
## Tienda 1 Tienda 2 Tienda 3 Tienda 4 Tienda 5
## 1278 1422 1566 1710 1854
apply(ventas5, 3, sd)
## Tienda 1 Tienda 2 Tienda 3 Tienda 4 Tienda 5
## 3.605551 3.605551 3.605551 3.605551 3.605551
ventas5_estandarizadas <- apply(
ventas5,
3,
function(x) {
(x - mean(x)) / sd(x)
}
)
ventas5_estandarizadas
## Tienda
## Tienda 1 Tienda 2 Tienda 3 Tienda 4 Tienda 5
## [1,] -1.5254255 -1.5254255 -1.5254255 -1.5254255 -1.5254255
## [2,] -1.2480754 -1.2480754 -1.2480754 -1.2480754 -1.2480754
## [3,] -0.9707253 -0.9707253 -0.9707253 -0.9707253 -0.9707253
## [4,] -0.6933752 -0.6933752 -0.6933752 -0.6933752 -0.6933752
## [5,] -0.4160251 -0.4160251 -0.4160251 -0.4160251 -0.4160251
## [6,] -0.1386750 -0.1386750 -0.1386750 -0.1386750 -0.1386750
## [7,] 0.1386750 0.1386750 0.1386750 0.1386750 0.1386750
## [8,] 0.4160251 0.4160251 0.4160251 0.4160251 0.4160251
## [9,] 0.6933752 0.6933752 0.6933752 0.6933752 0.6933752
## [10,] 0.9707253 0.9707253 0.9707253 0.9707253 0.9707253
## [11,] 1.2480754 1.2480754 1.2480754 1.2480754 1.2480754
## [12,] 1.5254255 1.5254255 1.5254255 1.5254255 1.5254255
matriz_df <- as.data.frame(A)
matriz_df
## V1 V2 V3
## 1 1 2 3
## 2 4 5 6
class(matriz_df)
## [1] "data.frame"
Asignar nombres de columnas:
colnames(matriz_df) <- c("Variable1", "Variable2", "Variable3")
matriz_df
## Variable1 Variable2 Variable3
## 1 1 2 3
## 2 4 5 6
Cuando todas las columnas son numéricas:
df_num <- data.frame(
X = c(1,2,3),
Y = c(4,5,6),
Z = c(7,8,9)
)
matriz_num <- as.matrix(df_num)
matriz_num
## X Y Z
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
Se estudian 3 pacientes, 2 variables clínicas y 4 visitas.
pacientes <- array(
c(120,130,125,
70,75,72,
118,128,123,
68,74,70,
115,126,120,
67,72,69,
112,124,118,
65,70,67),
dim = c(3,2,4)
)
dimnames(pacientes) <- list(
Paciente = c("P1", "P2", "P3"),
Variable = c("Sistolica", "Diastolica"),
Visita = paste("Visita", 1:4)
)
pacientes
## , , Visita = Visita 1
##
## Variable
## Paciente Sistolica Diastolica
## P1 120 70
## P2 130 75
## P3 125 72
##
## , , Visita = Visita 2
##
## Variable
## Paciente Sistolica Diastolica
## P1 118 68
## P2 128 74
## P3 123 70
##
## , , Visita = Visita 3
##
## Variable
## Paciente Sistolica Diastolica
## P1 115 67
## P2 126 72
## P3 120 69
##
## , , Visita = Visita 4
##
## Variable
## Paciente Sistolica Diastolica
## P1 112 65
## P2 124 70
## P3 118 67
Promedio por paciente:
apply(pacientes, 1, mean)
## P1 P2 P3
## 91.875 99.875 95.500
Promedio por variable clínica:
apply(pacientes, 2, mean)
## Sistolica Diastolica
## 121.58333 69.91667
Promedio por visita:
apply(pacientes, 3, mean)
## Visita 1 Visita 2 Visita 3 Visita 4
## 98.66667 96.83333 94.83333 92.66667
Convertir a data frame:
pacientes_df <- as.data.frame.table(
pacientes,
responseName = "Valor"
)
head(pacientes_df)
## Paciente Variable Visita Valor
## 1 P1 Sistolica Visita 1 120
## 2 P2 Sistolica Visita 1 130
## 3 P3 Sistolica Visita 1 125
## 4 P1 Diastolica Visita 1 70
## 5 P2 Diastolica Visita 1 75
## 6 P3 Diastolica Visita 1 72
Resumen por variable:
aggregate(Valor ~ Variable,
data = pacientes_df,
FUN = mean)
## Variable Valor
## 1 Sistolica 121.58333
## 2 Diastolica 69.91667
produccion <- array(
c(80,85,90,
75,88,92,
82,87,94,
78,86,91,
84,89,95,
79,85,93),
dim = c(3,2,3)
)
dimnames(produccion) <- list(
Maquina = c("M1", "M2", "M3"),
Turno = c("Dia", "Noche"),
Semana = c("Semana 1", "Semana 2", "Semana 3")
)
produccion
## , , Semana = Semana 1
##
## Turno
## Maquina Dia Noche
## M1 80 75
## M2 85 88
## M3 90 92
##
## , , Semana = Semana 2
##
## Turno
## Maquina Dia Noche
## M1 82 78
## M2 87 86
## M3 94 91
##
## , , Semana = Semana 3
##
## Turno
## Maquina Dia Noche
## M1 84 79
## M2 89 85
## M3 95 93
apply(produccion, 1, mean)
## M1 M2 M3
## 79.66667 86.66667 92.50000
apply(produccion, 2, mean)
## Dia Noche
## 87.33333 85.22222
apply(produccion, 3, mean)
## Semana 1 Semana 2 Semana 3
## 85.00000 86.33333 87.50000
Convertir a data frame:
produccion_df <- as.data.frame.table(
produccion,
responseName = "Produccion"
)
produccion_df
## Maquina Turno Semana Produccion
## 1 M1 Dia Semana 1 80
## 2 M2 Dia Semana 1 85
## 3 M3 Dia Semana 1 90
## 4 M1 Noche Semana 1 75
## 5 M2 Noche Semana 1 88
## 6 M3 Noche Semana 1 92
## 7 M1 Dia Semana 2 82
## 8 M2 Dia Semana 2 87
## 9 M3 Dia Semana 2 94
## 10 M1 Noche Semana 2 78
## 11 M2 Noche Semana 2 86
## 12 M3 Noche Semana 2 91
## 13 M1 Dia Semana 3 84
## 14 M2 Dia Semana 3 89
## 15 M3 Dia Semana 3 95
## 16 M1 Noche Semana 3 79
## 17 M2 Noche Semana 3 85
## 18 M3 Noche Semana 3 93
aggregate(Produccion ~ Maquina,
data = produccion_df,
FUN = mean)
## Maquina Produccion
## 1 M1 79.66667
## 2 M2 86.66667
## 3 M3 92.50000
aggregate(Produccion ~ Turno,
data = produccion_df,
FUN = mean)
## Turno Produccion
## 1 Dia 87.33333
## 2 Noche 85.22222
aggregate(Produccion ~ Maquina + Turno,
data = produccion_df,
FUN = mean)
## Maquina Turno Produccion
## 1 M1 Dia 82.00000
## 2 M2 Dia 87.00000
## 3 M3 Dia 93.00000
## 4 M1 Noche 77.33333
## 5 M2 Noche 86.33333
## 6 M3 Noche 92.00000
as.data.frame.table().lapply() y sapply() para obtener
promedios de varios vectores almacenados en una lista.| Función | Uso |
|---|---|
matrix() |
Crear matrices |
array() |
Crear arrays multidimensionales |
dim() |
Consultar dimensiones |
dimnames() |
Asignar nombres a dimensiones |
t() |
Transpuesta |
%*% |
Producto matricial |
det() |
Determinante |
solve() |
Inversa o solución de sistemas |
rowSums() |
Sumas por fila |
colSums() |
Sumas por columna |
rowMeans() |
Promedios por fila |
colMeans() |
Promedios por columna |
apply() |
Aplicar función por dimensiones |
as.data.frame() |
Convertir a data frame |
as.data.frame.table() |
Convertir array a formato tabular largo |
as.matrix() |
Convertir data frame numérico a matriz |
aggregate() |
Resumir por grupos |
list() |
Crear listas |
lapply() |
Aplicar función y devolver lista |
sapply() |
Aplicar función y simplificar resultado |
vapply() |
Aplicar función indicando tipo de salida |
rbind() |
Unir por filas |
cbind() |
Unir por columnas |
which() |
Encontrar posiciones que cumplen una condición |
eigen() |
Valores y vectores propios |
Las matrices, arrays, listas y data frames son estructuras fundamentales en R. Las matrices son adecuadas para álgebra lineal, los arrays permiten representar datos multidimensionales, las listas almacenan objetos heterogéneos y los data frames proporcionan la estructura natural para el análisis estadístico. Comprender cómo convertir y operar entre estas estructuras permite desarrollar análisis más flexibles y complejos en RStudio.