UP | HOME |

Depuración de una base de datos con R y LaTeX

2025-10-23

Depuración de una base de datos con R y LaTeX

La gran mayoría de análisis de datos que realizamos se efectúan con tablas recogidas en hojas de cálculo. Y lo primero que hacemos consiste en depurar la base de datos. Consume una gran cantidad de tiempo y exige reiterar la comprobación de los datos y sus modificaciones.

depurando_datos.png

En mi caso, genero un fichero en pdf donde se muestra la tabla de frecuencia de cada variable. Así me resulta fácil visualizar si aparecen valores cuasi duplicados (por ejemplo, arbol, árbol, Árbol, Arbol, árbpl, etc). Como he de repetir este proceso en incontables ocasiones, lo he automatizado con R (que llama a LaTeX).

 ## Tablas descriptivas para chequear la base de datos
 ## Lee el fichero xls, crea un fichero pp.tex y lo compila

 library(readxl)
 library(xtable)
 library(tools)

   datos <- read_excel("2017-2023.xlsx", sheet = 1) # Comprueba que lo lee bien
 etiquetas <- as.data.frame(read_excel("2017-2023.xlsx", sheet = 2)) #
 etiquetas

 ficherotex <- "pp.tex"
 cat(paste("%",date()),file=ficherotex,sep="\n")

 ## Cabecera tex
 texto <- "
 \\documentclass[a4paper,14pt]{extarticle}
 \\usepackage[utf8]{inputenc}     % Linux
 \\usepackage[spanish,es-tabla,es-nodecimaldot,es-noshorthands]{babel} % Spanish titles
 \\usepackage{fouriernc}          % Type of font
 \\usepackage[T1]{fontenc}        % To deal with non ascii characters
 \\usepackage{graphicx}           % To include graphs. See epslatex.pdf
 \\DeclareGraphicsExtensions{.pdf,.png,.jpg,.mps}
 \\graphicspath{{graphics/}}
 \\usepackage{amsmath,tabu}
 \\usepackage{booktabs,multirow,paralist}%enumitem
 \\usepackage{marginfix} % para el marginnote, marginfigure, que no se salga de la página
 \\usepackage{float}
 \\begin{document}
 \\tableofcontents
 "
 cat(texto,file=ficherotex,sep="\n",append=TRUE)

 ## Para cada variable
 for( variable in colnames(datos)) {
     etiqueta <- as.character(etiquetas[etiquetas[,1]==variable, 2])[1]
     etiqueta
     print(variable)

     variabletex <- gsub("_","",variable)
     texto <- paste("
 \\newpage
 \\section{",variabletex , etiqueta,"}\n")
     cat(texto,file=ficherotex,sep="\n",append=TRUE)

     tabla <- table(datos[,variable])
     print(tabla)
     tabla  <- round(tabla*100/sum(tabla),2)

     if(length(tabla)){
         texto <- paste("
 \\begin{table}[H]
 \\tiny
 \\caption{\\label{tab:tab:tabla-univariante-",variabletex,"}",variabletex, etiqueta,"}",
 "\\centering
 \\begin{tabular}[t]{p{0.95\\textwidth}r}
 \\toprule
& \\%\\\\
 \\midrule")
         cat(texto,file=ficherotex,sep="\n",append=TRUE)

         texto <- print(xtable(tabla, digits=c(2,2)),
                        only.contents=TRUE,
                        include.colnames=FALSE,
                        include.rownames=TRUE,
                        hline.after=NULL,
                        print.results=FALSE)
         cat(texto,file=ficherotex,sep="\n",append=TRUE)

         texto <- "
 \\bottomrule
 \\end{tabular}
 \\end{table}"
         cat(texto,file=ficherotex,sep="\n",append=TRUE)
     }
 }

 texto <- "\\end{document}"
 cat(texto,file=ficherotex,sep="\n",append=TRUE)


 tools::texi2pdf(ficherotex, clean = TRUE)