Pasos a seguir

    1. Importar la base de datos. Como está en formato office (excel) se importa a través de la biblioteca readxl con la función read_excel(). Como las primeras cuatro filas son información no relevante para el análisis se omiten a través del argumento “skip”.
    1. Editar los nombres a través de la función clean_names() de la biblioteca janitor.
    1. Eliminar la última fila porque contiene totales. Los totales son un resultado y no un individuo.
    1. Eliminar las columnas que no son de interés.
    1. Convertir de formato ancho a largo buscando tener datos ordenados, es decir, cada variable en una columna, cada observación en una fila y cada valor en una celda. Este proceso es posible a través de la función pivot_longer() del paquete tidyr. Al final de este proceso vamos a tener una base de datos con 8976 filas (1122 filas x 8 columnas) y 4 columnas.
    1. Fraccionar o separar la columna “tipo” en cuatro nuevas variables. La separación de la columna se hace basdado en un tipo de seperador específico, en este caso el guión al piso "_".
    1. Unir las columnas “edad1” y “edad2” en una sola variable de nombre “edad”.
    1. Como queda sobrando “edad3” la vamos a eliminar de la base de datos final.

Paso 1

library(readxl)
censo1 <- read_excel(path = "BOVINOS-CENSO-2020.xlsx", skip = 4)
censo1

Paso 2

names(censo1)
##  [1] "DEPARTAMENTO"                    "MUNICIPIO"                      
##  [3] "CODIGO MUNICIPIO"                "TERNERAS < 1 AÑO"               
##  [5] "TERNEROS < 1 AÑO"                "HEMBRAS 1 - 2 AÑOS"             
##  [7] "MACHOS 1 - 2 AÑOS"               "HEMBRAS 2 - 3 AÑOS"             
##  [9] "MACHOS 2 - 3 AÑOS"               "HEMBRAS > 3 AÑOS"               
## [11] "MACHOS > 3 AÑOS"                 "TOTAL BOVINOS - 2019"           
## [13] "No DE FINCAS 1 A 50"             "No DE FINCAS 51 A 100"          
## [15] "No DE FINCAS 101 A 500"          "No DE FINCAS 501 O MAS"         
## [17] "TOTAL FINCAS CON BOVINOS - 2019"
library(janitor)
censo2 <- clean_names(dat = censo1)
censo2

Paso 3

# todas las columnas con todas las filas excepto la 1123 (última)
censo3 <- censo2[-nrow(censo2), ] 
censo3

Paso 4

  • Nota: se puede acceder a las columnas con la posición o con el nombre de la variable. Es posible manifestar cuáles seleccionar o cuáles no seleccionar.
# Filtrando variables de interés: son equivalentes
variables1 <- names(censo3)[c(1, 2, 4:11)] # todas
variables2 <- names(censo3)[-c(3, 17:12)] # todas menos

# Seleccionando columnas que coinciden con nombres de "variables1"
censo4 <- censo3[, variables1]
censo4

Paso 5

  • Utilizamos los siguientes argumentos de la función pivot_longer():
    • data: base de datos implicada en el proceso de transformación. En este caso es “censo4”
    • cols: columnas o variables implicadas en la transformación. En nuestro caso son todas aquellas que poseen información del número de animales. Como son más variables (8) sobre las cuales se va a ejecutar el proceso, es más sencillo informar de cuáles no se van a tener en la transformación, es decir, el departamneto y municipio.
    • names_to: (carácter) nuevo nombre para la variable que contiene los encabezados.
    • values_to: (carácter) nuevo nombre para los valores que están en las celdas de las variables implicadas en la transformación.
library(tidyr)
censo5 <- pivot_longer(data = censo4,
                       cols = -c(departamento, municipio), #todas menos depto y mpio
                       names_to = "tipo",
                       values_to = "animales")
censo5

Paso 6

  • Los argumentos a utilizar con la función separate() son los siguientes:
    • data: base de datos sobre la cuál se va a operar.
    • col: columna implicada en la separación o fraccionamiento. En nuestro es la variable “tipo”.
    • into: (vector de carácteres) nombre de nuevas variables que resultan luego de ejecutar la separación de columna.
    • sep: (carácter) tipo de separador. En este caso es el guión al piso "_".
    • remove: (lógico) permite controlar la remoción de la columna implicada en el fraccionamiento. Por defecto está igualado a “TRUE”, no obstante, se puede cambiar.
censo6 <- separate(data = censo5,
                   col = tipo,
                   into = c("sexo", "edad1", "edad2", "edad3"),
                   sep = "_",
                   remove = TRUE)
censo6

