6.1 dplyr::filter()

Las funciones en dplyr son vectorizadas, por lo que podemos estar seguros que se esta trabajando de manera adecuada. Es común pensar en una función vectorizada como un remplazo eficiente de un ciclo con una operación dada; para este caso, filtrar un conjunto de datos puede ser tedioso mediante ciclos anidados y es lo que se puede remplazar con la función dplyr::filter().

En la base de datos donde se reúne la información correspondiente a la población de México por rangos de edad quinquenales, es evidente que se puede obtener la población total de todo el territorio con la suma de las cantidades dadas por cada estado, así que este registro será eliminado.

(Population_FEntity <- Population_FEntity %>% filter(`Entidad Federativa`!="República Mexicana"))
# A tibble: 448 x 4
   `Entidad Federativa` `Población Total` Rango_edad Porcentaje
   <chr>                            <dbl> <chr>           <dbl>
 1 Aguascalientes                 1066233 0 a 4           10.3 
 2 Baja California                2856361 0 a 4            9.41
 3 Baja California Sur             512030 0 a 4            9.00
 4 Campeche                        755703 0 a 4            8.34
 5 Coahuila                       2501413 0 a 4            9.78
 6 Colima                          568642 0 a 4            8.09
 7 Chiapas                        4293414 0 a 4           11.4 
 8 Chihuahua                      3241513 0 a 4            7.83
 9 Distrito Federal               8737172 0 a 4            7.82
10 Durango                        1509025 0 a 4            9.97
# … with 438 more rows

Véase que dplyr::filter() utilizó la variable Entidad Federativa y elimino los registros que no cumplieran con la condición dada: !="República Mexicana", al igual que se hubiera hecho con un condicional if() en ciclos anidados. En esta función se pueden aplicar los operados lógicos conocidos ==, <=, %in%, etc. Además de los operados de conjuntos como |, & y xor(). En el siguiente ejemplo solo se toman aquellos estados donde el rango de edad sea 25 a 29 años y tengan un porcentaje de su población total en dicha edad entre 7.5 y 8.5.

Population_FEntity %>% filter(Rango_edad == "25 a 29" & Porcentaje >= 7.5 & Porcentaje < 8.5)
# A tibble: 9 x 4
  `Entidad Federativa` `Población Total` Rango_edad Porcentaje
  <chr>                            <dbl> <chr>           <dbl>
1 Baja California                2856361 25 a 29          7.82
2 Campeche                        755703 25 a 29          7.74
3 Distrito Federal               8737172 25 a 29          7.89
4 Jalisco                        6754506 25 a 29          7.80
5 México                        14174039 25 a 29          8.42
6 Nuevo León                     4199361 25 a 29          7.74
7 Quintana Roo                   1135436 25 a 29          8.45
8 Tabasco                        1991059 25 a 29          7.65
9 Yucatán                        1820537 25 a 29          7.98

Como el resultado es un tibble, bien podría utilizarse las veces que se desee la función utilizando %>% a los resultados previos. En este caso no se tienen valores perdidos pero es bueno recordar que la función is.na() regresa un vector booleano indicando si en el input dado se tienen valores perdidos, por lo que podría usarse con la función filter() para detectar dichos valores de una manera rápida.

Además de obtener un subconjunto de los datos con filter(), dplyr ofrece otras funciones útiles para obtener un subconjunto específico de datos.

  • Obtener valores distintos en toda la base o por algunas variables específicas:
Population_FEntity %>% distinct(`Entidad Federativa`)
# A tibble: 32 x 1
   `Entidad Federativa`
   <chr>               
 1 Aguascalientes      
 2 Baja California     
 3 Baja California Sur 
 4 Campeche            
 5 Coahuila            
 6 Colima              
 7 Chiapas             
 8 Chihuahua           
 9 Distrito Federal    
10 Durango             
# … with 22 more rows
set.seed(20)
data_easy <- tibble(x = sample(letters, 50, replace = TRUE), y = sample(1:25, 50, replace = TRUE))
data_easy %>% distinct(y)
# A tibble: 23 x 1
       y
   <int>
 1     1
 2    15
 3     6
 4     2
 5    10
 6    20
 7    23
 8    22
 9     7
10     3
# … with 13 more rows
  • Obtener un porcentaje de los datos o un número de observaciones de manera aleatoria:
Population_FEntity %>% sample_frac(0.01, replace = FALSE)
# A tibble: 4 x 4
  `Entidad Federativa` `Población Total` Rango_edad Porcentaje
  <chr>                            <dbl> <chr>           <dbl>
1 Guanajuato                     4894608 50 a 54          4.03
2 Chiapas                        4293414 20 a 24          9.16
3 Nayarit                         952230 15 a 19         10.7 
4 Chiapas                        4293414 30 a 34          6.28
Population_FEntity %>% sample_n(4, replace = FALSE)
# A tibble: 4 x 4
  `Entidad Federativa` `Población Total` Rango_edad Porcentaje
  <chr>                            <dbl> <chr>           <dbl>
1 Puebla                         5386250 25 a 29          7.05
2 Nayarit                         952230 0 a 4            9.86
3 Durango                        1509025 25 a 29          6.55
4 Coahuila                       2501413 55 a 59          3.31
  • Obtener renglones específicos:
Population_FEntity %>% slice(1:3)
# A tibble: 3 x 4
  `Entidad Federativa` `Población Total` Rango_edad Porcentaje
  <chr>                            <dbl> <chr>           <dbl>
1 Aguascalientes                 1066233 0 a 4           10.3 
2 Baja California                2856361 0 a 4            9.41
3 Baja California Sur             512030 0 a 4            9.00