# 1. Generar un conjunto de datos aleatorios
#install.packages("gapminder")
# Usaremos los parámetros definidos en el YAML:
n <- params$n_muestras
mu <- params$media
sigma <- params$desviacion_estandar

# Generar datos que siguen una distribución normal (gaussiana)
# rnorm(n, mean, sd)
datos_aleatorios <- rnorm(n = n, mean = mu, sd = sigma)

# 2. Elaborar un histograma
hist(datos_aleatorios,
     main = paste("Histograma de Datos Normales (n =", n, ")"),
     xlab = "Valor de la Variable",
     ylab = "Frecuencia",
     col = "lightblue", # Color de las barras
     border = "white") # Borde de las barras

Análisis del Histograma

El gráfico anterior muestra la distribución de un conjunto de datos aleatorios que siguen una distribución normal (o Gaussiana), generados a partir de la función rnorm().

Se generaron \(n = \text{1000}\) puntos de datos con una media (\(\mu\)) de \(\text{50}\) y una desviación estándar (\(\sigma\)) de \(\text{10}\).

La función de densidad de probabilidad (PDF) de la distribución normal está dada por la fórmula:

\[ f(x | \mu, \sigma^2) = \frac{1}{\sqrt{2\pi\sigma^2}} e^{-\frac{(x-\mu)^2}{2\sigma^2}} \] Donde \(x\) es el valor de la variable, \(\mu\) es la media y \(\sigma^2\) es la varianza. El histograma muestra que la mayoría de los valores se agrupan alrededor de la media (\(\mu=50\)), lo que es característico de esta distribución.

Ejercicio 1.2: Tipos de datos y operadores en R

a) Creación de la Lista

Creamos una lista (mi_lista_variada) que contiene diferentes tipos de datos: numéricos, caracteres, y valores lógicos.

mi_lista_variada <- list(
  Edad = 30,                 # Numérico
  Nombre = "Alondra",        # Carácter
  Activo = TRUE,             # Lógico
  Pi = 3.14159,              # Numérico
  Mensaje = "RStudio",       # Carácter
  Cero = 0L,                 # Entero
  Es_Valido = FALSE          # Lógico
)

b) Función para identificar tipo de dato

identificar_tipo <- function(elemento) {
  tipo_de_dato <- class(elemento)
  return(tipo_de_dato)
}

c) Automatización con ‘sapply()’

Aplicamos la función identificar_tipo() a toda la lista utilizando sapply().

resultados_tipos <- sapply(mi_lista_variada, identificar_tipo)

Resultados de la clasificación

##        Edad      Nombre      Activo          Pi     Mensaje        Cero 
##   "numeric" "character"   "logical"   "numeric" "character"   "integer" 
##   Es_Valido 
##   "logical"

Ejercicio 1.3: Estructuras de datos en R

a) Creación del Data Frame

Creamos un Creamos un data.frame llamado datos_personas con tres columnas: nombre (carácter), edad (numérico) y ciudad (carácter).

Mostrar los datos

##     nombre edad      ciudad
## 1  Alondra   28        CDMX
## 2     Juan   35   Monterrey
## 3 Victoria   22 Guadalajara
## 4  Antonio   41      Puebla
## 5     Alma   30     Tijuana

b) Análisis del Data Frame: Registros y Promedio

Calculamos el número de registros (filas) usando nrow() y la edad promedio de la columna edad usando mean().

## Número total de registros: 5
## Edad promedio calculada: 31.2 años

Ejercicio 1.4: Estructuras de control en R

a) Funcion para clasificar edades en: niño, adolescente, adulto, adulto mayor

clasificar_edad <- function(edad) {
  if (!is.numeric(edad) || length(edad) != 1) {
    return("Error: Ingrese una única edad numérica.")
  }
  if (edad >= 0 && edad <= 12) {
    return(paste0("Si la edad es igual a ", edad, ", entonces es un niño"))
  } else if (edad > 12 && edad <= 17) {
    return(paste0("Si la edad es igual a ", edad, ", entonces es un adolescente"))
  } else if (edad > 17 && edad <= 64) {
    return(paste0("Si la edad es igual a ", edad, ", entonces es un adulto"))
  } else if (edad >= 65) {
    return(paste0("Si la edad es igual a ", edad, ", entonces es un adulto mayor"))
  } else {
    # Manejo de edades negativas
    return(paste0("La edad ", edad, " no es válida."))
  }
}
print(clasificar_edad(8))
## [1] "Si la edad es igual a 8, entonces es un niño"
print(clasificar_edad(16))
## [1] "Si la edad es igual a 16, entonces es un adolescente"
print(clasificar_edad(45))
## [1] "Si la edad es igual a 45, entonces es un adulto"
print(clasificar_edad(72))
## [1] "Si la edad es igual a 72, entonces es un adulto mayor"
print(clasificar_edad(-5))
## [1] "La edad -5 no es válida."

