2.4 El operador pipeline (%>%)

El software estadístico R es un lenguaje de programación creado por estadísticos y para estadísticos. Una de las contribuciones recientes a este software es el desarrollo de los pipelines (tuberías) que permiten de una forma intuitiva generar consultas y objetos desde una base de datos. El operador pipeline, %>%, es nativo del paquete Bache y Wickham (2022) y está cargado automáticamente en los paquetes del tidyverse.

El objetivo del operador es ayudar a escribir el código de una manera que sea más fácil de leer y entender. En este sentido, el operador %>% permite encadenar operaciones para que el resultado de una operación anterior se convierta en el argumento de la siguiente operación. A continuación, se presenta un ejemplo sencillo del uso del operador %>% con la base de datos BigLucy haciendo el conteo del total de elementos que contiene la base de datos utilizando la función count.

data1 %>% count()
##        n
## 1 150266

La anterior línea de código se entiende así: con la base de datos realice un conteo. Por otro lado, existe una gama amplia de funciones que se pueden utilizar con el operador %>%. A continuación, se enlistan una serie de funciones muy útiles al momento de hacer análisis con bases de datos provenientes de encuestas de hogares:

  • filter: mantiene un criterio de filtro sobre alguna variable o mezcla de variables.
  • select: selecciona columnas por nombres.
  • arrange: ordena las filas de la base de datos.
  • mutate: añade nuevas variables a la base de datos.
  • summarise: reduce variables a valores agrupados y los presenta en una tabla.
  • group_by: ejecuta funciones y agrupa el resultado por las variables de interés.

Una de las primeras consultas que se pueden realizar en las encuestas de hogares es saber el número de entrevistas efectivamente realizadas. Usando %>% se realiza de la siguiente manera:

data1 %>% nrow()
## [1] 150266

Otro de los ejercicios que se hacen usualmente con las encuestas de hogares está relacionado con hacer descriptivos de la base por sexo. Una de las formas más sencillas de hacer esta revisión es usar la función filter, para generar dos bases de datos.

datasexH <- data1 %>%
  filter(Sex == "Male")
datasexM <- data1 %>%
  filter(Sex == "Female")

Por otro lado, si el interés ahora es filtrar la base de datos por aquellas personas que no son pobres, se realiza de la siguiente manera:

datanopobre <- data1 %>%
  filter(Poverty == "NotPoor")

En este mismo sentido, es posible también crear nuevas bases de datos filtradas por algunos ingresos particulares mensuales, es posible realizarlo de la siguiente manera:

dataingreso1 <- data1 %>%
  filter(Income %in% c(265, 600))

dataingreso2 <- data1 %>%
  filter(Income %in% c(1000, 2000))

Dado que la base del ejemplo no cuenta con regiones geográficas definidas, se pueden construir agrupando algunos estratos, para ello se usa el siguiente código:

Region <- as.numeric(gsub(
  pattern = "\\D",
  replacement =  "",
  x = data1$Stratum
))

data1$Region <-
  cut(
    Region,
    breaks = 5,
    labels = c("Norte", "Sur", "Centro", "Occidente", "Oriente")
  )

La mayoría de veces, para los análisis con las bases de hogares, es necesario recodificar los niveles de los factores. El siguiente código permite generar los nombres de las regiones, junto con sus respectivos rótulos.

data1$IDRegion <- factor(
  data1$Region,
  levels = c("Norte", "Sur", "Centro", "Occidente", "Oriente"),
  labels = c("01", "02", "03", "04", "05")
)

Por último, para efectos de visualización en tablas y gráficos es conviene codificar los nombres de las variables como sigue:

data1$Nom_corto <- factor(
  data1$Region,
  levels = c("Norte", "Sur", "Centro", "Occidente", "Oriente"),
  labels = c("N", "S", "C", "O", "E")
)

Otra función muy útil en los procesamientos descriptivos de las encuestas de hogares es la función select, la cual permite seleccionar un grupo de variables de interés que se quieren analizar. Si, por ejemplo, se desea seleccionar de la base de ejemplo solo las variables que identifican al hogar (HHID), a las unidades primarias de muestreo (PSU), la Zona (Zone), el sexo de la persona (Sex) y sus ingresos (Income), se realiza de la siguiente manera:

datared <- data1 %>%
  select(HHID, PSU, Zone, Sex, Income)

