Datos ordenados

    1. Importar los datos. En este caso son de excel y se usa la función read_excel(). El argumento skip permite omitir filas al momento de importar las bases de datos.
    1. Cambiar los nombres a través de la biblioteca janitor utilizando la función clean_names().
    1. Eliminar la última fila de la base de datos porque contiene totales de cada columna. Esta fila no es un individuo bajo análisis, en realidad es un resultado.
    1. Seleccionar las columnas de interés.
    1. Conversión de formato ancho a formato largo. A través de la función pivot_longer() es posible realizar la conversión. Disminuyen las columnas y se aumentan las filas (total = 8 x 1122 = 8976). La nueva base de datos,además del formato largo, permitirá tener datos ordenados.
    1. Fraccionamiento de columna de nombre “variable” en cuatro nuevas columnas. La primera contiene información de el tipo de animal, la segunda y tercera hacen referencia a la edad del animal, y la cuarta describe la unidad de tiempo.
    1. Coercionar la nueva variable “edad2” a tipo numérico. Buscamos con esto que en donde esté la palabra “ano” le asigne NA. En el siguiente paso podremos unir “edad1” y “edad2” en una sola columna que represente la edad. Además no se tiene en cuenta la variable unidad.

Paso 1

# Paso 1: lectura de datos
library(readxl)
library(tidyverse)

censo <- read_excel(path = "Datos/BOVINOS-CENSO-2020.xlsx", skip = 4)
censo
names(censo)
##  [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"

Paso 2

# Paso 2: editando nombres (limpiando)
library(janitor)
censo2 <- clean_names(censo)
names(censo2)
##  [1] "departamento"                  "municipio"                    
##  [3] "codigo_municipio"              "terneras_1_ano"               
##  [5] "terneros_1_ano"                "hembras_1_2_anos"             
##  [7] "machos_1_2_anos"               "hembras_2_3_anos"             
##  [9] "machos_2_3_anos"               "hembras_3_anos"               
## [11] "machos_3_anos"                 "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"

Paso 3

# Paso 3: eliminando la última fila
censo3 <- censo2[-nrow(censo2), ]
censo3

Paso 4

# Paso 4: seleccionando variables
variables <- names(censo3)[c(1, 2, 4:11)]
variables
##  [1] "departamento"     "municipio"        "terneras_1_ano"   "terneros_1_ano"  
##  [5] "hembras_1_2_anos" "machos_1_2_anos"  "hembras_2_3_anos" "machos_2_3_anos" 
##  [9] "hembras_3_anos"   "machos_3_anos"
censo4 <- censo3[, variables]
censo4

Paso 5

  • Argumentos a utilizar de la función pivot_longer():
    • data: base de datos sobre la cual se quiere operar.
    • cols: son las columnas a tener en cuenta para la conversión de formato ancho a largo.
    • names_to: nombre (caracter) de la nueva variable que contiene los nombres o encabezados de las columnas sobre las cuales se aplica la conversión de formato.
    • values_to: (caracter) nueva variable que contiene los valores de las celdas sobre las cuales se aplica la conversión de formato.
# Paso 5: formato ancho a largo con la función pivot_longer()
censo5 <- pivot_longer(data = censo4, cols = !c(departamento, municipio), 
                       names_to = "variable", values_to = "animales")
dim(censo5)
## [1] 8976    4
censo5

Paso 6

  • Los argumentos a utilizar de la función separate():
    • data: base de datos.
    • col: variable de interés para fraccionamiento.
    • into: (caracter) nombre de nuevas variables que resultan luego de fraccionar la columna del argumento “col”.
    • sep: (caracter) separador. En este caso es el guión bajo (_).
    • remove: (lógico) permite controlar si se remueve o no la variable implicada en el fraccionamiento.
censo6 <- separate(data = censo5, col = variable, into = c("tipo", "edad1", "edad2", "unidad"), sep = "_", remove = TRUE)
censo6

