Pasos a seguir
- 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”.
- Editar los nombres a través de la función clean_names() de la biblioteca janitor.
- Eliminar la última fila porque contiene totales. Los totales son un resultado y no un individuo.
- Eliminar las columnas que no son de interés.
- 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.
- 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 "_".
- Unir las columnas “edad1” y “edad2” en una sola variable de nombre “edad”.
- 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")