Datos ordenados

Ejemplos de ordenamiento con tidyr

Author

Edimer David Jaramillo

Published

March 10, 2025

Bibliotecas

Code
library(tidyverse)
library(janitor)
library(readxl)

tidyr

Formatos ancho y largo: pivot_longer() y pivot_wider()

Manejo de datos con dplyr

Unión de tablas (joins)

  • Vamos a suponer que tenemos las siguientes tablas:

Code
tabla_x <-
  data.frame(
    depto = c("Antioquia", "Cundinamarca", "Valle", "Santander"),
    ciudad = c("Medellín", "Bogotá", "Palmira", "Barbosa"),
    desempleo = c(0.76, 0.89, 0.54, 0.71)
  )

tabla_y <-
  data.frame(
    departamento = c("Antioquia", "Cundinamarca", "Santander", "Antioquia"),
    municipio = c("Medellín", "Bogotá", "Bucaramanga", "Barbosa"),
    salario = c(1.45, 1.86, 1.71, 1.36)
  )

  • Si tienen el mismo nombre solo será necesario declarlo en el argumento “by”.
  • Si tienen nombres diferentes debemos declarar ambos nombres en el argumento “by”.
Code
inner_join(x = tabla_x,
           y = tabla_y,
           by = c("depto" = "departamento",
                  "ciudad" = "municipio"))

  • En este caso la tabla de la izquiera (x) es “tabla_x”:
Code
left_join(
  x = tabla_x,
  y = tabla_y,
  by = c("depto" = "departamento", "ciudad" = "municipio")
)
  • En este caso la tabla de la izquiera (x) es “tabla_y”:
Code
left_join(
  x = tabla_y,
  y = tabla_x,
  by = c("departamento" = "depto", "municipio" = "ciudad")
)

  • En este caso la tabla de la derecha (y) es “tabla_y”:
Code
right_join(x = tabla_x,
           y = tabla_y,
           by = c("depto" = "departamento",
                  "ciudad" = "municipio"))
  • En este caso la tabla de la derecha (y) es “tabla_x”:
Code
right_join(x = tabla_y,
           y = tabla_x,
           by = c("departamento" = "depto",
                  "municipio" = "ciudad"))

Code
full_join(
  x = tabla_x,
  y = tabla_y,
  by = c("depto" = "departamento", "ciudad" = "municipio")
)

Ejemplo 1: costos de Fedearroz

Code
df_costos <- 
  read_excel(
    "datos/COSTOS POR HECTÁREA DE ARROZ, SISTEMA RIEGO, NACIONAL, II SEMESTRE.xlsx",
    skip = 1
  )

df_costos 
Code
df_costos_ordenado <-
  df_costos |>
  slice(-c(9, 10)) |>
  pivot_longer(cols = -RUBRO,
               names_to = "año",
               values_to = "costo") |>
  rename(rubro = RUBRO) |>
  mutate(rubro = str_to_sentence(rubro))

df_costos_ordenado
Code
df_costos_ordenado |> 
  group_by(año) |> 
  summarise(total = sum(costo))
Code
df_costos_ordenado |> 
  pivot_wider(names_from = año,
              values_from = costo)

Ejemplo 2: Consumo de fertilizantes

Code
df_fertilizantes <- 
  read_csv("datos/API_AG.CON.FERT.ZS_DS2_es_csv_v2_18223.csv", skip = 3)

df_fertilizantes
  • El igual en R se establece con doble símbolo igual –> “==”
  • La diferencia en R se establece con símbolo de admiración de cierre y el símbolo igual —> “!=”
Code
df_fertilizantes_ordenada <-
  df_fertilizantes |>
  select(-c("Country Code", "Indicator Name", "Indicator Code",  ...69)) |> 
  pivot_longer(
    cols = -c("Country Name"),
    names_to = "año",
    values_to = "consumo_fertilizantes"
  ) |> 
  filter(!is.na(consumo_fertilizantes)) |> 
  filter(!is.na(`Country Name`))

df_fertilizantes_ordenada |> head()

