library(tidyverse)
library(janitor)
library(readxl)
library(dplyr)
library(readr)
library(stringr)
library(purrr)

1 Ejemplo 1 Índice de precios de insumos agrícolas

Índice que resume el comportamiento de los precios en el mercado min a nivel nacional, de los productos más utilizados en la actividad agrícola para las diferentes etapas de producción, en productos: fertilizantes, entre simples y compuestos; plaguicidas entre herbicidas, fungicidas e insecticidas y; otros insumos entre coadyuvantes, reguladores fisiológicos y molusquicidas; tomando como período de referencia los precios en enero de 2021, cuando el índice toma el valor de 100. Para apoyo en la toma de decisiones por parte de los actores del sector.

1.1 1. Importamos los datos

df_insumos <- read_csv("01-datos/tablas-actividad-01/_ndice_de_precios_de_insumos_agr_colas_20250315.csv")
df_insumos

1.2 2. Diagnóstico

Las variables (insumos) están puestos como columnas; en esta tabla los totales están puestos como variables lo cual es innecesario porque se puede calcular aparte; y a las fechas debemos hacerlas correspondientes a los “insumos”.

1.3 3. Propuesta de solución

Lo que haría sería pivotear la tabla para que los insumos puestos en las columnas me queden en una sola variable y eliminaría los totales ya que esto el cálculo se puede hacer aparte.

Utolicé subset, en R permite seleccionar o eliminar columnas de un marco de datos según sus nombres. Para eliminar varias columnas usando subset(), simplemente especifique el marco de datos y las columnas que desea conservar, omitiendo las que desea eliminar. Conoce más aquí

df_insumos_ordenado <-
  df_insumos <- 
  subset(df_insumos, select = -c(2, 3, 4, 5, 6, 7, 8, 9, 10, 56, 57, 58))  |>
  pivot_longer(cols = -Fecha,
               names_to = "insumo",
               values_to = "indice") |> 
  rename(fecha = Fecha) |> 
  select(insumo, fecha, indice) |> 
  pivot_wider(names_from = fecha,
              values_from = indice) |> 
  pivot_longer(cols = -insumo,
               names_to = "fecha",
               values_to = "indice"
  ) 
               
df_insumos_ordenado

Realizé un pivoteo ancho porque me di cuenta que la tabla seguía teniendo un error y es que la fecha quedaba de “principal” es decir se repetía cada valor, pero lo que debe ser es que se repita “insumos”, es decir que esta intercambie de columna con fecha. Entonces lo que hice de nuevo fue pivotearla a formato largo para establecer ese cambio y así dejar bien las observaciones. Luego simplemente renombré y puedo decir que ya está la tabla organizada

2 Ejemplo 2 Registro de Usuario de Extensión Agropecuaria (RUEA)

Este dato, tienes por objetivo definir operática y técnicamente los procedimientos relacionados con el registro de usuarios del servicio público de extensión, agropecuaria, y el método de clasificación, con el fin de facilitar la localización y la priorización del servicio público de extensión agropecuaria, así como para cubrir otras necesidades y llevar un control de todas las personas que activamente, forman parte de Registro de Usuario de Extensión Agropecuaria(RUEA) del Municipio de Puente Nacional – Santander.

2.1 1. Importamos los datos

df_usuario <- read.csv("01-datos/tablas-actividad-01/Registro_de_Usuario_de_Extensi_n_Agropecuaria_RUEA__20250315.csv")

df_usuario

2.2 2. Diagnóstico

Esta tabla sí cumple con los principios del “tidy data”.

  • Cada variable está en su columna: Ninguna incumple esto, tenemos 13.
colnames(df_usuario)
##  [1] "CONSECUTIVO"            "FECHA.DE.ACTUALIZACIÒN" "VIGENCIA.PRESUPUESTAL" 
##  [4] "TIPO.DE.DOCUMENTO"      "SEXO"                   "ETNIA"                 
##  [7] "DISCAPACIDAD"           "DEPARTEMENTO"           "MUNICIPIO"             
## [10] "CODIGO.DE.MUNICIPIO"    "VEREDA"                 "LIENA.PRODUCTIVA"      
## [13] "HECTAREAS"
  • Cada fila es una observación: Al revisar la tabla no hay ninguna observación que no cumpla esa función. Todas las filas tienen sus correpondientes observaciones.

  • Cada celda es un valor: Como corresponde se sigue cumpliendo. Los valores de las celdas son correctos. Corresponden a cada variable y observación.