Paso 7

  • Argumentos a utilizar con la función unite():
    • data: base de datos
    • col: (caracter) nombre de nueva variable que se obtiene al unir las columnas
    • sep: (caracter) separador para la nueva variable.
    • remove: (lógico) permite remover las columnas implicadas en la unión.
# Paso 7: conversión a numérico
censo6$edad2 <- as.numeric(censo6$edad2)
censo6
# Nueva base de datos
censo7 <- unite(data = censo6, col = "edad", edad1, edad2, sep = "-", remove = TRUE)
censo7
# Eliminando la columna "unidad"
censo8 <- censo7[, -5]
censo8

Concatenando procesos

  • La concatenación de diferentes tareas o procesos las vamos a ejecutar a través del operador de tubería “%>%”.
  • La función slice() permite filtrar por posición. La función slice() pertenece a la biblioteca dplyr.
  • La función select() permite seleccionar columnas por nombre o posición. La función select() pertenece a la biblioteca dplyr.
  • La función mutate() permite crear o editar variables. La función mutate() pertenece a la biblioteca dplyr.
  • Paso extra: pasar las variables “departamento” y “municipio” a minúscula y luego la primera letra llevarla a mayúscula. Para convertir un texto (character) de mayúsculas a minúsculas R tiene la función tolower() y el proceso inverso se obtiene con la función toupper(). La biblioteca Hmisc con la función capitalize() permite tener la primera letra en mayúscula.
library(tidyverse)
library(readxl)
library(janitor)
library(Hmisc)

data_censo <-
  read_excel(path = "Datos/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 = "variable",
    values_to = "animales"
  ) %>%
  separate(
    col = variable,
    into = c("tipo", "edad1", "edad2", "unidad"),
    sep = "_",
    remove = TRUE
  ) %>%
  mutate(
    edad2 = as.numeric(edad2),
    departamento = capitalize(tolower(departamento)),
    municipio = capitalize(tolower(municipio)),
    tipo = capitalize(tolower(tipo))
  ) %>%
  unite(col = "edad",
        edad1,
        edad2,
        sep = "-",
        remove = TRUE) %>% 
  select(-unidad)

data_censo

Exportando datos ordenados

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

Anexo

# Bibliotecas: readr y tidyr que se encuentran en tidyverse
library(tidyverse)

datos <- read_csv(file = "Datos/Estado_de_cultivos_Semestrales_2016-2018.csv")
datos
# Estructura de datos
str(datos)
## tibble [599 x 8] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ AÑO                 : num [1:599] 2016 2016 2016 2016 2016 ...
##  $ CULTIVO             : chr [1:599] "AJONJOLÍ" "AJONJOLÍ" "AJONJOLÍ" "AJONJOLÍ" ...
##  $ PERIODO             : chr [1:599] "SEMESTRE B" "SEMESTRE B" "SEMESTRE B" "SEMESTRE B" ...
##  $ MUNICIPIOS          : chr [1:599] "BUENAVISTA" "CHALAN" "COLOSO" "COVEÑAS" ...
##  $ AREA SEMBRADA (Has) : num [1:599] 55 275 5 6 12 69 98 300 200 75 ...
##  $ AREA COSECHADA (Has): num [1:599] 55 25 5 6 9 69 82 280 200 675 ...
##  $ RENDIMIENTO (Ton/Ha): num [1:599] 8 3 7 6 2 6 6 8 6 9 ...
##  $ PRODUCCIÓN (Ton)    : num [1:599] 44 75 35 36 18 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   AÑO = col_double(),
##   ..   CULTIVO = col_character(),
##   ..   PERIODO = col_character(),
##   ..   MUNICIPIOS = col_character(),
##   ..   `AREA SEMBRADA (Has)` = col_double(),
##   ..   `AREA COSECHADA (Has)` = col_double(),
##   ..   `RENDIMIENTO (Ton/Ha)` = col_double(),
##   ..   `PRODUCCIÓN (Ton)` = col_double()
##   .. )
# Dimensión
dim(datos)
## [1] 599   8