Datos ordenados
- 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.
- Cambiar los nombres a través de la biblioteca janitor utilizando la función clean_names().
- 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.
- Seleccionar las columnas de interés.
- 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.
- 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.
- 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