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 %>% filter(`Entidad Federativa`!="República Mexicana")) (Population_FEntity <-
# 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.
%>% filter(Rango_edad == "25 a 29" & Porcentaje >= 7.5 & Porcentaje < 8.5) Population_FEntity
# 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:
%>% distinct(`Entidad Federativa`) Population_FEntity
# 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)
tibble(x = sample(letters, 50, replace = TRUE), y = sample(1:25, 50, replace = TRUE))
data_easy <-%>% distinct(y) data_easy
# 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:
%>% sample_frac(0.01, replace = FALSE) Population_FEntity
# 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
%>% sample_n(4, replace = FALSE) Population_FEntity
# 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:
%>% slice(1:3) Population_FEntity
# 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