Cálculo de indicadores simples y transformación de la información

1. Vectores Atómicos (1D - Homogéneos) El vector es la estructura de datos unidimensional más simple y fundamental en R.

1.1 Creación de Vectores Para concatenar o combinar valores individuales en un vector atómico, utilizamos la función c().

# Vector numérico (doble precisión por defecto)
edades <- c(20, 25, 30, 22)
print(edades)
## [1] 20 25 30 22
# Vector de caracteres (texto)
nombres <- c("Hugo", "Paco", "Luis") 
print(nombres)
## [1] "Hugo" "Paco" "Luis"
# Generación de secuencias automáticas
secuencia <- 1:10 
pasos <- seq(from = 0, to = 1, by = 0.1) 
repeticion <- rep(c(1, 2), times = 3)

print(secuencia)
##  [1]  1  2  3  4  5  6  7  8  9 10
print(pasos)
##  [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
print(repeticion)
## [1] 1 2 1 2 1 2

1.2 Vectorización

En R, las operaciones aritméticas y lógicas son vectorizadas, lo que significa que se aplican automáticamente elemento por elemento sin necesidad de usar bucles (for).

v <- c(2, 4, 6)
v * 2   # Multiplica cada elemento por 2
## [1]  4  8 12
v^2     # Eleva cada elemento al cuadrado
## [1]  4 16 36
v + 10  # Suma 10 a cada elemento
## [1] 12 14 16

##1.3 Acceso e Indexación en Vectores ### Para acceder a posiciones específicas de un vector se utilizan corchetes simples [].

###¡Atención! En R los índices comienzan en 1, no en 0.

frutas <- c("manzana", "banana", "naranja", "pera")

# Acceder al primer elemento
frutas[1]
## [1] "manzana"
# Acceder a múltiples elementos mediante un vector de posiciones
frutas[c(1, 3)]
## [1] "manzana" "naranja"
# Excluir un elemento mediante el signo negativo (-)
frutas[-2] # Muestra todas excepto la posición 2
## [1] "manzana" "naranja" "pera"
# Filtrado por condición lógica
numeros <- c(10, 25, 30, 45, 50)
numeros[numeros > 25]
## [1] 30 45 50

1.4 Modificación y Manipulación de Vectores

Podemos reasignar valores a posiciones específicas o agregar nuevos elementos:

# Modificar un elemento existente por posición
frutas[2] <- "fresa"
print(frutas)
## [1] "manzana" "fresa"   "naranja" "pera"
# Modificar según condición
numeros[numeros < 20] <- 0
print(numeros)
## [1]  0 25 30 45 50
# Agregar elementos (concatenando)
frutas <- c(frutas, "uva")
print(frutas)
## [1] "manzana" "fresa"   "naranja" "pera"    "uva"

2. Matrices (2D - Homogéneas)

Las matrices son estructuras bidimensionales compuestas por filas (renglones) y columnas. Al ser homogéneas, todos sus elementos deben ser del mismo tipo de dato.

2.1 Creación de Matrices

Se crean con la función matrix() o uniendo vectores con rbind() (por filas) y cbind() (por columnas).

# Crear una matriz de 3 filas y 4 columnas
mi_matriz <- matrix(1:12, nrow = 3, ncol = 4, byrow = TRUE) 
#, byrow = FALSE se llena por columnas
#, byrow = TRUE se llena por columnas
print(mi_matriz)
##      [,1] [,2] [,3] [,4]
## [1,]    1    2    3    4
## [2,]    5    6    7    8
## [3,]    9   10   11   12
# Consultar dimensiones (filas, columnas)
dim(mi_matriz)
## [1] 3 4
# Combinar vectores por filas (rbind) y por columnas (cbind)
fila1 <- c(1, 2, 3)
fila2 <- c(4, 5, 6)

matriz_filas <- rbind(fila1, fila2)
#rbind pega en el orden que se le pide pega fila por fila
matriz_cols  <- cbind(fila1, fila2)
 #cbind pega columna por columna

print(matriz_filas)
##       [,1] [,2] [,3]
## fila1    1    2    3
## fila2    4    5    6
print(matriz_cols)
##      fila1 fila2
## [1,]     1     4
## [2,]     2     5
## [3,]     3     6

2.2 Matrices Especiales

En análisis matemático y algebraico es común requerir matrices específicas:

# Matriz Identidad de orden 3 (3x3 con 1s en la diagonal y 0s en el resto)
matriz_identidad <- diag(5)
print(matriz_identidad)
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    0    0    0    0
## [2,]    0    1    0    0    0
## [3,]    0    0    1    0    0
## [4,]    0    0    0    1    0
## [5,]    0    0    0    0    1

crear una matriz vacia

