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().
## [1] 20 25 30 22
## [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
## [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
## [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).
## [1] 4 8 12
## [1] 4 16 36
## [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.
## [1] "manzana"
## [1] "manzana" "naranja"
# Excluir un elemento mediante el signo negativo (-)
frutas[-2] # Muestra todas excepto la posición 2## [1] "manzana" "naranja" "pera"
## [1] 30 45 50
1.4 Modificación y Manipulación de Vectores
Podemos reasignar valores a posiciones específicas o agregar nuevos elementos:
## [1] "manzana" "fresa" "naranja" "pera"
## [1] 0 25 30 45 50
## [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
## [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
## 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
crear una submatriz
## [,1] [,2]
## [1,] 1 4
## [2,] 2 5
## [1] 10 11 12
## [,1] [,2] [,3] [,4]
## [1,] 99 4 7 10
## [2,] 2 5 8 11
## [3,] 3 6 9 12
## [,1] [,2] [,3] [,4]
## [1,] 99 4 7 10
## [2,] 2 5 8 11
## [3,] 10 10 10 10
## [1] 15.5
## [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).
## [1] "list"
# Extraer el contenido real del elemento (devuelve el vector de caracteres)
contenido <- familia[[1]]
class(contenido)## [1] "character"
## [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:
## [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
## 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():
## [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"
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 ($ / [[]]).
## [1] 30
## id nombre edad salario activo
## 1 1 Ana 25 1200.5 TRUE
## [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"
## [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
## 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:
## [1] 5 5
## [1] 5
## [1] 5
## '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" ...
## 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
##
##
##
## id nombre edad salario departamento
## 1 1 Ana 25 1260.525 Ventas
## 2 2 Luis 30 1575.000 TI
## 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/