En fin, no noto que algún principio se vea incumplido.

2.3 3. Propuesta de solución

Lo que modificaría de ella sería las omitir los espacios, las tildes y las mayúsculas en las variables. Igualmente, dejaría solo con mayúscula inicial las observaciones.

Usé la función mutate para poder aplicarle a las columnas específicas esos cambios. Conoce más aquí

df_usuario_ordenado <-
  df_usuario |> 
  rename(
    consecutivo = CONSECUTIVO,
    fecha_de_actualizacion = FECHA.DE.ACTUALIZACIÒN,
    vigencia_presupuestal = VIGENCIA.PRESUPUESTAL,
    tipo_de_documento = TIPO.DE.DOCUMENTO,
    sexo = SEXO,
  etnia = ETNIA,
  discapacidad = DISCAPACIDAD,
  departamento = DEPARTEMENTO,
  municipio = MUNICIPIO,
  codigo_de_municipio = CODIGO.DE.MUNICIPIO,
  vereda = VEREDA,
  linea_productiva = LIENA.PRODUCTIVA,
  hectareas = HECTAREAS
  ) |> 
    mutate(across(c(tipo_de_documento, sexo, etnia, discapacidad, departamento, municipio, vereda, linea_productiva), str_to_sentence))
df_usuario_ordenado

3 Ejemplo 3 Telefonía Móvil trafico de voz por proveedor

Información referente al tráfico de voz expresado en minutos de Proveedores de Redes y Servicios Móviles de acuerdo con la Resolución 5076 de 2016. Periodo desde 2017 2T.

3.1 1. Importamos los datos

df_telefonia <- read.csv("01-datos/tablas-actividad-01/Telefon_a_M_vil_trafico_de_voz_por_proveedor_20250315.csv")

df_telefonia

3.2 2. Diagnóstico

En la variable año los valores no siguen un orden propio, pero al menos no los vemos puestos en las columnas. Aún así, se debe organizar la columna proveedor debido a que este es el “sujeto” y debe estar en primera vista para saber de qué se está hablando.

colnames(df_telefonia)
## [1] "AÑO"                    "TRIMESTRE"              "PROVEEDOR"             
## [4] "CONSUMO.PREPAGO"        "CONSUMO.POSPAGO"        "INGRESOS.OPERACIONALES"

3.3 3. Propuesta de solución

Lo primero que hice fue pivotear a formato ancho para organizar “proveedor”. Luego aplico el pivoteo largo para traerla de nuevo correctamente. Borré la columna 7 porque se le asignaron valores NA que no tenían sentido. Renombré las columnas en minúsculas omitiendo los espacios.

Nuevamente, apliqué un pivoteo a formato ancho para luego poder reordenar los años en una columna con un pivoteo largo.

Finalmente, lo que hice fue cambiar el orden de las columnas teniendo en cuenta que el sujeto es el proveedor, así que esa sería la primera, año y las demás consecutivamente.

df_telefonia_ordenado <- 
  df_telefonia |> 
  pivot_wider(
    names_from = PROVEEDOR, 
    values_from = -c(AÑO, TRIMESTRE, CONSUMO.PREPAGO, CONSUMO.POSPAGO, INGRESOS.OPERACIONALES)
  ) |> 
  pivot_longer(
    cols = -c(AÑO, TRIMESTRE, CONSUMO.PREPAGO, CONSUMO.POSPAGO, INGRESOS.OPERACIONALES),
    names_to = "proveedor"
  ) |> 
  subset(select = -c(7)) |> 
  rename(
    año = AÑO, 
    trimestre = TRIMESTRE, 
    consumo_prepago = CONSUMO.PREPAGO, 
    consumo_pospago = CONSUMO.POSPAGO, 
    ingresos_operacionales = INGRESOS.OPERACIONALES
  ) |> 
  select(año, trimestre, consumo_prepago, consumo_pospago, ingresos_operacionales, proveedor) |> 
  pivot_wider(
    names_from = c(año),
    values_from = c(1) 
  ) |>
  pivot_longer(cols = -c(trimestre, consumo_prepago, consumo_pospago, ingresos_operacionales, proveedor),
               names_to = "año"
                 ) |> 
  subset(select = -c(7)) |> 
  select(proveedor, año, trimestre, consumo_prepago, consumo_pospago, ingresos_operacionales) |> 
  arrange(proveedor, año)

