• Pasos a seguir
    • Paso 1
    • Paso 2
    • Paso 3
    • Paso 4
    • Paso 5
    • Paso 6
    • Paso 7
    • Paso 8
  • Gráfico Ejemplo
  • Concatenando procesos
  • Pregunta de clase
  • Exportando datos
  • Anexos

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
ABCDEFGHIJ0123456789
DEPARTAMENTO
<chr>
MUNICIPIO
<chr>
CODIGO MUNICIPIO
<chr>
TERNERAS < 1 AÑO
<dbl>
ANTIOQUIAMEDELLIN050012124
ANTIOQUIAABEJORRAL050023117
ANTIOQUIAABRIAQUI050041129
ANTIOQUIAALEJANDRIA05021243
ANTIOQUIAAMAGA05030369
ANTIOQUIAAMALFI050313464
ANTIOQUIAANDES05034538
ANTIOQUIAANGELOPOLIS05036163
ANTIOQUIAANGOSTURA050381966
ANTIOQUIAANORI050404063

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
ABCDEFGHIJ0123456789
departamento
<chr>
municipio
<chr>
codigo_municipio
<chr>
terneras_1_ano
<dbl>
ANTIOQUIAMEDELLIN050012124
ANTIOQUIAABEJORRAL050023117
ANTIOQUIAABRIAQUI050041129
ANTIOQUIAALEJANDRIA05021243
ANTIOQUIAAMAGA05030369
ANTIOQUIAAMALFI050313464
ANTIOQUIAANDES05034538
ANTIOQUIAANGELOPOLIS05036163
ANTIOQUIAANGOSTURA050381966
ANTIOQUIAANORI050404063

Paso 3

# todas las columnas con todas las filas excepto la 1123 (última)
censo3 <- censo2[-nrow(censo2), ] 
censo3
ABCDEFGHIJ0123456789
departamento
<chr>
municipio
<chr>
codigo_municipio
<chr>
terneras_1_ano
<dbl>
ANTIOQUIAMEDELLIN050012124
ANTIOQUIAABEJORRAL050023117
ANTIOQUIAABRIAQUI050041129
ANTIOQUIAALEJANDRIA05021243
ANTIOQUIAAMAGA05030369
ANTIOQUIAAMALFI050313464
ANTIOQUIAANDES05034538
ANTIOQUIAANGELOPOLIS05036163
ANTIOQUIAANGOSTURA050381966
ANTIOQUIAANORI050404063

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
ABCDEFGHIJ0123456789
departamento
<chr>
municipio
<chr>
terneras_1_ano
<dbl>
terneros_1_ano
<dbl>
ANTIOQUIAMEDELLIN2124688
ANTIOQUIAABEJORRAL31171998
ANTIOQUIAABRIAQUI1129787
ANTIOQUIAALEJANDRIA243267
ANTIOQUIAAMAGA369340
ANTIOQUIAAMALFI34642854
ANTIOQUIAANDES538326
ANTIOQUIAANGELOPOLIS163171
ANTIOQUIAANGOSTURA1966906
ANTIOQUIAANORI40633622

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
ABCDEFGHIJ0123456789
departamento
<chr>
municipio
<chr>
tipo
<chr>
animales
<dbl>
ANTIOQUIAMEDELLINterneras_1_ano2124
ANTIOQUIAMEDELLINterneros_1_ano688
ANTIOQUIAMEDELLINhembras_1_2_anos2831
ANTIOQUIAMEDELLINmachos_1_2_anos1107
ANTIOQUIAMEDELLINhembras_2_3_anos2326
ANTIOQUIAMEDELLINmachos_2_3_anos519
ANTIOQUIAMEDELLINhembras_3_anos3612
ANTIOQUIAMEDELLINmachos_3_anos110
ANTIOQUIAABEJORRALterneras_1_ano3117
ANTIOQUIAABEJORRALterneros_1_ano1998

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
ABCDEFGHIJ0123456789
departamento
<chr>
municipio
<chr>
sexo
<chr>
edad1
<chr>
edad2
<chr>
edad3
<chr>
animales
<dbl>
ANTIOQUIAMEDELLINterneras1anoNA2124
ANTIOQUIAMEDELLINterneros1anoNA688
ANTIOQUIAMEDELLINhembras12anos2831
ANTIOQUIAMEDELLINmachos12anos1107
ANTIOQUIAMEDELLINhembras23anos2326
ANTIOQUIAMEDELLINmachos23anos519
ANTIOQUIAMEDELLINhembras3anosNA3612
ANTIOQUIAMEDELLINmachos3anosNA110
ANTIOQUIAABEJORRALterneras1anoNA3117
ANTIOQUIAABEJORRALterneros1anoNA1998

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
ABCDEFGHIJ0123456789
departamento
<chr>
municipio
<chr>
sexo
<chr>
edad
<chr>
edad3
<chr>
animales
<dbl>
ANTIOQUIAMEDELLINterneras1-anoNA2124
ANTIOQUIAMEDELLINterneros1-anoNA688
ANTIOQUIAMEDELLINhembras1-2anos2831
ANTIOQUIAMEDELLINmachos1-2anos1107
ANTIOQUIAMEDELLINhembras2-3anos2326
ANTIOQUIAMEDELLINmachos2-3anos519
ANTIOQUIAMEDELLINhembras3-anosNA3612
ANTIOQUIAMEDELLINmachos3-anosNA110
ANTIOQUIAABEJORRALterneras1-anoNA3117
ANTIOQUIAABEJORRALterneros1-anoNA1998