b) Conteo de elementos con más de 3 caracteres

contar_mas_de_3_vectorizado <- function(vector_caracteres) {
  
  if (is.null(vector_caracteres) || length(vector_caracteres) == 0) {
    return(0)
  }
  
  longitudes <- nchar(vector_caracteres)
  
  conteo <- sum(longitudes > 3) 
  
  return(conteo)
}

mi_vector <- c("sed", "mar", "gris", "agua", "rio", "oso", "sal")
resultado_vectorizado <- contar_mas_de_3_vectorizado(mi_vector)
print(resultado_vectorizado) 
## [1] 2

Ejercicio 1.5: Funciones en R

a) Conteo de elementos en múltiples estructuras

contar_elementos_estructuras <- function(lista_estructuras) {
  contar_elementos <- function(x) {
    if (is.data.frame(x)) {
      # Para data frames, usaré nrow() para contar filas (observaciones).
      return(nrow(x))
    } else {
      # Para vectores y listas simples, length() cuenta los elementos.
      return(length(x))
    }
  }
  
  # Aplicamos la función 'contar_elementos' a cada elemento de la lista_estructuras
  # sapply() devuelve un vector de resultados.
  resultados_conteo <- sapply(lista_estructuras, contar_elementos)
  
  return(resultados_conteo)
}

# --- Ejemplo---

vector_ejemplo <- c(1, 2, 3, 4, 5) 
df_ejemplo <- data.frame(
  id = 1:3, 
  nombre = c("A", "B", "C")
) 
lista_ejemplo <- list(a = "uno", b = 2, c = c(4, 5))

lista_total <- list(
  Vector = vector_ejemplo,
  DataFrame = df_ejemplo,
  ListaInterna = lista_ejemplo,
  OtroVector = c("rojo", "azul")
)
resultados <- contar_elementos_estructuras(lista_total)

print(resultados)
##       Vector    DataFrame ListaInterna   OtroVector 
##            5            3            3            2

b) Simulación del lanzamiento de un Dado

La función LanzarDado debe simular el lanzamiento de un dado de 6 caras n veces. La función clave para generar números aleatorios en R es sample().

LanzarDado <- function(n = 1) {
  caras_dado <- 1:6
  # x: el conjunto de valores a muestrear (1 a 6)
  # size: el número de veces que queremos muestrear (n)
  # replace = TRUE: esencial para poder repetir un resultado (ej. sacar 3 dos veces)
  lanzamientos <- sample(
    x = caras_dado, 
    size = n, 
    replace = TRUE
  )
  cat("Simulación de", n, "lanzamiento(s) de un dado:\n")
  print(lanzamientos)
  invisible(lanzamientos)
}

# --- Verificación y Ejecución ---

LanzarDado(n = 3)
## Simulación de 3 lanzamiento(s) de un dado:
## [1] 5 5 4
# Ejemplo adicional (un solo lanzamiento)
LanzarDado(n = 1)
## Simulación de 1 lanzamiento(s) de un dado:
## [1] 6
# Ejemplo adicional (muchos lanzamientos)
LanzarDado(n = 10)
## Simulación de 10 lanzamiento(s) de un dado:
##  [1] 1 5 1 1 5 6 5 3 5 5

Ejercicio 1.6: Tidyverse

a) Carga y calculo del crecimiento promedio

Primero cargamos los paquetes y calculamos el crecimiento promedio del PIB per capita por continente usando las funciones de dplyr: group_by() y summarize().

## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
## # A tibble: 5 × 2
##   continent gdpPercap_promedio
##   <fct>                  <dbl>
## 1 Africa                 2194.
## 2 Americas               7136.
## 3 Asia                   7902.
## 4 Europe                14469.
## 5 Oceania               18622.

C) Filtro por crecimiento global

Ahora, se calcula el promedio global del PIB per cápita de todo el dataset y se usa ese valor para filtrar los paises.

## PIB per cápita promedio global: 7215.33
## [1] "Países cuyo PIB per cápita promedio es superior al promedio global:"
## # A tibble: 50 × 2
##    country        gdpPercap_pais
##    <fct>                   <dbl>
##  1 Argentina               8956.
##  2 Australia              19981.
##  3 Austria                20412.
##  4 Bahrain                18078.
##  5 Belgium                19901.
##  6 Canada                 22411.
##  7 Croatia                 9332.
##  8 Czech Republic         13920.
##  9 Denmark                21672.
## 10 Finland                17474.
## # ℹ 40 more rows

d) Visualización y guardado

Se crea el gráfico de líneas de la evolución del PIB per cápita para tres paises seleccionados y lo guardamos usando ggplot2 y ggsave().

## 
## El gráfico ha sido guardado como: evolucion_pib_paises.png