df_telefonia_ordenado

Y así quedaría transformada y organizada.

4 Ejemplo 4 Inder Envigado

Se describen los eventos más relevantes del 2021 al primer semestre 2024.

4.1 1. Importamos los datos

df_eventos <- read_csv("01-datos/tablas-actividad-01/Eventos_deportivos_20250318.csv")

df_eventos

4.2 2. Diagnóstico

Lo definiría como un insufrible error la columna Fecha por lo siguiente:

  1. Mezcla caracteres con números.
  2. Estos valores incluyen dos informaciones diferentes “meses” y “días”.

4.3 3. Propuesta de solución

En la columna llamada “Fecha” se encuentran valores como: “11 de febrero” “Mayo a Agosto” “11 al 14 de noviembre” “Junio a diciembre” “Mayo - Junio” “Sabado 3 de Septiembre - de 2 pm a 5 pm” “Viernes 07 de octubre 2 pm a 5 pm” “Nov - Diciembre 2022”

Lo que propongo es crear dos nuevas columnas a partir de “Fecha”. Una que se llame “mes” e incluya los valores que solo contienen los caracteres de meses (ej., “Junio a diciembre”, “Mayo - Junio”). Y otra que se llame día e incluya los valores numéricos como “11” y “11 al 14”. Igualmente, que se elimine los agregados como, ” -“,”2022”, “- de 2 pm a 5 pm”, “Sábado”, “Viernes”. Entonces tendría que mutar esa columna, unir esos meses que están separados por a y -. Luego extraer los días y eliminar los agregados innecesarios. Sé que puede que se pierdan valores debido a que en el código se pueden omitir palabras al aplicar cambios a valores tan diferentes (además, en las columnas que solo existen meses al crear las nuevas columnas en “día” ese valor quedará vacío). Por ende, espero que aparezcan algunos en NA y aquellos que cumplan con las separaciones sí puedan estar correctos.

df_eventos_ordenado <- 
  df_eventos |> 
  mutate(across(c(Período), as.character)) |> 
  rename(
    periodo = Período,
    evento = Evento,
    fecha = Fecha,
    lugar = Lugar
  ) |> 
  mutate(
    fecha = str_trim(fecha),
    mes = str_extract(fecha, "(Enero|Febrero|Marzo|Abril|Mayo|Junio|Julio|Agosto|Septiembre|Octubre|Noviembre|Diciembre)(\\s*(a|\\-|de)\\s*(Enero|Febrero|Marzo|Abril|Mayo|Junio|Julio|Agosto|Septiembre|Octubre|Noviembre|Diciembre))?"),
    
    
    mes = str_replace_all(mes, " - ", " a "),
    mes = str_replace_all(mes, " a ", " a "),
    
    
    dia = str_extract(fecha, "\\b\\d{1,2}(\\s*al\\s*\\d{1,2})?\\b")
  ) |> 
  select(-c(3))

df_eventos_ordenado
  • Efectivamente se perdieron muchos valores, el código que utilicé no fue eficiente lastimosamente, espero me de una retroalimentación sobre esta base específica.

5 Ejemplo 5 Precipitaciones Totales Mensuales

Volumen de precipitaciones mensuales obtenido en la red de estaciones hidrológicas de la Corporación Autónoma Regional de Cundinamarca - CAR.

5.1 1. Importamos el archivo

df_precipitacion <- read.csv("01-datos/tablas-actividad-01/Precipitaciones_Totales_Mensuales_20250316.csv")

