En R, todo lo que manipulamos son objetos. Un objeto es un contenedor que almacena información en la memoria del equipo. Para trabajar eficazmente con datos cuantitativos y cualitativos, R clasifica estos objetos en diversas estructuras de datos, las cuales pueden ser:
El vector es la estructura de datos unidimensional más simple y fundamental en R.
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
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
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
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"
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.
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)
print(mi_matriz)## [,1] [,2] [,3] [,4]
## [1,] 1 4 7 10
## [2,] 2 5 8 11
## [3,] 3 6 9 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)
matriz_cols <- cbind(fila1, fila2)
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
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(3)
print(matriz_identidad)## [,1] [,2] [,3]
## [1,] 1 0 0
## [2,] 0 1 0
## [3,] 0 0 1
# 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,] "" ""
El acceso a matrices se realiza mediante la sintaxis
matriz[fila, columna].
## [1] 8
## [1] 2 5 8 11
## [1] 10 11 12
## [,1] [,2] [,3] [,4]
## [1,] 99 4 7 10
## [2,] 2 5 8 11
## [3,] 3 6 9 12
## [1] 14.66667
## [1] 34.66667 5.00000 8.00000 11.00000
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.
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
[],
[[]] 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"
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"
Las listas permiten operaciones complejas de mantenimiento y actualización de datos.
# 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
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"
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"
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.
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
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
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
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 departamento
## Min. :1 Length :5 Min. :25.0 Min. :1261 Length :5
## 1st Qu.:2 N.unique :5 1st Qu.:28.0 1st Qu.:1470 N.unique :3
## Median :3 N.blank :0 Median :29.0 Median :1575 N.blank :0
## Mean :3 Min.nchar:3 Mean :29.4 Mean :1559 Min.nchar:2
## 3rd Qu.:4 Max.nchar:5 3rd Qu.:30.0 3rd Qu.:1600 Max.nchar:8
## Max. :5 Max. :35.0 Max. :1890
## 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
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