El paquete dplyr proporciona una “gramática” para trabajar con data frames.

Instalación

Instalamos de la forma habitual y cargamos el paquete en la sesión:

install.packages("dplyr")
library(dplyr)

Para consultar la ayuda sobre el paquete:

?dplyr

Resumen de funcionalidades

  • select(): Selecciona un conjunto de columnas / variables.
  • mutate(): Añade nuevas variables / columnas o transforma variables existentes.
  • filter(): Filtrar filas que cumplan una determinada condición.
  • summarise(): Crea una o más variables escalares a modo de resumen a partir de variables del DF.
  • “group_by()”:.
  • arrange(): Reordena las filas del DF.

Pero de todo lo que ofrece dplyr seguramente habrás visto en un montón de ejemplos de código el operador de tubería (pipe en adelante) con la forma %>%. Tanta curiosidad me suscitaba en su momento que necesitaba escribir algo sobre ello.

Dataset de ejemplo

Los datasets que vienen con R generalmente son super aburridos, para darle un poco de alegría al asunto me he encontrado un CSV con los protagonistas de Star Wars, obtengo el DF directamente de una URL y selecciono la variable/columna gender (género).

El dataset está obtenido de este enlace, por si acaso también lo he descargado y lo he dejado junto a los scripts R en GitLab aquí.

Otro dataset similar en esta enlace sobre figuras de acción (creo) de Star Wars.

Pipes con %>%

El operador pipeline %>% permite concatenar varias operaciones, no resulta nada innovador, con la sintaxis básica se puede hacer lo mismo pero este operador facilita la legibilidad.

Este es uno de los ejemplos más sencillos que se me ocurren, antes para crear un vector y sumar sus elementos hubieses hecho esto:

sum(c(1,2,4,5))

Con el operador pipe:

c(1,2,4,5) %>% sum()

Lo de arriba sólo es una muestra de como funciona, imagina que seguimos anidando nuevas funciones una dentro de otra, con el operador %>% se leer mucho más claro.

Select(): Seleccionar columnas

starWarsDF <- read.csv(file='https://raw.githubusercontent.com/hyzhangsf/stat133-1/master/datasets/starwars.csv')
genderDF <- select(starWarsDF,gender)
str(genderDF)

Podemos seleccionar más de una variable select(starWarsDF,gender,eyecolor).

Podemos utilizar la notación “:” para seleccionar un rango de columnas select(starWarsDF,gender:eyecolor).

Podemos invertir las variables de la selección select(starWarsDF, -(gender:eyecolor)).

Columnas cuyo nombre empieza select(starWarsDF,starts_with("h")) o acaba con ciertos carácteres select(starWarsDF,ends_with("n")).

filter(): Filtrar filas según una condición

Chewbacca

¿Protagonistas con sobrepeso? Chewbacca y Grievous (he tenido que mirar quien era este), aunque considerando sus alturas puede ser normal:

filter(starWarsDF, weight >= 100)

Ahora vamos a combinar varias condiciones:

filter(starWarsDF, weight >= 50, name %in% c('Anakin Skywalker','Padme Amidala','Chewbacca'))
  • Operadores lógicos: &, \, xor, !, any, all.
  • Comparadores: <, >, ==, <=, >=, !=, %in%, is.na, !is.na.

Otro ejemplo usando el operador lógico & (AND):

filter(starWarsDF, weight>=50 & weight<90)

arrange(): Ordenar las filas de acuerdo a una o varias columnas/variables

Por defecto arrange() ordena las filas por orden ascendente.

Ordenar por orden ascendente y descendente por una variable/columna:

arrange(starWarsDF, homeland)
arrange(starWarsDF, desc(homeland))

Ordenar según varias variables:

arrange(starWarsDF, homeland, species)

rename(): Renombrar una/s variable

rename(starWarsDF, nombre = name, color_pelo = haircolor)
colnames(starWarsDF)

mutate()

Código fuente

  • GitLab: r / paquetes / dplyr.

Enlaces externos