# 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
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.
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
)
identificar_tipo <- function(elemento) {
tipo_de_dato <- class(elemento)
return(tipo_de_dato)
}
Aplicamos la función identificar_tipo() a toda la lista
utilizando sapply().
resultados_tipos <- sapply(mi_lista_variada, identificar_tipo)
## Edad Nombre Activo Pi Mensaje Cero
## "numeric" "character" "logical" "numeric" "character" "integer"
## Es_Valido
## "logical"
Creamos un Creamos un data.frame llamado
datos_personas con tres columnas: nombre
(carácter), edad (numérico) y ciudad
(carácter).
## nombre edad ciudad
## 1 Alondra 28 CDMX
## 2 Juan 35 Monterrey
## 3 Victoria 22 Guadalajara
## 4 Antonio 41 Puebla
## 5 Alma 30 Tijuana
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
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."
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
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
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
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.
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
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