<- function(month) {
merge_month
<- c("DIRECTORIO", "SECUENCIA_P", "ORDEN", "HOGAR", "FEX_C18")
key_variables
<- file.path(getwd(), "datos", month)
base_dir
<- list.files(path = base_dir, pattern = "*.csv", full.names = TRUE, ignore.case = TRUE)
all_files
# Leer el primer archivo para inicializar el data.table final
<- fread(file = all_files[1])
final_df
# Iterar sobre los archivos restantes
for (file in all_files[-1]) {
<- fread(file = file)
df
# Encontrar las claves comunes para el merge
<- intersect(colnames(df), key_variables)
new_key_variables
# Realizar el merge
<- merge(final_df, df, by = new_key_variables, all.x = TRUE)
final_df
# Encontrar y renombrar columnas que terminan en .x
<- grep("\\.x$", colnames(final_df), value = TRUE)
cols_x setnames(final_df, old = cols_x, new = gsub("\\.x$", "", cols_x))
# Encontrar y eliminar columnas que terminan en .y
<- grep("\\.y$", colnames(final_df), value = TRUE)
cols_y := NULL]
final_df[, (cols_y)
}
return(final_df)
}
Guía Práctica: Unión de Bases de Datos de la GEIH con Funciones en R
Nota: Para utilizar las funciones y unir las bases de datos no es necesario saber R, el archivo README.md
(leer primero el archivo README.md) está creado con el fin de ser lo más explícito posible para que puedas utilizarlas sin inconvenientes, sin embargo, para entender como funciona la lógica detrás del pegado de las bases de datos es necesario entender como funciona R. En este espacio explicaremos linea a linea como están construidas estás funciones.
1. Función para el pegado de todos los modulos en un mes determinado (merge_month
)
La siguiente función (merge_month
) tiene como objetivo unir todos los modulos que hay dentro de cada mes. A continuación se expicará cada una de las funcionalidades dentro de ella:
1.1 Definición de la función
<- function(month) { merge_month
Aquí defines una función llamada merge_month
. Las funciones en R son bloques de código que realizan una tarea específica y pueden ser reutilizadas. Esta función toma un único argumento, month
, que es un texto que representa el nombre de un mes (por ejemplo, "enero"
, "febrero"
). Este argumento será utilizado para identificar la carpeta en la que se encuentran los archivos CSV que quieres fusionar.
1.2 Definir las variables clave
<- c("DIRECTORIO", "SECUENCIA_P", "ORDEN", "HOGAR", "FEX_C18") key_variables
En este paso, defines un vector llamado key_variables
que contiene los nombres de las columnas que actuarán como claves para la fusión de los archivos CSV.
¿Por qué necesitas claves? Al fusionar datos de múltiples archivos, es común que haya algunas columnas (variables) que son compartidas por todos los archivos y que identifican de manera única cada registro. Estas son las claves. Al fusionar, R combinará los datos que comparten estas claves para asegurarse de que los datos coincidan correctamente. Por ejemplo, si DIRECTORIO
, SECUENCIA_P
, ORDEN
, HOGAR
y FEX_C18
son variables que están presentes en todos los archivos, los registros se combinarán en base a la coincidencia de valores en estas columnas.
1.4 Definir el directorio base
<- file.path(getwd(), "datos", month) base_dir
Esta línea crea una ruta de acceso (base_dir
) que apunta a la carpeta donde se encuentran los archivos CSV para el mes específico.
¿Cómo funciona?
getwd()
obtiene el directorio de trabajo actual (es decir, la carpeta en la que estás trabajando).file.path()
es una función que construye una ruta de archivo de manera portátil, es decir, que funcionará tanto en Windows como en macOS o Linux."datos"
es una subcarpeta dentro del directorio de trabajo donde están almacenados los datos.month
es el argumento pasado a la función que especifica el nombre de la carpeta del mes.
Ejemplo: Si getwd()
devuelve "/Users/usuario/proyecto"
y month
es "enero"
, entonces base_dir
será "/Users/usuario/proyecto/datos/enero"
.
1.5 Listar los archivos CSV en el directorio
<- list.files(path = base_dir, pattern = "*.csv", full.names = TRUE, ignore.case = TRUE) all_files
Aquí creas una lista (all_files
) de todos los archivos CSV en el directorio especificado por base_dir
.
Detalles:
list.files()
es una función que lista los nombres de los archivos en un directorio.path = base_dir
le indica alist.files()
en qué carpeta buscar.pattern = "*.csv"
especifica que solo quieres archivos que terminan en.csv
(es decir, archivos CSV).full.names = TRUE
indica que quieres las rutas completas de los archivos, no solo los nombres.ignore.case = TRUE
asegura que la búsqueda no distinga entre mayúsculas y minúsculas (es decir,*.CSV
y*.csv
serán tratados de la misma manera).
Resultado: Si hay tres archivos CSV en la carpeta (archivo1.csv
, archivo2.csv
, archivo3.csv
), all_files
contendrá las rutas completas de estos archivos como una lista de cadenas de texto.
1.6 Leer el primer archivo
<- fread(file = all_files[1]) final_df
Aquí lees el primer archivo CSV de la lista all_files
y lo almacenas en un data.table
llamado final_df
.
Detalles:
fread()
es una función rápida para leer archivos CSV en R, parte del paquetedata.table
.file = all_files[1]
indica que debes leer el primer archivo en la listaall_files
.
Ejemplo: Si el primer archivo es "/Users/usuario/proyecto/datos/enero/archivo1.csv"
, entonces fread()
cargará este archivo en final_df
.
1.7 Fusión de los archivos restantes
for (file in all_files[-1]) {
<- fread(file = file)
df
<- intersect(colnames(df), key_variables)
new_key_variables
<- merge(final_df, df, by = new_key_variables, all.x = TRUE) final_df
Este bloque de código fusiona todos los archivos CSV restantes en
final_df
.Paso a paso:
for (file in all_files[-1])
inicia un buclefor
que itera sobre todos los archivos enall_files
, excepto el primero (all_files[-1]
).df <- fread(file = file)
lee cada archivo en undata.table
temporal llamadodf
.new_key_variables <- intersect(colnames(df), key_variables)
identifica las columnas clave comunes entredf
yfinal_df
.final_df <- merge(final_df, df, by = new_key_variables, all.x = TRUE)
fusionafinal_df
condf
utilizando las columnas clave comunes, asegurando que todas las filas definal_df
se mantengan (all.x = TRUE
).
Ejemplo: Si tienes tres archivos (
archivo1.csv
,archivo2.csv
,archivo3.csv
):final_df
empieza comoarchivo1.csv
.Luego se fusiona con
archivo2.csv
usando las columnas clave comunes.Finalmente, se fusiona con
archivo3.csv
.
1.8 Columnas con Sufijo (.x |.y)
Es posible que algunas columnas no sean necesarias después de la fusión o que puedan crear confusión si aparecen en múltiples versiones (por ejemplo, PERIODO.x
, PERIODO.y
). Este paso asegura que elimines esas columnas duplicadas o no necesarias para mantener el data.table
final limpio y manejable.
Renombrar Columnas con Sufijo .x
<- grep("\\.x$", colnames(final_df), value = TRUE)
cols_x setnames(final_df, old = cols_x, new = gsub("\\.x$", "", cols_x))
grep("\\.x$", colnames(final_df), value = TRUE)
: Busca y lista las columnas enfinal_df
que terminan en.x
.setnames()
: Renombra estas columnas eliminando el sufijo.x
.
Eliminar Columnas con Sufijo .y
<- grep("\\.y$", colnames(final_df), value = TRUE)
cols_y := NULL] final_df[, (cols_y)
grep("\\.y$", colnames(final_df), value = TRUE)
: Busca y lista las columnas enfinal_df
que terminan en.y
.final_df[, (cols_y) := NULL]
: Elimina estas columnas deldata.table
.
1.9 Devolver el data.table final
return(final_df)
Esta línea simplemente devuelve el data.table
resultante (final_df
) después de que todos los archivos han sido fusionados y las columnas duplicadas han sido eliminadas.
Uso de la función: Después de definir esta función, puedes llamarla con el nombre del mes deseado para obtener el data.table
fusionado de los archivos CSV correspondientes.
<- merge_month("enero") merged_data
Esto ejecutará la función y devolverá un data.table
llamado merged_data
que contiene los datos fusionados de todos los archivos CSV en la carpeta "enero"
.
2. Función para el pegado de todos los meses (geih_completed
)
En esta función se uniran todos los meses antes creados, para formar una sola base de datos, el resultado de esta sería la GEIH.
<- function () {
geih_completed
<- file.path(getwd(), "datos")
base_dir
<- list.dirs(path = base_dir, full.names = FALSE, recursive = FALSE)
months
<- data.table()
all_months
for (month in months) {
if (length(all_months) == 0) {
<- merge_month(month)
all_months else {
} <- rbindlist(list(all_months, merge_month(month)), fill = T)
all_months
}
}
fwrite(all_months, file = "geih_complete.csv")
return (all_months)
}
geih_completed()
2.1 Definición de la función
<- function () { geih_completed
La función geih_completed
no toma ningún argumento. Su propósito es ejecutar un proceso de combinación de datos en función de los archivos CSV presentes en subdirectorios de la carpeta "datos"
.
2.2 Definir el directorio base
<- file.path(getwd(), "datos") base_dir
Aquí se define el directorio base (base_dir
) que contiene los subdirectorios con los datos.
¿Cómo funciona?
getwd()
obtiene el directorio de trabajo actual.file.path()
construye una ruta al directorio"datos"
dentro del directorio de trabajo actual.
Ejemplo: Si tu directorio de trabajo es "/Users/usuario/proyecto"
, entonces base_dir
será "/Users/usuario/proyecto/datos"
.
2.3 Listar los subdirectorios (meses)
<- list.dirs(path = base_dir, full.names = FALSE, recursive = FALSE) months
Esta línea obtiene una lista de subdirectorios dentro de base_dir
, que se espera que correspondan a diferentes meses.
Detalles:
list.dirs()
devuelve una lista de directorios.path = base_dir
especifica el directorio base desde donde listar los subdirectorios.full.names = FALSE
asegura que solo se devuelvan los nombres de los subdirectorios, no las rutas completas.recursive = FALSE
asegura que solo se listan los directorios de primer nivel dentro debase_dir
.
Ejemplo: Si base_dir
contiene subdirectorios "enero"
, "febrero"
, y "marzo"
, entonces months
será c("enero", "febrero", "marzo")
.
2.4 Inicializar un data.table
vacío
for (month in months) {
Inicia un bucle for
que iterará sobre cada mes en la lista months
.
2.5 Combinar datos para cada mes
if (length(all_months) == 0) {
<- merge_month(month)
all_months else {
} <- rbindlist(list(all_months, merge_month(month)), fill = T)
all_months }
Dentro del bucle, se verifica si all_months
está vacío para decidir si se debe inicializar con los datos del primer mes o fusionar con los datos de meses adicionales.
Detalles:
if (length(all_months) == 0)
verifica siall_months
está vacío. La funciónlength()
aplicada a undata.table
devuelve el número de filas, por lo quelength(all_months) == 0
indica queall_months
no tiene filas.all_months <- merge_month(month)
llama a la funciónmerge_month()
para procesar y combinar los archivos del mes actual y asigna el resultado aall_months
.else
siall_months
ya tiene datos, combina los datos del mes actual con los datos existentes usandorbindlist()
. Esto agrega las filas deldata.table
obtenido demerge_month(month)
aall_months
.fill = T
asegura que se llenarán los datos faltantes con NA cuando las columnas no coincidan entre losdata.table
.
2.6 Devolver el data.table
combinado
return(all_months)
Finalmente, la función devuelve el data.table
combinado (all_months
) que contiene los datos de todos los meses procesados.
2.7 Llamada a la Función
geih_completed()
Finalmente, se llama a la funcióngeih_completed()
para ejecutar el código y consolidar los datos de todos los meses disponibles en el directorio datos
en un único archivo CSV.
Apéndice
Función merge_month()
La función merge_month
toma como entrada el nombre de un mes y realiza la fusión de múltiples archivos CSV en un directorio específico del mes. Primero, define las variables a eliminar y las variables clave para la fusión. Luego, lista todos los archivos CSV en el directorio del mes, lee el primer archivo y lo usa como base. En un bucle, lee cada archivo restante, fusiona sus datos con la base usando las variables clave comunes, y elimina columnas innecesarias que puedan haber sido duplicadas en la fusión. Finalmente, devuelve el data.table
consolidado con la información combinada.
Función geih_completed()
La función geih_completed
se encarga de consolidar los datos de todos los meses disponibles en el directorio datos
en un único archivo CSV. Primero, define la ruta base y obtiene los nombres de los subdirectorios (que corresponden a los meses) en dicha ruta. Luego, inicializa un data.table
vacío para almacenar los datos combinados. En un bucle, para cada mes, llama a la función merge_month
para fusionar los archivos CSV del mes actual, y une estos datos con los datos acumulados anteriormente usando rbindlist
. Finalmente, guarda el data.table
completo en un archivo CSV llamado “geih_complete.csv” y devuelve el data.table
resultante.
Contáctanos
Te invitamos a explorar el proyecto completo, con todas su guias indicaciones y demás ¡Solo visita el repositorio del Proyecto!