Censo Pecuario Bovino 2020

library(tidyverse)
censo <- read_csv(file = "censo_ordenado.csv")
censo

Factores y funciones apply

Factores

  • Creando un vector de texto:
meses <- c("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Enero")
meses
## [1] "Enero"   "Febrero" "Marzo"   "Abril"   "Mayo"    "Junio"   "Enero"
  • Coercionado la variable “meses” de tipo character a tipo factor con la función as.factor():
meses_factor1 <- as.factor(meses)
meses_factor1
## [1] Enero   Febrero Marzo   Abril   Mayo    Junio   Enero  
## Levels: Abril Enero Febrero Junio Marzo Mayo
  • Coercionando la variable “meses” de tipo character a tipo factor con la función factor()
  • La función factor() permite controlar el orden de los niveles (levels) y los nombres de los niveles (labels).
meses_factor2 <- factor(meses,
                        levels = c("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio"),
                        labels = c("enero", "febrero", "marzo", "abril", "mayo", "junio"))
meses_factor2
## [1] enero   febrero marzo   abril   mayo    junio   enero  
## Levels: enero febrero marzo abril mayo junio
  • Frecuencia absoluta con la función table():
table(meses_factor2)
## meses_factor2
##   enero febrero   marzo   abril    mayo   junio 
##       2       1       1       1       1       1
  • Frecuencia relativa con la función prop.table():
prop.table(table(meses_factor2))
## meses_factor2
##     enero   febrero     marzo     abril      mayo     junio 
## 0.2857143 0.1428571 0.1428571 0.1428571 0.1428571 0.1428571

Funciones apply

  • Son funciones vectorizadas. Están disponibles para operar por grupos, filas o columnas.

  • ¿Cuáles son los 5 departamentos con mayor número de animales?

  • X: variable numérica a procesar. En este caso los animales.

  • INDEX: grupo (factor) sobre el cual se desea operar. En este caso el grupo es el departamento.

  • FUN: función o “tarea” a ejecutar. En este caso queremos sumar (sum()) los animales

consulta1 <- tapply(X = censo$animales, INDEX = censo$departamento, FUN = sum)


sort(consulta1, decreasing = TRUE)[1:5]
## Antioquia   Caqueta      Meta  Casanare   Cordoba 
##   3179947   2225152   2164484   2141435   2133853
  • Ejemplo con iris: uso de las funciones apply(), lapply() y sapply()
  • X: base de datos o matriz a procesar. En este caso el ejemplo lo haremos con iris. Como la última columna (“Species”) es un factor es necesario removerla al momento de aplicar la función apply().
  • MARGIN: toma sólo dos valores, “1” para operar por filas y “2” para operar por columnas.
  • FUN: función o “tarea” a ejecutar. En este caso obtendremos la media de cada variable.
apply(X = iris[, -5], MARGIN = 2, FUN = mean)
## Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
##     5.843333     3.057333     3.758000     1.199333
  • El mismo resultado se puede obtener con la función lapply():
lapply(X = iris[, -5], FUN = mean)
## $Sepal.Length
## [1] 5.843333
## 
## $Sepal.Width
## [1] 3.057333
## 
## $Petal.Length
## [1] 3.758
## 
## $Petal.Width
## [1] 1.199333
  • El mismo resultado se puede obtener con la función sapply():
sapply(X = iris[, -5], FUN = mean)
## Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
##     5.843333     3.057333     3.758000     1.199333

Funciones dplyr

filter()

  • Permite filtrar filas basado en una o más condiciones.
  • Filtrar filas sólo de los departamentos Antioquia y Cundinamarca
df1 <- censo %>% 
  filter(departamento %in% c("Antioquia", "Cundinamarca"))
df1

arrange()

  • Permite ordenar las filas de forma ascendente o descendente.
  • Por defecto las ordena de forma ascendente.
df1 %>% 
  arrange(animales)
  • Para ordenar las filas de forma descendente se utiliza la función desc().
df1 %>% 
  arrange(desc(animales))

slice()

  • Permite filtrar por posición
censo %>% 
  slice(1:10)