df_precipitacion

5.2 2. Diagnóstico

Enero a Diciembre puestos como variables cuando pueden caber en una sola “mes”, están afectando los valores de las celdas. Las otras variables están considerablemente bien.

5.3 3. Propuesta de solución

Al querer realizar el pivoteo me daba error Enero (chr) y Abril (dbl), entonces lo que hice fue aplicar la función mutate para dejarlos a todos como caracter. Con esto ya pude realizar el pivoteo a formato largo. Por último, lo que hice fue renombarlas para omitir las tildes y los espacios.

df_precipitacion_ordenado <-
  df_precipitacion |>
  mutate(across(c(ENERO, FEBRERO, MARZO, ABRIL, MAYO, JUNIO, JULIO, AGOSTO, SEPTIEMBRE, OCTUBRE, NOVIEMBRE, DICIEMBRE), as.character)) |> 
  pivot_longer( 
    cols = -c(ESTACIÓN, CÓDIGO, X.N, Y.E, MUNICIPIO, CUENCA, AÑO),
    names_to = "mes",
    values_to = "mm"
    ) |> 
  rename(
    estacion = ESTACIÓN,
    codigo = CÓDIGO,
    x_n = X.N,
    y_e = Y.E,
    municipio = MUNICIPIO,
    cuenca = CUENCA,
    año = AÑO
  ) |> 
  select(municipio, estacion, codigo, x_n, y_e, cuenca, año) |> 
  arrange(municipio)

df_precipitacion_ordenado

La tabla quedaría reorganizada de esa manera y cumpliría los principlios del “tidy data”.

6 Ejemplo 6 Agricultura y Desarrollo Rural

6.1 1 Importamos los datos

df_rural <- read_csv("01-datos/tablas-actividad-01/Agricultura_y_Desarrollo_Rural_-_Evaluaci_n_Agr_cola_Departamento_de_Bol_var._20250319.csv")
  
df_rural

6.2 2. Diagnóstico

Los nombres de las columnas tienen saltos de línea (), lo que los hace un poco confusos y difíciles de administrar. Además, algunos nombres son demasiado largos y confusos, lo que no ayuda mucho. Otro aspecto que noté es que algunos valores numéricos, como los de las columnas “Área plantada (ha)” y “Rendimiento (t)”, se guardan como texto porque usan comas (por ejemplo, “2500” en lugar de 2500). Esto es un problema porque no podemos realizar cálculos directamente con ellos. También notamos valores faltantes en columnas importantes como “Área cosechada (ha)”, “Rendimiento (t)” y “Rendimiento (t/ha)”, lo que podría afectar el análisis que realicemos.

6.3 3. Propuesta de solución

Para arreglar estos problemas podemos hacer lo siguiente, renombrar las columnas para que sean más claras y eliminar caracteres innecesarios, como los saltos de línea y convertir los datos numéricos al formato correcto, quitando las comas y asegurándonos de que sean números de verdad. También manejar los valores faltantes, eliminando las filas que no estén completas y revisar la estructura del dataset para asegurarnos de que las variables y observaciones estén organizadas de la manera más lógica.

colnames(df_rural)
##  [1] "CodDpto"              "Departamento"         "CodMunicipio"        
##  [4] "Municipio"            "Cultivo"              "Periodo"             
##  [7] "Área Sembrada\n(ha)"  "Área Cosechada\n(ha)" "Producción\n(t)"     
## [10] "Rendimiento\n(t/ha)"
df_rural_ordenado <-
  df_rural |>
  rename(
    cod_dpto = CodDpto,
    cod_municipio = CodMunicipio,
    departamento = Departamento,
    municipio = Municipio,
    cultivo = Cultivo,
    periodo = Periodo,
    area_sembrada = "Área Sembrada\n(ha)",
    area_cosechada = "Área Cosechada\n(ha)",
    produccion = "Producción\n(t)",
    rendimiento = "Rendimiento\n(t/ha)"
    
  ) |> 
  mutate(across(c(cultivo), str_to_sentence)) |> 
  select(-c(10))

df_rural_ordenado

Has llegado al final. Presiona aquí para salir.