# Matriz vacía de caracteres cuadrada de orden 2
matriz_caracteres_vacia <- matrix("", nrow = 2, ncol = 2)
print(matriz_caracteres_vacia)
##      [,1] [,2]
## [1,] ""   ""  
## [2,] ""   ""

2.3 Acceso, Modificación y Estadísticos en Matrices

El acceso a matrices se realiza mediante la sintaxis matriz[fila, columna].

# Acceder a la celda en fila 2, columna 3
mi_matriz[2, 3]
## [1] 7
# Extraer una fila completa (se deja libre el espacio de columna)
mi_matriz[2, ]
## [1] 5 6 7 8

crear una submatriz

mi_matriz <- matrix(1:12, nrow = 3, ncol = 4)

submatriz <- mi_matriz[1:2, 1:2]

submatriz
##      [,1] [,2]
## [1,]    1    4
## [2,]    2    5
# Extraer una columna completa (se deja libre el espacio de fila)
mi_matriz[, 4]
## [1] 10 11 12
# Modificar un valor específico
mi_matriz[1, 1] <- 99
print(mi_matriz)
##      [,1] [,2] [,3] [,4]
## [1,]   99    4    7   10
## [2,]    2    5    8   11
## [3,]    3    6    9   12
# Modificar toda la fila 3
mi_matriz[3, ] <- 10
print(mi_matriz)
##      [,1] [,2] [,3] [,4]
## [1,]   99    4    7   10
## [2,]    2    5    8   11
## [3,]   10   10   10   10
# Calcular estadísticas sobre los elementos de una matriz
mean(mi_matriz) # Promedio global
## [1] 15.5
colMeans(mi_matriz) # Promedio por columna
## [1] 37.000000  6.333333  8.333333 10.333333

3. Listas (Estructuras Heterogéneas y Anidadas)

##Las listas son las estructuras más versátiles y flexibles en R. Pueden almacenar objetos de distintos tipos y tamaños (vectores, matrices, data frames e incluso otras listas anidadas).

Analogía didáctica: Imagina una lista como un “organizador” o “caja de almacenamiento” con compartimentos rotulados. Cada compartimento puede guardar un objeto de cualquier forma y tamaño.

3.1 Creación de Listas con Nombres

Es altamente recomendado asignar nombres a los elementos de una lista para facilitar su acceso.

# Creación de componentes
hijos <- c("Hugo", "Petra")
edades_hijos <- c(8, 6)
presupuesto <- matrix(c(500, 600, 450, 700), nrow = 2)
colnames(presupuesto) <- c("Enero", "Febrero")

# Lista anidada secundaria
mascota_info <- list(tipo = c("Perro", "Gato"), nombre = c("Fido", "Figaro"), edad = 3)

# Lista principal heterogénea
familia <- list(
  integrantes = hijos,        # Vector de caracteres
  edades      = edades_hijos, # Vector numérico
  gastos      = presupuesto,  # Matriz
  mascota     = mascota_info  # Lista anidada
)

print(familia)
## $integrantes
## [1] "Hugo"  "Petra"
## 
## $edades
## [1] 8 6
## 
## $gastos
##      Enero Febrero
## [1,]   500     450
## [2,]   600     700
## 
## $mascota
## $mascota$tipo
## [1] "Perro" "Gato" 
## 
## $mascota$nombre
## [1] "Fido"   "Figaro"
## 
## $mascota$edad
## [1] 3

3.2 Acceso en Listas: Diferencia entre [], [[]] y $ La forma en que se extrae información de una lista es fundamental en R:

###lista[i] (Corchete simple): Retorna una sub-lista (mantiene la estructura de lista). ###lista[[i]] (Corchete doble): Extrae directamente el contenido almacenado en esa posición. ###lista$nombre (Operador Signo Pesos): Extrae directamente el contenido utilizando el nombre del elemento (equivalente al doble corchete).

# Extraer como sublista (mantiene tipo list)
sublista <- familia[1]
class(sublista)
## [1] "list"
# Extraer el contenido real del elemento (devuelve el vector de caracteres)
contenido <- familia[[1]]
class(contenido)
## [1] "character"
# Acceder mediante el operador $
familia$integrantes
## [1] "Hugo"  "Petra"

3.3 Indexación Multinivel

Para acceder a un valor dentro de un objeto guardado dentro de una lista, encadenamos los operadores de acceso:

# Acceder al segundo nombre del vector 'integrantes' dentro de 'familia'
familia$integrantes[2]
## [1] "Petra"
# Acceder al valor de la fila 1, columna 2 de la matriz 'gastos' dentro de 'familia'
familia$gastos[1, 2]
## Febrero 
##     450
# Acceder al nombre de la segunda mascota dentro de la lista anidada 'mascota'
familia$mascota$nombre[2]
## [1] "Figaro"