Ejemplo 3: Inventario ganado bovino Valle del Cauca

Code
df_bovinos <-
  read_csv(
    "datos/Inventario_Poblacional_Del_Ganado_Bovino_Valle_del_Cauca_20250311.csv"
  )

df_bovinos |> head()
Code
df_bovinos_ordenada <-
  df_bovinos |>
  pivot_longer(
    cols = -c(Municipio, Año, `Unidades Productoras`),
    names_to = "variable",
    values_to = "bovinos"
  ) |>
  mutate(
    variable = str_trim(variable),
    sexo = str_extract(variable, "Machos|Hembras"),
    edad = str_extract(variable, "(\\d+-\\d+|>\\s?\\d+)\\s*Meses")
  ) |> 
  filter(!is.na(sexo)) |> 
  filter(!is.na(edad)) |> 
  select(-variable)

df_bovinos_ordenada |> head()

Ejemplo 4: Raíces Bulbos y Tubérculos en el departamento del Valle del Cauca

Code
df_area_sembrada_desord <-
  read_csv(
    "datos/Superficie_Sembrada_con_Ra_ces_Bulbos_y_Tub_rculos_en_el_departamento_del_Valle_del_Cauca_20240312.csv"
  )

df_area_cosechada_desord <-
  read_csv(
    "datos/Superficie_Cosechada_con_Ra_ces_Bulbos_y_Tub_rculos__en_el_Departamento_del_Valle_del_Cauca_20240312.csv"
)

df_produccion_desord <-
  read_csv(
    "datos/Producci_n_en_Toneladas_por_Hect_reas_de_Ra_ces_Bulbos_y_Tub_rculos_en_el_Departamento_del_Valle_del_Cauca_20240312.csv"
  )

df_rto_desord <-
  read_csv(
    "datos/Rendimiento_en_toneladas_por_hect_reas_en_Cultivos_de__Ra_ces_Bulbos_y_Tub_rculos_en_el_departamento_del_Valle_del_Cauca_20240312.csv"
  )
Code
df_area_sembrada_ordenada <-
  df_area_sembrada_desord |>
  filter(Municipios != "TOTAL") |>
  pivot_longer(
    cols = -c(Municipios, año),
    names_to = "cultivo",
    values_to = "area_sembrada"
  ) |>
  mutate(area_sembrada = as.numeric(area_sembrada))

df_area_cosechada_ordenada <-
  df_area_cosechada_desord |>
  filter(Municipios != "TOTAL") |>
  pivot_longer(
    cols = -c(Municipios, año),
    names_to = "cultivo",
    values_to = "area_cosechada"
  ) |>
  mutate(area_cosechada = as.numeric(area_cosechada))

df_produccion_ordenada <-
  df_produccion_desord |>
  filter(Municipios != "TOTAL") |>
  pivot_longer(
    cols = -c(Municipios, año),
    names_to = "cultivo",
    values_to = "produccion"
  ) |>
  mutate(produccion = as.numeric(produccion))


df_rto_ordenada <-
  df_rto_desord |>
  filter(Municipios != "TOTAL") |>
  pivot_longer(
    cols = -c(Municipios, año),
    names_to = "cultivo",
    values_to = "rendimiento"
  ) |>
  mutate(rendimiento = as.numeric(rendimiento))
  • ¿Cómo unimos las cuatro bases de datos? ¿Qué variables tienen en común?
Code
df_total_odenada <-
  left_join(
    x = df_area_sembrada_ordenada,
    y = df_area_cosechada_ordenada,
    by = c("Municipios", "año", "cultivo")
  ) |>
  left_join(y = df_produccion_ordenada,
            by = c("Municipios", "año", "cultivo")) |>
  left_join(y = df_rto_ordenada,
            by = c("Municipios", "año", "cultivo")) |> 
  distinct(Municipios, año, cultivo, .keep_all = TRUE)

df_total_odenada |> head()

Exportar archivos (.csv)

Code
write_csv(df_total_odenada, "evas_valle.csv")