distinct()

  • Permite filtrar elementos únicos o distintos.
  • Por defecto sólo mantiene la variable que se está procesando, en este caso el departamento.
censo %>% 
  distinct(departamento)
  • Para mantener las otras columnas es posible editar el argumento .keep_all:
censo %>% 
  distinct(departamento, .keep_all = TRUE)

Nombres de variables

  • La función names() permite cambiar los nombres de las variables, no obstante, es necesario cambiarlas TODAS. Además, names() no es compatible con el tidyverse.

names()

names(censo) <- c("Depto", "municipio", "tipo", "edad", "Total")
censo

set_names()

  • Hace parte del paquete purrr
  • Es compatible con el operador de tubería
  • También es neceario suministrar TODOS los nombres de las variables
mi_data <- censo %>% 
  set_names(c("departamento", "mpio", "tipo", "edad", "animales"))
mi_data

rename()

  • Permite editar el nombre de una o más variables
  • A la izquierda del igual (=) estará el nuevo nombre y a la derecha el nombre que se desea editar
censo %>% 
  rename(Animales = Total, departamento = Depto)

select()

  • Permite seleccionar columnas por nombre o posición
censo %>% 
  select(Depto, Total)
  • También es posible declarar cuáles no se desean seleccionar:
censo %>% 
  select(-municipio)

select_if()

  • Permite seleccionar basado en una condición
censo %>% 
  select_if(is.character)

group_by() + summarise()

  • ¿Cuáles son los 5 departamentos con mayor número de animales?
  • Este proceso es idéntico al obtenido con la función tapply(), con la gran diferencia de que en este caso obtendremos una base de datos (data.frame)
  • En este ejemplo la agrupación se realiza por departamento
censo %>% 
  group_by(Depto) %>% 
  summarise(animales = sum(Total))
  • Ordenando el resultado con arrange() y seleccionando sólo las primeras 5 filas con slice():
censo %>% 
  group_by(Depto) %>% 
  summarise(animales = sum(Total)) %>% 
  arrange(desc(animales)) %>% 
  slice(1:5)

Datos Censo

library(tidyverse)
censo <- read_csv(file = "censo_ordenado.csv")
censo

group_by() + summarise()

  • ¿Cuáles son los 10 municipios con mayor número animales incluyendo la variable tipo?
prueba <- censo %>% 
  group_by(municipio, tipo) %>% 
  summarise(total = sum(animales)) %>% 
  arrange(desc(total)) 
prueba
  • Cuando utilizamos el group_by() internamente los grupos quedan armados en R, por tal motivo al pasar la función slice() no obtenemos el resultado adecuado.
class(prueba)
## [1] "grouped_df" "tbl_df"     "tbl"        "data.frame"
class(censo)
## [1] "spec_tbl_df" "tbl_df"      "tbl"         "data.frame"
  • Para eliminar la estructura de agrupación interna podemos utilizar la función ungroup():
prueba2 <- prueba %>% 
  ungroup()
class(prueba2)
## [1] "tbl_df"     "tbl"        "data.frame"
  • Después de eliminar la agrupación interna es posible realizar procesos adicionales, en este caso filtrar con slice() las 10 primeras filas
prueba2 %>% 
  slice(1:10)
  • Todo el proceso se puede concatenar en una sola sentencia:
censo %>% 
  group_by(municipio, tipo) %>% 
  summarise(total = sum(animales)) %>% 
  ungroup() %>% 
  arrange(desc(total)) %>% 
  slice(1:10)

group_by() + summarise()

  • summarise() reduce la base de datos al número de niveles que tenga la variable (factor) por la cual se realiza la agrupación. En este caso la nueva base de datos tiene 33 filas porque son 33 departamentos.
censo %>% 
  group_by(departamento) %>% 
  summarise(total = sum(animales))

group_by() + mutate()

  • mutate() conserva la estructura de la base de datos inicial, incluyendo el número de filas y las variables o columnas. El resultado se repetirá en cada nivel de la variable por la cual se realizó la agrupación, en este caso el departamento.
censo %>% 
  group_by(departamento) %>% 
  mutate(total = sum(animales))