6.4 dplyr::mutate()
La función arrange()
modificó de una forma sutil los datos, sólo el orden; pero en el caso de que se desee modificar o agregar una nueva variable, ya sea en función de los valores de otra o nuevos valores independientes, se utiliza la función dplyr::mutate()
.
%>% mutate(Var_fake = sample(1:50, size = 448, replace = TRUE)) Population_FEntity
# A tibble: 448 x 5
`Entidad Federativa` `Población Total` Rango_edad Porcentaje Var_fake
<chr> <dbl> <chr> <dbl> <int>
1 Aguascalientes 1066233 0 a 4 10.3 20
2 Baja California 2856361 0 a 4 9.41 11
3 Baja California Sur 512030 0 a 4 9.00 33
4 Campeche 755703 0 a 4 8.34 38
5 Coahuila 2501413 0 a 4 9.78 28
6 Colima 568642 0 a 4 8.09 3
7 Chiapas 4293414 0 a 4 11.4 16
8 Chihuahua 3241513 0 a 4 7.83 40
9 Distrito Federal 8737172 0 a 4 7.82 3
10 Durango 1509025 0 a 4 9.97 40
# … with 438 more rows
En esta función se pueden aplicar funciones ya pre-establecidas, además de window functions
(véase la Cheat Sheet Data Wrangling) que se pueden obtener de R o de dplyr
como dplyr::lag()
y dplyr::between()
. Véase los siguientes ejemplos:
- Se modifica el porcentaje en términos correctos.
%>% mutate(Porcentaje = Porcentaje/100) 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 0.103
2 Baja California 2856361 0 a 4 0.0941
3 Baja California Sur 512030 0 a 4 0.0900
4 Campeche 755703 0 a 4 0.0834
5 Coahuila 2501413 0 a 4 0.0978
6 Colima 568642 0 a 4 0.0809
7 Chiapas 4293414 0 a 4 0.114
8 Chihuahua 3241513 0 a 4 0.0783
9 Distrito Federal 8737172 0 a 4 0.0782
10 Durango 1509025 0 a 4 0.0997
# … with 438 more rows
- Se obtiene el porcentaje de población que tiene cada entidad federativa correspondiente a toda la población del país. (Recordar que la población total es 103,498,524)
%>%
Population_FEntity mutate(Porcentaje_entidad = `Población Total`/103498524) %>%
select(c(`Entidad Federativa`, `Población Total`, Porcentaje_entidad))
# A tibble: 448 x 3
`Entidad Federativa` `Población Total` Porcentaje_entidad
<chr> <dbl> <dbl>
1 Aguascalientes 1066233 0.0103
2 Baja California 2856361 0.0276
3 Baja California Sur 512030 0.00495
4 Campeche 755703 0.00730
5 Coahuila 2501413 0.0242
6 Colima 568642 0.00549
7 Chiapas 4293414 0.0415
8 Chihuahua 3241513 0.0313
9 Distrito Federal 8737172 0.0844
10 Durango 1509025 0.0146
# … with 438 more rows
- Se obtiene el porcentaje de la población total que hay por grupo quinquenal.
%>%
Population_FEntity mutate(Porcentaje_entidad = `Población Total`/103498524,
Porcentaje = Porcentaje/100) %>%
mutate(Porcentaje_quinquenal_P = percent(Porcentaje*Porcentaje_entidad, accuracy = 0.01)) %>% select(`Entidad Federativa`, Rango_edad, Porcentaje_quinquenal_P)
# A tibble: 448 x 3
`Entidad Federativa` Rango_edad Porcentaje_quinquenal_P
<chr> <chr> <chr>
1 Aguascalientes 0 a 4 0.11%
2 Baja California 0 a 4 0.26%
3 Baja California Sur 0 a 4 0.04%
4 Campeche 0 a 4 0.06%
5 Coahuila 0 a 4 0.24%
6 Colima 0 a 4 0.04%
7 Chiapas 0 a 4 0.47%
8 Chihuahua 0 a 4 0.25%
9 Distrito Federal 0 a 4 0.66%
10 Durango 0 a 4 0.15%
# … with 438 more rows
- Uso de funciones
%>% mutate(Sobresaliente = if_else(Calificaciones>=9, T, F)) Student_grades
# A tibble: 10 x 4
Nombre Asignatura Calificaciones Sobresaliente
<chr> <chr> <chr> <lgl>
1 Juan M 8 FALSE
2 Carlos M 9 TRUE
3 Luis M 7 FALSE
4 Allison M 9 TRUE
5 Leticia M 8 FALSE
6 Juan Q 9 TRUE
7 Carlos Q 7 FALSE
8 Luis Q 8 FALSE
9 Allison Q 9 TRUE
10 Leticia Q 9 TRUE
- Agregar un índice a los datos
%>% mutate(index = row_number()) Student_grades
# A tibble: 10 x 4
Nombre Asignatura Calificaciones index
<chr> <chr> <chr> <int>
1 Juan M 8 1
2 Carlos M 9 2
3 Luis M 7 3
4 Allison M 9 4
5 Leticia M 8 5
6 Juan Q 9 6
7 Carlos Q 7 7
8 Luis Q 8 8
9 Allison Q 9 9
10 Leticia Q 9 10
%>%
Population_FEntity mutate(Porcentaje = Porcentaje/100) %>%
mutate("Población" = Porcentaje * `Población Total`)
# A tibble: 448 x 5
`Entidad Federativa` `Población Total` Rango_edad Porcentaje Población
<chr> <dbl> <chr> <dbl> <dbl>
1 Aguascalientes 1066233 0 a 4 0.103 109853
2 Baja California 2856361 0 a 4 0.0941 268842
3 Baja California Sur 512030 0 a 4 0.0900 46070
4 Campeche 755703 0 a 4 0.0834 63034.
5 Coahuila 2501413 0 a 4 0.0978 244624.
6 Colima 568642 0 a 4 0.0809 45985
7 Chiapas 4293414 0 a 4 0.114 491525
8 Chihuahua 3241513 0 a 4 0.0783 253834.
9 Distrito Federal 8737172 0 a 4 0.0782 682914.
10 Durango 1509025 0 a 4 0.0997 150485
# … with 438 more rows
En este último ejemplo se modifico la base de datos de la población donde puede notarse que la anterior función no elimina las variables con las que se opera, esto podría hacerse con la función select()
, o bien con la función dplyr::transmute()
, aunque elimina también aquellas columnas que no se utilizan.
%>%
Population_FEntity mutate(Porcentaje = Porcentaje/100) %>%
transmute("Población" = Porcentaje * `Población Total`)
# A tibble: 448 x 1
Población
<dbl>
1 109853
2 268842
3 46070
4 63034.
5 244624.
6 45985
7 491525
8 253834.
9 682914.
10 150485
# … with 438 more rows
Así que se hará lo siguiente
Population_FEntity %>%
(Population_FEntity <- mutate(Porcentaje = Porcentaje/100) %>%
mutate("Población" = Porcentaje * `Población Total`) %>% select(-Porcentaje))
# A tibble: 448 x 4
`Entidad Federativa` `Población Total` Rango_edad Población
<chr> <dbl> <chr> <dbl>
1 Aguascalientes 1066233 0 a 4 109853
2 Baja California 2856361 0 a 4 268842
3 Baja California Sur 512030 0 a 4 46070
4 Campeche 755703 0 a 4 63034.
5 Coahuila 2501413 0 a 4 244624.
6 Colima 568642 0 a 4 45985
7 Chiapas 4293414 0 a 4 491525
8 Chihuahua 3241513 0 a 4 253834.
9 Distrito Federal 8737172 0 a 4 682914.
10 Durango 1509025 0 a 4 150485
# … with 438 more rows