Usos del paquete ‘magrittr’
Beatriz Valdez
15/2/2020
Introducción
El paquete magrittr ayuda a hacer fluido el proceso de análisis de datos. Algunas de sus funciones y operadores han sido incorporados en los paquetes que componen el ecosistema tidyverse. Pero otros no. Veamos cómo podemos obtener provecho de las funciones y operadores de este paquete. Alunos de los ejemplos son tomados de la ayuda del propio paquete, otros de algunos videos y, finalmente, otros ejemplos los he elaborado empleando mi propia data.
Generalidades
Emplear la aproximación ‘pipelines’ facilita seguir los procedimientos necesarios para obtener un resultado dado. Por ejemplo, si quiero obtener un subconjunto de datos de marco mtcars, con casos en los que la variable hp sea mayor a 100, agregar esa información de acuerdo con el número de cilindros, aplicar la media, redondear el resultado, cada uno de estos pasos habría que hacerlos por separado, o anidar parte del ellos. En ese caso, se hace difícil rastrear, dependiendo de la cantidad de operaciones, la secuencia. Con magrittr se puede obtener un procedimiento no sólo más sencillo sino, más importante, más legible:
mtcars %>% # valores o la parte lhs
subset(hp > 100)%>% # con los valores, obtengo un subset
aggregate(. ~ cyl, data = ., FUN = . %>% mean %>% round(2)) %>% # el resultado anterior
transform(kpl = mpg %>% multiply_by(0.4251)) # lo promedio con base en los cyl, redondeo el resultado tomando solo dos digito y multiplico por 0.425
## cyl mpg disp hp drat wt qsec vs am gear carb kpl
## 1 4 25.90 108.05 111.00 3.94 2.15 17.75 1.00 1.00 4.50 2.00 11.010090
## 2 6 19.74 183.31 122.29 3.59 3.12 17.98 0.57 0.43 3.86 3.43 8.391474
## 3 8 15.10 353.10 209.21 3.23 4.00 16.77 0.00 0.14 3.29 3.50 6.419010
Las funciones anónimas pueden compactarse y hacerse mucho más fáciles de leer y seguir también.
car_data <-
transform(aggregate(. ~ cyl,
data = subset(mtcars, hp > 100),
FUN = function(x) round(mean(x, 2))),
kpl = mpg*0.4251)
Digamos que quiero obtener la primera y última línea de un marco de datos, si ese marco tiene más de 2 filas, y juntar ambos resultados:
# funcion anonima tradicional
car_data %>%
(function(x) {
if (nrow(x) > 2)
rbind(head(x, 1), tail(x, 1))
else x
})
## cyl mpg disp hp drat wt qsec vs am gear carb kpl
## 1 4 26 108 111 4 2 18 1 1 4 2 11.0526
## 3 8 15 350 192 3 4 17 0 0 3 4 6.3765
## cyl mpg disp hp drat wt qsec vs am gear carb kpl
## 1 4 26 108 111 4 2 18 1 1 4 2 11.0526
## 3 8 15 350 192 3 4 17 0 0 3 4 6.3765
Operadores
Entre los operadores de magritrr tenemos el archiconocido %>%, forward-pipe operator, empleados en el contexto de tidyverse, y otros menos conocidos como son %T>%, Tee operator, %<>%, compound assignment pipe-operator, y %$%, exposition pipe-operator. Empecemos con los que se suelen emplear menos.
operador “Tee”, permite ‘guardar’ resultados u operaciones que se usan en una función dada, la que normalmente no genera resultados adicionales, para emplearlos en otra función, por ejemplo
## NULL
No puedo obtener la descripción de la matriz porque la función plot no ‘guarda’ los datos con los que se ha hecho la gráfica y, por tanto, no puede crearse una nueva función con esos datos. Entonces
## num [1:50, 1:2] -0.82 0.518 0.045 -1.837 1.027 ...
Otro ejemplo:
## [1] 9.517984 19.808562
Entonces, el operador Tee nos permite reutilizar los resultados que hemos incluído en una operación anterior, en este caso, la data de la matriz, y usarlos con la función plot, que normalmente no devuelve resultados adicionales. El operador tee también puede usarse con funciones tales como printing, logging y otras que generalmente no nos permiten ‘recuperar’ los datos empleados en ellas.
El operador de exposición nos permite extraer una variable dada y a partir de ella, no del dataset, hacer los análisis requeridos
# operador 'exposition'
iris %>%
subset(Sepal.Length > mean(Sepal.Length)) %$%
cor(Sepal.Length, Sepal.Width)
## [1] 0.3361992
Este operador es similar a la idea que usamos cuando incluimos la función with. Nos permite emplear en un ambiente ‘pipe’ funciones que normalmente no podrían ser incluída por sus carcterísticas específicas.
El operador de asignación nos permite agregar a la data inicial los resultados del proceso que viene a la derecha de los datos
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5.0 3.6 1.4 0.2 setosa
## 6 5.4 3.9 1.7 0.4 setosa
El operador permite añadir el resultado de la operación que se va a calcular al valor o valores que están a la izquierda. Se usa cada vez que queramos emplear <-
# creo nuevas variables y las agrego al dataset inicial
# data.frame inicial
lineas_titulos %>%
head()
## # A tibble: 6 x 2
## fecha titulos
## <date> <chr>
## 1 2009-01-22 1ra Entrega
## 2 2009-01-25 La Cuarta Fase El Despliegue
## 3 2009-01-28 Ganó el Si
## 4 2009-01-29 Caballeria
## 5 2009-02-01 Febrero Otra vez Febrero
## 6 2009-02-03 Quinta Fase Doble Ataque Blindado
lineas_titulos %<>%
mutate(anio = year(fecha),
mes = month(fecha,label = TRUE),
dia = day(fecha)) %>%
mutate(mes = str_extract(mes, "\\w+"))
# data.frame final
lineas_titulos %>%
head()
## # A tibble: 6 x 5
## fecha titulos anio mes dia
## <date> <chr> <dbl> <chr> <int>
## 1 2009-01-22 1ra Entrega 2009 ene 22
## 2 2009-01-25 La Cuarta Fase El Despliegue 2009 ene 25
## 3 2009-01-28 Ganó el Si 2009 ene 28
## 4 2009-01-29 Caballeria 2009 ene 29
## 5 2009-02-01 Febrero Otra vez Febrero 2009 feb 1
## 6 2009-02-03 Quinta Fase Doble Ataque Blindado 2009 feb 3
Otro ejemplo
## [[1]]
## [1] "20090122" "1ra Entrega"
##
## [[2]]
## [1] "20090125" "La Cuarta Fase El Despliegue"
##
## [[3]]
## [1] "20090128" "Ganó el Si"
##
## [[4]]
## [1] "20090129" "Caballeria"
##
## [[5]]
## [1] "20090201" "Febrero Otra vez Febrero"
##
## [[6]]
## [1] "20090203" "Quinta Fase Doble Ataque Blindado"
## [1] "1ra Entrega"
## [2] "La Cuarta Fase El Despliegue"
## [3] "Ganó el Si"
## [4] "Caballeria"
## [5] "Febrero Otra vez Febrero"
## [6] "Quinta Fase Doble Ataque Blindado"
## [7] "4 de Febrero"
## [8] "La Maisantera La Vida Bonita El Amor Bonito"
## [9] "Construyendo Diginidad"
## [10] "Una cita con el Futuro"
## [11] "Hoy 15 de Febrero Ser o no Ser"
## [12] "27F El Parto Revolucionario"
Extraigo la segunda parte de la lista de títulos
# no puedo acceder a una variable directamente
#mtcars %>% cyl
# pero podria si empleo lo que es equivalente a mtcars$cyl
mtcars %$%cyl
## [1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4 4 8 8 8 8 4 4 4 8 6 8 4
## [1] 1.618641 1.695582 1.523155 1.793042 1.854724 1.860108 1.889444 1.786057
## [9] 1.774824 1.854724 1.854724 2.017424 1.931321 1.944222 2.291288 2.328948
## [17] 2.311926 1.483240 1.270827 1.354622 1.570032 1.876166 1.853375 1.959592
## [25] 1.960867 1.391043 1.462874 1.230041 1.780449 1.664332 1.889444 1.667333
Si quiero crear un gráfico de barras con las categorias de una variable, normalmente procedo de la siguiente forma:
con magrittr el procedimiento seria:
## wt
## Mazda RX4 -0.76240831
## Mazda RX4 Wag -0.82186333
## Datsun 710 -0.62961370
## Hornet 4 Drive -0.84001284
## Hornet Sportabout -0.81677899
## Valiant -0.81326145
## Duster 360 -0.78927570
## Merc 240D -0.84083749
## Merc 230 -0.84145189
## Merc 280 -0.81677899
## Merc 280C -0.81677899
## Merc 450SE -0.56390764
## Merc 450SL -0.73916227
## Merc 450SLC -0.71947484
## Cadillac Fleetwood 0.48999627
## Lincoln Continental 0.60761534
## Chrysler Imperial 0.55740136
## Fiat 128 -0.55511492
## Honda Civic -0.04417490
## Toyota Corolla -0.25818270
## Toyota Corona -0.70307373
## Dodge Challenger -0.80117386
## AMC Javelin -0.81761934
## Camaro Z28 -0.69316234
## Pontiac Firebird -0.69083455
## Fiat X1-9 -0.34872027
## Porsche 914-2 -0.51324494
## Lotus Europa 0.05773204
## Ford Pantera L -0.84125293
## Ferrari Dino -0.80266506
## Maserati Bora -0.78927570
## Volvo 142E -0.80479772
Este procedimiento también habría sido posible con:
Combinando con placeholder:
Aliases
Magrittr contiene una serie de “alias” que facilitan las operaciones matemáticas y otras operaciones.
## [[1]]
## [1] "20090122" "1ra Entrega"
##
## [[2]]
## [1] "20090125" "La Cuarta Fase El Despliegue"
##
## [[3]]
## [1] "20090128" "Ganó el Si"
##
## [[4]]
## [1] "20090129" "Caballeria"
##
## [[5]]
## [1] "20090201" "Febrero Otra vez Febrero"
##
## [[6]]
## [1] "20090203" "Quinta Fase Doble Ataque Blindado"
## [[1]]
## [1] "20090125" "La Cuarta Fase El Despliegue"
## [1] "20090125"
## [[1]]
## [1] "20090125" "La Cuarta Fase El Despliegue"
## [1] "20090125" "La Cuarta Fase El Despliegue"
## # A tibble: 102 x 1
## mes
## <chr>
## 1 ene
## 2 ene
## 3 ene
## 4 ene
## 5 feb
## 6 feb
## 7 feb
## 8 feb
## 9 feb
## 10 feb
## # ... with 92 more rows
## # A tibble: 102 x 1
## mes
## <chr>
## 1 ene
## 2 ene
## 3 ene
## 4 ene
## 5 feb
## 6 feb
## 7 feb
## 8 feb
## 9 feb
## 10 feb
## # ... with 92 more rows
## [1] "ene" "ene" "ene" "ene" "feb" "feb" "feb" "feb" "feb" "feb"
## [11] "feb" "mar" "mar" "mar" "mar" "mar" "abr" "abr" "abr" "may"
## [21] "may" "may" "may" "jun" "jun" "jun" "jun" "jul" "jul" "jul"
## [31] "jul" "ago" "ago" "ago" "ago" "ago" "sept" "sept" "sept" "sept"
## [41] "oct" "oct" "oct" "oct" "nov" "nov" "nov" "nov" "nov" "dic"
## [51] "dic" "dic" "ene" "ene" "ene" "ene" "ene" "feb" "feb" "feb"
## [61] "feb" "mar" "mar" "mar" "abr" "abr" "abr" "abr" "may" "may"
## [71] "may" "may" "may" "jun" "jun" "jun" "jul" "jul" "jul" "jul"
## [81] "jul" "ago" "ago" "ago" "ago" "sept" "sept" "sept" "oct" "oct"
## [91] "oct" "oct" "nov" "nov" "nov" "nov" "dic" "dic" "dic" "dic"
## [101] "ene" "ene"
## [1] 45 51 57 59 3 7 11 17 21 25 31 3 21 31 45 59 11 25 53 7 21 49 63 15 29
## [26] 43 57 11 25 39 53 5 19 33 47 61 13 27 41 55 9 23 39 51 3 17 31 45 59 13
## [51] 27 41 5 21 35 49 63 15 29 43 57 15 29 49 9 23 37 47 5 19 33 47 59 11 39
## [76] 53 7 21 37 51 63 15 29 45 57 11 25 39 5 21 49 63 13 29 43 57 11 25 37 53
## [101] 5 19
Algunas operaciones lógicas:
## # A tibble: 52 x 5
## fecha titulos anio mes dia
## <date> <chr> <dbl> <chr> <int>
## 1 2009-01-22 1ra Entrega 2009 ene 22
## 2 2009-01-25 La Cuarta Fase El Despliegue 2009 ene 25
## 3 2009-01-28 Ganó el Si 2009 ene 28
## 4 2009-01-29 Caballeria 2009 ene 29
## 5 2009-02-01 Febrero Otra vez Febrero 2009 feb 1
## 6 2009-02-03 Quinta Fase Doble Ataque Blindado 2009 feb 3
## 7 2009-02-05 4 de Febrero 2009 feb 5
## 8 2009-02-08 La Maisantera La Vida Bonita El Amor Bonito 2009 feb 8
## 9 2009-02-10 Construyendo Diginidad 2009 feb 10
## 10 2009-02-12 Una cita con el Futuro 2009 feb 12
## # ... with 42 more rows
## # A tibble: 52 x 5
## fecha titulos anio mes dia
## <date> <chr> <dbl> <chr> <int>
## 1 2009-01-22 1ra Entrega 2009 ene 22
## 2 2009-01-25 La Cuarta Fase El Despliegue 2009 ene 25
## 3 2009-01-28 Ganó el Si 2009 ene 28
## 4 2009-01-29 Caballeria 2009 ene 29
## 5 2009-02-01 Febrero Otra vez Febrero 2009 feb 1
## 6 2009-02-03 Quinta Fase Doble Ataque Blindado 2009 feb 3
## 7 2009-02-05 4 de Febrero 2009 feb 5
## 8 2009-02-08 La Maisantera La Vida Bonita El Amor Bonito 2009 feb 8
## 9 2009-02-10 Construyendo Diginidad 2009 feb 10
## 10 2009-02-12 Una cita con el Futuro 2009 feb 12
## # ... with 42 more rows
## # A tibble: 2 x 5
## fecha titulos anio mes dia
## <date> <chr> <dbl> <chr> <int>
## 1 2011-01-02 Feliz Año 2011 2011 ene 2
## 2 2011-01-09 Abajo cadenas 2011 ene 9
## # A tibble: 71 x 5
## fecha titulos anio mes dia
## <date> <chr> <dbl> <chr> <int>
## 1 2009-01-22 1ra Entrega 2009 ene 22
## 2 2009-01-25 La Cuarta Fase El Despliegue 2009 ene 25
## 3 2009-01-28 Ganó el Si 2009 ene 28
## 4 2009-01-29 Caballeria 2009 ene 29
## 5 2009-02-10 Construyendo Diginidad 2009 feb 10
## 6 2009-02-12 Una cita con el Futuro 2009 feb 12
## 7 2009-02-15 Hoy 15 de Febrero Ser o no Ser 2009 feb 15
## 8 2009-03-10 La Mujer, La Mujer, La Mujer....txt 2009 mar 10
## 9 2009-03-15 La Crisis Perfecta 2009 mar 15
## 10 2009-03-22 Venezuela La Contracrisis 2009 mar 22
## # ... with 61 more rows
## # A tibble: 100 x 5
## fecha titulos anio mes dia
## <date> <chr> <dbl> <chr> <int>
## 1 2009-01-22 1ra Entrega 2009 ene 22
## 2 2009-01-25 La Cuarta Fase El Despliegue 2009 ene 25
## 3 2009-01-28 Ganó el Si 2009 ene 28
## 4 2009-01-29 Caballeria 2009 ene 29
## 5 2009-02-01 Febrero Otra vez Febrero 2009 feb 1
## 6 2009-02-03 Quinta Fase Doble Ataque Blindado 2009 feb 3
## 7 2009-02-05 4 de Febrero 2009 feb 5
## 8 2009-02-08 La Maisantera La Vida Bonita El Amor Bonito 2009 feb 8
## 9 2009-02-10 Construyendo Diginidad 2009 feb 10
## 10 2009-02-12 Una cita con el Futuro 2009 feb 12
## # ... with 90 more rows
## # A tibble: 66 x 5
## fecha titulos anio mes dia
## <date> <chr> <dbl> <chr> <int>
## 1 2009-02-01 Febrero Otra vez Febrero 2009 feb 1
## 2 2009-02-03 Quinta Fase Doble Ataque Blindado 2009 feb 3
## 3 2009-02-05 4 de Febrero 2009 feb 5
## 4 2009-02-08 La Maisantera La Vida Bonita El Amor Bonito 2009 feb 8
## 5 2009-02-10 Construyendo Diginidad 2009 feb 10
## 6 2009-02-12 Una cita con el Futuro 2009 feb 12
## 7 2009-02-15 Hoy 15 de Febrero Ser o no Ser 2009 feb 15
## 8 2009-03-01 27F El Parto Revolucionario 2009 mar 1
## 9 2009-03-10 La Mujer, La Mujer, La Mujer....txt 2009 mar 10
## 10 2009-03-15 La Crisis Perfecta 2009 mar 15
## # ... with 56 more rows
## # A tibble: 102 x 5
## fecha titulos anio mes dia
## <date> <chr> <dbl> <chr> <int>
## 1 2009-01-22 1ra Entrega 2009 ene 22
## 2 2009-01-25 La Cuarta Fase El Despliegue 2009 ene 25
## 3 2009-01-28 Ganó el Si 2009 ene 28
## 4 2009-01-29 Caballeria 2009 ene 29
## 5 2009-02-01 Febrero Otra vez Febrero 2009 feb 1
## 6 2009-02-03 Quinta Fase Doble Ataque Blindado 2009 feb 3
## 7 2009-02-05 4 de Febrero 2009 feb 5
## 8 2009-02-08 La Maisantera La Vida Bonita El Amor Bonito 2009 feb 8
## 9 2009-02-10 Construyendo Diginidad 2009 feb 10
## 10 2009-02-12 Una cita con el Futuro 2009 feb 12
## # ... with 92 more rows
No hay comentarios.:
Publicar un comentario