Este informe genera automáticamente tablas de distribución de
frecuencias y gráficos para todas las
variables del data frame.
Detecta si cada variable es categórica
(caracter/factor, 0/1, o numérica con pocos valores distintos) o
numérica continua, y aplica lo correspondiente.
Instalamos y cargamos los paquetes necesarios.
Si alguno no está en el sistema, se instalará de forma automática.
pkgs <- c("dplyr","ggplot2","janitor","purrr","tidyr","forcats","scales","knitr","tibble","readxl")
to_install <- setdiff(pkgs, rownames(installed.packages()))
if (length(to_install)) install.packages(to_install, dependencies = TRUE)
invisible(lapply(pkgs, require, character.only = TRUE))
⚠️ Reemplace el nombre del archivo según corresponda.
Si su archivo es Excel (.xlsx), useread_excel().
Si es CSV, useread.csv().
# =========================
# Cargar la base de datos
# =========================
# Ejemplo si el archivo está en la misma carpeta del .Rmd:
# df <- read_excel("X1996_2002_valores_nominales_5_.xlsx")
# O bien si es CSV:
# df <- read.csv("X1996_2002_valores_nominales_5_.csv")
# Si está en otra carpeta, colocar la ruta completa:
# df <- read_excel("C:/Users/Juan/Desktop/X1996_2002_valores_nominales_5_.xlsx")
# Vista rápida
glimpse(df)
## function (x, df1, df2, ncp, log = FALSE)
character,
factor, binarias 0/1, o numéricas con
≤ 12 valores distintos (útil para variables como
año con pocos niveles).Creamos funciones auxiliares para automatizar tablas y gráficos.
# ¿Es binaria (0/1) una numérica?
is_binary01 <- function(x) {
is.numeric(x) && all(na.omit(x) %in% c(0,1))
}
# ¿Tratar como categórica?
treat_as_categorical <- function(x) {
is.character(x) || is.factor(x) || is_binary01(x) ||
(is.numeric(x) && dplyr::n_distinct(na.omit(x)) <= 12)
}
# Tabla de frecuencias para categóricas
freq_table_cat <- function(x) {
janitor::tabyl(x) |>
janitor::adorn_totals("row") |>
janitor::adorn_pct_formatting(digits = 1)
}
# Tabla de frecuencias por clases para numéricas
freq_table_num <- function(x, n_bins = 8) {
# Si todos los valores son iguales, devolvemos una tabla trivial
if (length(unique(na.omit(x))) < 2) {
return(tibble::tibble(clase = as.character(unique(x)),
n = length(x),
percent = "100.0%"))
}
brks <- pretty(x, n = n_bins)
xb <- cut(x, breaks = brks, include.lowest = TRUE, right = FALSE)
janitor::tabyl(xb) |>
dplyr::rename(clase = xb) |>
janitor::adorn_totals("row") |>
janitor::adorn_pct_formatting(digits = 1)
}
A continuación, para cada variable del data frame:
vars <- names(df)
cat("Variables detectadas: ", paste(vars, collapse = ", "), "\n\n")
Variables detectadas:
for (v in vars) {
x <- df[[v]]
# Título de sección para cada variable
cat("\n\n##", v, "\n")
if (treat_as_categorical(x)) {
cat("**Tipo detectado:** Categórica\n\n")
# Tabla
tb <- freq_table_cat(x)
print(knitr::kable(tb, align = "lrr",
caption = paste("Tabla de frecuencias —", v)))
# Gráfico de barras
p_bar <- ggplot(data.frame(val = as.factor(x)), aes(val)) +
geom_bar() +
labs(x = v, y = "Frecuencia", title = paste("Gráfico de barras —", v)) +
theme_minimal() +
coord_flip()
print(p_bar)
} else {
cat("**Tipo detectado:** Numérica continua\n\n")
# Tabla por clases
tb <- freq_table_num(x, n_bins = 8)
print(knitr::kable(tb, align = "lrr",
caption = paste("Tabla de frecuencias por clases —", v)))
# Histograma
p_hist <- ggplot(data.frame(val = x), aes(val)) +
geom_histogram(bins = 30) +
labs(x = v, y = "Frecuencia", title = paste("Histograma —", v)) +
theme_minimal()
print(p_hist)
# Boxplot
p_box <- ggplot(data.frame(val = x), aes(y = val)) +
geom_boxplot() +
labs(x = NULL, y = v, title = paste("Boxplot —", v)) +
theme_minimal()
print(p_box)
}
}
File > Knit Document para generar el HTML.año tiene pocos valores, el informe lo tratará como
categórico (útil para tablas y barras por año).n_bins = 8 en
freq_table_num().Session > Restart R).