Paso 8

censo8 <- censo7[, -5]
censo8
ABCDEFGHIJ0123456789
departamento
<chr>
municipio
<chr>
sexo
<chr>
edad
<chr>
animales
<dbl>
ANTIOQUIAMEDELLINterneras1-ano2124
ANTIOQUIAMEDELLINterneros1-ano688
ANTIOQUIAMEDELLINhembras1-22831
ANTIOQUIAMEDELLINmachos1-21107
ANTIOQUIAMEDELLINhembras2-32326
ANTIOQUIAMEDELLINmachos2-3519
ANTIOQUIAMEDELLINhembras3-anos3612
ANTIOQUIAMEDELLINmachos3-anos110
ANTIOQUIAABEJORRALterneras1-ano3117
ANTIOQUIAABEJORRALterneros1-ano1998

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
ABCDEFGHIJ0123456789
departamento
<chr>
municipio
<chr>
sexo
<chr>
edad
<chr>
animales
<dbl>
AntioquiaMedellinTerneras1-ano2124
AntioquiaMedellinTerneros1-ano688
AntioquiaMedellinHembras1-22831
AntioquiaMedellinMachos1-21107
AntioquiaMedellinHembras2-32326
AntioquiaMedellinMachos2-3519
AntioquiaMedellinHembras3-anos3612
AntioquiaMedellinMachos3-anos110
AntioquiaAbejorralTerneras1-ano3117
AntioquiaAbejorralTerneros1-ano1998

Pregunta de clase

  • ¿Cómo cambiar o editar los nombres de las variables o columnas de una base de datos?
  • 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
ABCDEFGHIJ0123456789
Departamento
<chr>
Municipio
<chr>
Sexo
<chr>
Edad
<chr>
Animales
<dbl>
AntioquiaMedellinTerneras1-ano2124
AntioquiaMedellinTerneros1-ano688
AntioquiaMedellinHembras1-22831
AntioquiaMedellinMachos1-21107
AntioquiaMedellinHembras2-32326
AntioquiaMedellinMachos2-3519
AntioquiaMedellinHembras3-anos3612
AntioquiaMedellinMachos3-anos110
AntioquiaAbejorralTerneras1-ano3117
AntioquiaAbejorralTerneros1-ano1998
  • 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
ABCDEFGHIJ0123456789
Depto
<chr>
Mpio
<chr>
Sex
<chr>
Grupo Edad
<chr>
Total
<dbl>
AntioquiaMedellinTerneras1-ano2124
AntioquiaMedellinTerneros1-ano688
AntioquiaMedellinHembras1-22831
AntioquiaMedellinMachos1-21107
AntioquiaMedellinHembras2-32326
AntioquiaMedellinMachos2-3519
AntioquiaMedellinHembras3-anos3612
AntioquiaMedellinMachos3-anos110
AntioquiaAbejorralTerneras1-ano3117
AntioquiaAbejorralTerneros1-ano1998
  • 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
ABCDEFGHIJ0123456789
Depto
<chr>
municipio
<chr>
sexo
<chr>
edad
<chr>
Total
<dbl>
AntioquiaMedellinTerneras1-ano2124
AntioquiaMedellinTerneros1-ano688
AntioquiaMedellinHembras1-22831
AntioquiaMedellinMachos1-21107
AntioquiaMedellinHembras2-32326
AntioquiaMedellinMachos2-3519
AntioquiaMedellinHembras3-anos3612
AntioquiaMedellinMachos3-anos110
AntioquiaAbejorralTerneras1-ano3117
AntioquiaAbejorralTerneros1-ano1998

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")