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().

Population_FEntity %>% mutate(Var_fake = sample(1:50, size = 448, replace = TRUE))
# 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.
Population_FEntity %>% mutate(Porcentaje = Porcentaje/100)
# 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
Student_grades %>% mutate(Sobresaliente = if_else(Calificaciones>=9, T, F))
# 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
Student_grades %>% mutate(index = row_number())
# 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