La función select no solo sirve para seleccionar variables de una base de datos, también se puede utilizar para eliminar algunas variables de la base de datos que ya no son de interés para el análisis o que, simplemente, se generaron en la manipulación de la base de datos como variables temporales para realizar algunos cálculos de interés. Por ejemplo, si se desea eliminar de la base de datos de ejemplo las variables de identificación del hogar y de identificación de las personas, se podría realizar introduciendo un signo “menos” (-) delante del nombre de la variable como sigue:

datagrey <- data1 %>%
  select(-HHID, -PersonID)

Por otro lado, si el objetivo fuese ordenar las filas de la base por alguna variable en particular, se utilizaría la función arrange para realizar esta operación. A continuación, se ejemplifica con la base de datos dataingreso1, cómo se ordena la base de acuerdo con la variable Income:

datadog <- dataingreso1 %>%
  arrange(Income)

datadog %>% 
  head()
##        HHID PersonID   Stratum     PSU  Zone    Sex Age MaritalST Income
## 1 idHH02245  idPer01 idStrt017 PSU0166 Rural   Male  73   Widowed    265
## 2 idHH02245  idPer02 idStrt017 PSU0166 Rural   Male  38   Married    265
## 3 idHH02245  idPer03 idStrt017 PSU0166 Rural Female  37   Married    265
## 4 idHH02245  idPer04 idStrt017 PSU0166 Rural   Male  16    Single    265
## 5 idHH02245  idPer05 idStrt017 PSU0166 Rural   Male  12    Single    265
## 6 idHH02245  idPer06 idStrt017 PSU0166 Rural   Male  11      <NA>    265
##   Expenditure Employment  Poverty
## 1      281.42   Inactive Relative
## 2      281.42   Employed Relative
## 3      281.42   Inactive Relative
## 4      281.42   Employed Relative
## 5      281.42       <NA> Relative
## 6      281.42       <NA> Relative

Es posible utilizar la función arrange para hacer ordenamientos más complicados. Por ejemplo, ordenar por más de una variable. A modo de ejemplo, ordenemos la base de datos dataingreso1 de acuerdo con las variables Sexo y Edad.

dataingreso1 %>%
  arrange(Sex, Age) %>%
  head()
##        HHID PersonID   Stratum     PSU  Zone    Sex Age MaritalST Income
## 1 idHH02586  idPer05 idStrt018 PSU0193 Urban Female   2      <NA>    600
## 2 idHH23231  idPer05 idStrt018 PSU0193 Urban Female   2      <NA>    600
## 3 idHH19448  idPer05 idStrt115 PSU1571 Urban Female   2      <NA>    600
## 4 idHH40093  idPer05 idStrt115 PSU1571 Urban Female   2      <NA>    600
## 5 idHH14415  idPer05 idStrt091 PSU1182 Urban Female   3      <NA>    600
## 6 idHH35060  idPer05 idStrt091 PSU1182 Urban Female   3      <NA>    600
##   Expenditure Employment Poverty
## 1      379.15       <NA> NotPoor
## 2      379.15       <NA> NotPoor
## 3      411.02       <NA> NotPoor
## 4      411.02       <NA> NotPoor
## 5      399.55       <NA> NotPoor
## 6      399.55       <NA> NotPoor

También es posible utilizar la función arrange junto con la opción desc() para que el ordenamiento sea descendente.

dataingreso1 %>%
  arrange(desc(Age)) %>%
  head()
##        HHID PersonID   Stratum     PSU  Zone    Sex Age MaritalST Income
## 1 idHH06945  idPer01 idStrt047 PSU0541 Urban Female  88 Separated    600
## 2 idHH27590  idPer01 idStrt047 PSU0541 Urban Female  88 Separated    600
## 3 idHH05798  idPer01 idStrt039 PSU0438 Urban Female  87   Widowed    600
## 4 idHH26443  idPer01 idStrt039 PSU0438 Urban Female  87   Widowed    600
## 5 idHH13013  idPer01 idStrt085 PSU1074 Urban Female  87   Widowed    600
## 6 idHH33658  idPer01 idStrt085 PSU1074 Urban Female  87   Widowed    600
##   Expenditure Employment Poverty
## 1      543.59   Inactive NotPoor
## 2      543.59   Inactive NotPoor
## 3     1026.00   Inactive NotPoor
## 4     1026.00   Inactive NotPoor
## 5      266.00   Inactive NotPoor
## 6      266.00   Inactive NotPoor

References

Bache, Stefan Milton, y Hadley Wickham. 2022. magrittr: A Forward-Pipe Operator for R. https://CRAN.R-project.org/package=magrittr.