1 Introducción

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.

2 1. Matrices en R

2.1 1.1 Crear una matriz

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

2.2 1.2 Acceder a elementos

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

2.3 1.3 Operaciones básicas

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

2.4 1.4 Transpuesta

t(A)
##      [,1] [,2]
## [1,]    1    4
## [2,]    2    5
## [3,]    3    6

2.5 1.5 Sumas y promedios por filas y columnas

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

2.6 1.6 Determinante e inversa

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

2.7 1.7 Resolver un sistema lineal

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

2.8 1.8 Diagonal, traza y matriz identidad

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

2.9 1.9 Valores y vectores propios

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

3 2. Arrays tridimensionales

3.1 2.1 Crear un array 3D

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

3.2 2.2 Extraer capas

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

3.3 2.3 Consultar elementos específicos

A3[1,2,3]
## [1] 15
A3[2,3,4]
## [1] 24

La notación general es:

A3[fila, columna, capa].

4 3. Ejemplo aplicado: ventas

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

4.1 3.1 Nombrar dimensiones

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

4.2 3.2 Consultas

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

5 4. Operaciones estadísticas con apply()

La función apply() tiene la estructura:

apply(X, MARGIN, FUN)

Para el array ventas:

5.1 4.1 Promedios

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

5.2 4.2 Conservar dos dimensiones

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

5.3 4.3 Otras funciones

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

6 5. Ejemplo 3D ampliado: cinco tiendas

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

7 6. Conversión de array 3D a data frame

7.1 6.1 Ejemplo académico

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

7.2 6.2 Estadística antes de convertir

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

7.3 6.3 Convertir a data frame

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.

7.4 6.4 Resúmenes con aggregate()

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

8 7. Filtrar y ordenar el data frame

8.1 7.1 Filtrar notas mayores o iguales a 4

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

8.2 7.2 Filtrar una asignatura

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

8.3 7.3 Ordenar de mayor a menor

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

9 8. Crear nuevas variables

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

10 9. Listas en R

Una lista puede almacenar objetos de diferente tipo y tamaño.

10.1 9.1 Crear una lista simple

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

10.2 9.2 Acceder a elementos

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.

10.3 9.3 Lista con matrices y data frames

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

10.4 9.4 Consultar objetos dentro de la lista

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

11 10. lapply(), sapply() y vapply()

11.1 10.1 lapply()

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

11.2 10.2 sapply()

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

11.3 10.3 vapply()

Permite especificar el tipo esperado.

vapply(lista_numeros,
       mean,
       FUN.VALUE = numeric(1))
##    A    B    C 
##  2.5 20.0 12.0

12 11. Más operaciones con matrices

12.1 11.1 Concatenar por filas

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

12.2 11.2 Concatenar por columnas

cbind(M1, M2)
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]    1    2    3    7    8    9
## [2,]    4    5    6   10   11   12

12.3 11.3 Buscar posiciones

which(M1 > 3)
## [1] 2 4 6
which(M1 > 3, arr.ind = TRUE)
##      row col
## [1,]   2   1
## [2,]   2   2
## [3,]   2   3

12.4 11.4 Reemplazar valores

M1_mod <- M1
M1_mod[M1_mod > 3] <- 99
M1_mod
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]   99   99   99

12.5 11.5 Operaciones lógicas

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

13 12. Funciones matriciales útiles

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

14 13. Operaciones por capas en arrays

14.1 13.1 Suma de cada capa

apply(ventas5, 3, sum)
## Tienda 1 Tienda 2 Tienda 3 Tienda 4 Tienda 5 
##     1278     1422     1566     1710     1854

14.2 13.2 Desviación estándar de cada capa

apply(ventas5, 3, sd)
## Tienda 1 Tienda 2 Tienda 3 Tienda 4 Tienda 5 
## 3.605551 3.605551 3.605551 3.605551 3.605551

14.3 13.3 Normalizar cada capa

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

15 14. Transformar una matriz a data frame

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

16 15. Transformar un data frame a matriz

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

17 16. Ejemplo aplicado adicional: pacientes, variables y visitas

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

18 17. Ejemplo adicional: producción industrial

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

19 18. Ejercicios propuestos

  1. Cree una matriz 4x4 con los números del 1 al 16 y calcule suma por filas, suma por columnas, transpuesta y diagonal.
  2. Cree dos matrices compatibles y calcule producto elemento a elemento y producto matricial.
  3. Cree un array 3x4x3 que represente productos, meses y sucursales.
  4. Calcule promedio, desviación estándar, máximo y mínimo por cada dimensión del array anterior.
  5. Convierta el array a data frame utilizando as.data.frame.table().
  6. Cree una variable categórica en el data frame que clasifique los valores en bajo, medio y alto.
  7. Cree una lista que almacene una matriz, un array, un data frame y un vector.
  8. Utilice lapply() y sapply() para obtener promedios de varios vectores almacenados en una lista.
  9. Cree un array 4D y consulte algunas posiciones específicas.
  10. Diseñe un ejemplo propio donde una estructura multidimensional se convierta finalmente en un data frame.

20 19. Resumen de funciones principales

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

21 Conclusión

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.