Censo Pecuario Bovinos 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"
  • Coercionando la variable “meses” de tipo character a tipo factor con la función as.factor():

    • Al tener dos veces “Enero” y convertirlo a factor, R entiende que es un solo grupo, así en el vector aparezca varias veces. Si lo dejamos como un character se tomaría como dos niveles diferentes. Los factores nos permiten controlar los nombre de los niveles y su orden.
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.
    • El argumento levels indica el orden de los niveles.
    • El argumento labels permite editar el nombre de los niveles.
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():

    • Realiza un conteo de cada uno de los niveles.
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():

    • Calcula el porcentaje para cada uno de los niveles.
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 cinco departamentos con mayor número de animales?

  • El parámetro X es la variable numérica a procesar, en este caso el número de 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)
consulta1
##                 Amazonas                Antioquia                   Arauca 
##                      979                  3179947                  1187948 
##                Atlantico              Bogota d.c.                  Bolivar 
##                   248334                    35441                  1334353 
##                   Boyaca                   Caldas                  Caqueta 
##                  1234811                   444875                  2225152 
##                 Casanare                    Cauca                    Cesar 
##                  2141435                   343483                  1437588 
##                    Choco                  Cordoba             Cundinamarca 
##                   174056                  2133853                  1483917 
##                  Guainia                 Guaviare                    Huila 
##                     5461                   481695                   451652 
##               La guajira                Magdalena                     Meta 
##                   295128                  1454955                  2164484 
##                   Nariño       Norte de santander                 Putumayo 
##                   416849                   488353                   295354 
##                  Quindio                Risaralda San andres y providencia 
##                    83934                   106260                      624 
##                Santander                    Sucre                   Tolima 
##                  1652420                  1120865                   790423 
##          Valle del cauca                   Vaupes                  Vichada 
##                   568533                     1304                   260796
sort(consulta1, decreasing = TRUE)[1:5]
## Antioquia   Caqueta      Meta  Casanare   Cordoba 
##   3179947   2225152   2164484   2141435   2133853
  • Ejemplo con la base de datos de R 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 solo 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 necesario 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 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 de 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))