##3.4 Modificación, Adición y Eliminación en Listas . Las listas permiten operaciones complejas de mantenimiento y actualización de datos.

A) Modificar un valor específico dentro de una lista

# Cambiar la edad del primer hijo a 9 años
familia$edades[1] <- 9

# Modificar un valor aplicando un cálculo (ej. incrementar en 20% el gasto de Enero fila 1)
familia$gastos[1, "Enero"] <- familia$gastos[1, "Enero"] * 1.20

print(familia$edades)
## [1] 9 6
print(familia$gastos)
##      Enero Febrero
## [1,]   600     450
## [2,]   600     700

B) Añadir nuevos elementos a una lista Para agregar una nueva variable o componente a una lista existente, simplemente la asignamos usando $ o [[]]

# Agregar un vector con las ciudades de residencia
familia$ciudad <- "San Salvador"

# Agregar un nuevo vector
familia$vehiculos <- c("Sedán", "Pick-up")

print(familia$vehiculos)
## [1] "Sedán"   "Pick-up"

C) Renombrar elementos de una lista Para cambiar el nombre de un elemento específico se utiliza la función names():

# Consultar nombres actuales
names(familia)
## [1] "integrantes" "edades"      "gastos"      "mascota"     "ciudad"     
## [6] "vehiculos"
# Cambiar el nombre del elemento "vehiculos" por "autos"
names(familia)[names(familia) == "vehiculos"] <- "autos"

names(familia)
## [1] "integrantes" "edades"      "gastos"      "mascota"     "ciudad"     
## [6] "autos"

D) Eliminar elementos de una lista Para borrar un elemento de una lista, se le asigna el valor especial NULL:

# Eliminar el elemento 'ciudad'
familia$ciudad <- NULL

# Verificar que ya no existe
names(familia)
## [1] "integrantes" "edades"      "gastos"      "mascota"     "autos"

4. Data Frames (2D - Heterogéneos)

El Data Frame es la estructura bidimensional más utilizada en el análisis de datos. A diferencia de una matriz, cada columna puede contener un tipo de dato diferente (números, texto, logicos, factores), pero todas las columnas deben tener estrictamente la misma longitud.

4.1 Creación de Data Frames

Los Data Frames se crean combinando vectores mediante la función data.frame().

# Crear un data frame con datos de empleados
empleados <- data.frame(
  id = 1:4,
  nombre = c("Ana", "Luis", "Pedro", "Elena"),
  edad = c(25, 30, 28, 35),
  salario = c(1200.50, 1500.00, 1350.75, 1800.00),
  activo = c(TRUE, TRUE, FALSE, TRUE)
)

print(empleados)
##   id nombre edad salario activo
## 1  1    Ana   25 1200.50   TRUE
## 2  2   Luis   30 1500.00   TRUE
## 3  3  Pedro   28 1350.75  FALSE
## 4  4  Elena   35 1800.00   TRUE

4.2 Acceso e Indexación en Data Frames

Al ser bidimensionales y tener nombres en sus columnas, combinan las técnicas de acceso de las matrices ([fila, columna]) y de las listas ($ / [[]]).

# Acceso por coordenadas [fila, columna]
empleados[2, 3]          # Fila 2, columna 3 (Edad de Luis: 30)
## [1] 30
empleados[1, ]           # Toda la fila 1 (Registro completo de Ana)
##   id nombre edad salario activo
## 1  1    Ana   25  1200.5   TRUE
empleados[, "salario"]   # Toda la columna salario como vector
## [1] 1200.50 1500.00 1350.75 1800.00
# Acceso por nombre de columna (estilo lista)
empleados$nombre         # Extrae la columna 'nombre' como vector
## [1] "Ana"   "Luis"  "Pedro" "Elena"
empleados[["salario"]]   # Mismo resultado usando dobles corchetes
## [1] 1200.50 1500.00 1350.75 1800.00
# Filtrado de observaciones (filas) mediante condiciones lógicas
empleados[empleados$salario > 1300, ]
##   id nombre edad salario activo
## 2  2   Luis   30 1500.00   TRUE
## 3  3  Pedro   28 1350.75  FALSE
## 4  4  Elena   35 1800.00   TRUE
empleados[empleados$activo == TRUE & empleados$edad < 30, ]
##   id nombre edad salario activo
## 1  1    Ana   25  1200.5   TRUE

4.3 Modificación y Manipulación de Data Frames

Podemos actualizar celdas, agregar/eliminar variables (columnas) o registrar nuevos elementos (filas).

