6.5 Filtrado

Conocer cómo filtrar correctamente una base de datos es fundamental en el manejo de bases de datos. Implica escoger del total de filas solo aquellas que cumplan con ciertos criterios lógicos.

6.5.1 Procedimiento de filtrado

Primer paso: saber qué se va a filtrar. Por ejemplo: en la base de datos DF se desea filtrar solo aquellas filas que en la columna A tengan valores mayores iguales a 5.32.

Segundo paso: formalizar la petición en sintaxis de R, utilizando operadores lógicos y/o relacionales. Para escribir en R “todos los valores de un vector A mayor igual a 5.32”, colocamos:

A >= 5.32

Tercer paso: incluir esta petición lógica en la función de filtrado de dplyr:

DF %>% filter(A >= 5.32)

6.5.2 Aplicaciones de filtrado

Considera la base de datos WHO_tidy.xlsx:

WHO <- openxlsx::read.xlsx("WHO_tidy.xlsx")

Ejemplo 6.3 Filtrar únicamente las filas de la categoría Category B columna Category. ¿Cuál es el porcentaje de filas que tiene esta nueva base de datos respecto a la original?

# Número de filas de WHO
nrow(WHO)
# [1] 2938

# Filtrado
WHO1 <- WHO %>% filter(Category == "Category B")

# Número de filas de WHO1
nrow(WHO1)
# [1] 963

# Porcentaje de filas en WHO1 respecto a WHO
(nrow(WHO1) / nrow(WHO)) * 100
# [1] 32.78

Para incorporar más de una condición relacional, utiliza los operadores lógicos “y” & u “o” |.

Ejemplo 6.4 Filtrar únicamente las filas con cumplan con tener Category B en la columna Category y Level 1 en la columna Level. Calcular el número de filas de la tabla:

WHO %>% 
  filter(Category == "Category B" & Level == "Level 1") %>% 
  nrow()
# [1] 309

Cuando se necesita filtrar más de un nivel para una columna, se utiliza el operador %in% (ver sección 2.3 Operadores lógicos y relacionales). Cuando se deba filtrar todos los niveles excepto uno, es más sencillo el proceso utilizando el operador !=.

Ejemplo 6.5 Filtrar las categorías Category A y Category B en la columna Category, además de y Level 1 en la columna Level. Calcular el número de filas de la tabla:

WHO %>% 
  filter(Category %in% c("Category A", "Category B") & Level == "Level 1") %>% 
  nrow()
# [1] 645

Como era de esperar, ahora hay más filas en la tabla filtrada.

Ejemplo 6.6 Considera adicionar una tercer condición lógica al ejemplo anterior. Esta vez, se requiere filtrar aquellas filas que con valores de expectativa de vida (columna Life_exp) mayor a 60:

WHO %>% 
  filter(Category %in% c("Category A", "Category B") & Level == "Level 1" & Life_exp > 80) %>% 
  nrow()
# [1] 49

Ejemplo 6.7 Aprovechemos a adicionar una cuarta condición de filtrado: años (columna Year) 2013 a 2015.

WHO %>% 
  filter(Category %in% c("Category A", "Category B")) %>%  
  filter(Level == "Level 1" & Life_exp > 80) %>% 
  filter(Year %in% 2013:2015) %>% 
  nrow()
# [1] 18