Paso 7

  • Los argumentos a utilizar con la función unite() son los siguientes:
    • data: base de datos
    • col: (carácter) nombre para la nueva variable que resulta luego de la unión
    • : variables implacadas en la unión. En este caso “edad1” y “edad2”
    • sep: (carácter) separador para las variables unidas. En este caso utilizamos el guión “-”
    • remove: (lógico) permite controlar la remoción de las variables implicadas en la unión.
censo7 <- unite(data = censo6, 
                col = "edad",
                edad1, edad2, # ...
                sep = "-",
                remove = TRUE)
censo7

Paso 8

censo8 <- censo7[, -5]
censo8

Gráfico Ejemplo

library(tidyverse)
censo8 %>% 
  filter(departamento %in% c("ANTIOQUIA", "VALLE DEL CAUCA")) %>% 
  ggplot(aes(x = departamento, y = animales, color = sexo, fill = sexo)) +
  geom_boxplot(alpha = 0.5)

Concatenando procesos

  • La concatenación o encadenamiento de procesos es posible a través del operador de tubería “%>%”. Este operador se puede obtener al presionar las teclas Ctrl + Shift + M.
  • Para filtrar la fila 1123 utilizamos la función slice() del paquete dplyr. Esta función permite filtrar datos por posición.
  • Para seleccionar las columnas de interés es posible utilizar la función select() del paquete dplyr. Esta función recibe tanto nombres como posiciones.
  • Paso extra: editar el departamento, el municipio y el tipo para que la primera letra aparezca en mayúscula y las demás en minúscula.
    • La función tolower() permite pasar de mayúsculas a minúsculas. El proceso inverso es posible con la función toupper(). La función capitalize() del paquete Hmisc permitirá tener la primera letra en mayúscula y las demás en minúscula.
    • La edición de variables ya existentes es posible a través de la función mutate() del paquete dplyr. Esta función también permite crear nuevas variables.
library(tidyverse)
library(readxl)
library(janitor)
library(Hmisc)

data_censo <-
  read_excel(path = "BOVINOS-CENSO-2020.xlsx", skip = 4) %>%
  clean_names() %>%
  slice(-1123) %>%
  select(departamento, municipio, terneras_1_ano:machos_3_anos) %>%
  pivot_longer(
    cols = -c(departamento, municipio),
    names_to = "tipo",
    values_to = "animales"
  ) %>%
  separate(
    col = tipo,
    into = c("sexo", "edad1", "edad2", "edad3"),
    sep = "_",
    remove = TRUE
  ) %>%
  unite(col = "edad",
        edad1,
        edad2,
        sep = "-",
        remove = TRUE) %>% 
  select(-edad3) %>% 
  mutate(departamento = capitalize(tolower(departamento)),
         municipio = capitalize(tolower(municipio)),
         sexo = capitalize(sexo))
  

data_censo

Pregunta de clase

  • ¿Cómo cambiar o editar los nombres de las variables o columnas de una base de datos?

Con names()

  • Esta función no se puede integrar con el operador de tubería.
  • Con esta función es necesario proporcionar un vector de nombres con el mismo número de variables.
nueva1 <- data_censo
names(nueva1) <- c("Departamento", "Municipio", "Sexo", "Edad", "Animales")
nueva1

Con set_names()

  • Esta función se puede integrar con el operador de tubería.
  • Con esta función es necesario proporcionar un vector de nombres con el mismo número de variables.
nueva2 <- data_censo %>% 
  set_names(c("Depto", "Mpio", "Sex", "Grupo Edad", "Total"))
nueva2

Con rename()

  • Esta función se puede integrar con el operador de tubería.
  • Con esta función es posible editar uno o más nombres, es decir, que no es necesario suministrar todos los nuevos nombres de las variables.
  • Esta función hace parte de la biblioteca dplyr.
  • Para cambiar el nombre de una variable, después del igual (=) estará el nombre a editar y a la izquierda del igual estará el nuevo nombre.
nueva3 <- data_censo %>% 
  rename(Total = animales, Depto = departamento)
nueva3

Exportando datos

write_csv(x = data_censo, file = "censo_ordenado.csv")

Anexos

library(tidyverse)
datos_angelica <- read_csv(file = "datos_estudiantes/Sacrificio_y_precios_al_productor_de_ganado_bovino_2018 - Angélica.csv")

datos_daniela <- read_csv(file = "datos_estudiantes/Caracterizaci_n_de_Proyectos_Integrales_de_Desarrollo_Agropecuario_y_Rural__PIDAR_ - Daniela.csv")

datos_katherine <- read_csv(file = "datos_estudiantes/Evaluaciones_Agropecuarias_Municipales_EVA - Katherine.csv")