# A) Modificar valores de celdas específicas
empleados[3, "salario"] <- 1400.00  # Actualizar salario de Pedro
empleados$salario <- empleados$salario * 1.05 # Incremento general del 5% al salario

# B) Agregar una nueva columna
empleados$departamento <- c("Ventas", "TI", "TI", "Finanzas")

# C) Agregar una nueva fila con rbind()
nueva_empleada <- data.frame(
  id = 5,
  nombre = "Sofía",
  edad = 29,
  salario = 1600.00,
  activo = TRUE,
  departamento = "Ventas"
)
empleados <- rbind(empleados, nueva_empleada)

# D) Eliminar una columna (asignando NULL)
empleados$activo <- NULL

print(empleados)
##   id nombre edad  salario departamento
## 1  1    Ana   25 1260.525       Ventas
## 2  2   Luis   30 1575.000           TI
## 3  3  Pedro   28 1470.000           TI
## 4  4  Elena   35 1890.000     Finanzas
## 5  5  Sofía   29 1600.000       Ventas

4.4 Exploración de Data Frames

En la práctica profesional, antes de manipular un conjunto de datos se utilizan funciones de exploración rápida:

# Dimensiones (filas y columnas)
dim(empleados)
## [1] 5 5
nrow(empleados) # Número de filas
## [1] 5
ncol(empleados) # Número de columnas
## [1] 5
# Estructura de las variables (tipos de datos)
str(empleados)
## 'data.frame':    5 obs. of  5 variables:
##  $ id          : num  1 2 3 4 5
##  $ nombre      : chr  "Ana" "Luis" "Pedro" "Elena" ...
##  $ edad        : num  25 30 28 35 29
##  $ salario     : num  1261 1575 1470 1890 1600
##  $ departamento: chr  "Ventas" "TI" "TI" "Finanzas" ...
# Resumen estadístico descriptivo
summary(empleados)
##        id       nombre               edad         salario    
##  Min.   :1   Length:5           Min.   :25.0   Min.   :1261  
##  1st Qu.:2   Class :character   1st Qu.:28.0   1st Qu.:1470  
##  Median :3   Mode  :character   Median :29.0   Median :1575  
##  Mean   :3                      Mean   :29.4   Mean   :1559  
##  3rd Qu.:4                      3rd Qu.:30.0   3rd Qu.:1600  
##  Max.   :5                      Max.   :35.0   Max.   :1890  
##  departamento      
##  Length:5          
##  Class :character  
##  Mode  :character  
##                    
##                    
## 
# Primeras y últimas filas
head(empleados, 2)
##   id nombre edad  salario departamento
## 1  1    Ana   25 1260.525       Ventas
## 2  2   Luis   30 1575.000           TI
tail(empleados, 2)
##   id nombre edad salario departamento
## 4  4  Elena   35    1890     Finanzas
## 5  5  Sofía   29    1600       Ventas

5. Caso Práctico: Construcción de Listas

En problemas económicos o empresariales es habitual combinar todas las estructuras aprendidas (vectores, matrices, data frames) dentro de listas anidadas.

# Data frame de inventario
tabla_inventario <- data.frame(
  producto = c("Laptop", "Monitor", "Teclado"),
  stock = c(15, 30, 50),
  precio = c(800, 200, 25)
)

# Construcción de una estructura jerárquica con Data Frame interno
empresa <- list(
  sucursal_central = list(
    ventas = c(100, 120, 130),
    personal = c("Ana", "Carlos"),
    inventario = tabla_inventario
  ),
  sucursal_B = list(
    ventas = c(200, 210, 250),
    personal = c("Elena", "Pedro")
  )
)

# 1. Acceder al precio de las Laptops en el inventario de la sucursal central
empresa$sucursal_central$inventario[1, "precio"]
## [1] 800
# 2. Eliminar el personal de la sucursal_B
empresa$sucursal_B$personal <- NULL

# 3. Agregar un departamento de auditoría con matriz identidad
empresa$auditoria <- list(
  matriz_control = diag(2)
)

print(empresa)
## $sucursal_central
## $sucursal_central$ventas
## [1] 100 120 130
## 
## $sucursal_central$personal
## [1] "Ana"    "Carlos"
## 
## $sucursal_central$inventario
##   producto stock precio
## 1   Laptop    15    800
## 2  Monitor    30    200
## 3  Teclado    50     25
## 
## 
## $sucursal_B
## $sucursal_B$ventas
## [1] 200 210 250
## 
## 
## $auditoria
## $auditoria$matriz_control
##      [,1] [,2]
## [1,]    1    0
## [2,]    0    1

Bibliografía

Mendoza Vega, J. B. (s.f.). R para principiantes. Recuperado de https://bookdown.org/jboscomendoza/r-principiantes4/