2014-12-16

Aplicar una función a cada columna en R con dplyr

Title En esta entrada vamos a emplear la función summarise_each del paquete dplyr para aplicar una función a las columnas de una matriz o de un data frame. Es una alternativa a la función apply del paquete base que tratamos en una entrada anterior.

Problema

Por ejemplo, imaginemos que queremos calcular la media de las columnas del conjunto de datos trees, cargado por defecto en R. Tendríamos que repetir la misma instrucción para cada columna con el correspondiente nombre de la misma.

mean(trees$Girth)
mean(trees$Height)
mean(trees$Volume)
[1] 13.24839
[1] 76
[1] 30.17097

Solución

Podemos obtener el mismo resultado de manera más concisa, y sin necesidad de saber los nombres de las columnas, usando la función summarise_each.

La sintaxis de summarise_each_(tbl, funs, vars) es:

tbl – la matriz o data frame
funs – lista de funciones que utilizaremos
vars,... – variables a incluir o excluir en mutate/summarise

El operador %>% nos permite evitar paréntesis anidados y ganar en claridad. De esta manera, podemos leer las instrucciones de arriba a abajo y de izquierda a derecha, en lugar de leer desde el interior del paréntesis anidado hacia afuera. Este operador se conoce en inglés como pipe operator y dplyr lo ha adoptado del paquete magrittr. En RStudio podemos obtenerlo con el atajo: Ctrl+Mayús+M

library(dplyr) 
trees %>%
  summarise_each(funs(mean))
     Girth Height   Volume
1 13.24839     76 30.17097

Más ejemplos

Aunque el propósito de esta entrada no es explicar las principales funciones o verbos de dplyr para manipular datos, merece la pena ver algunos ejemplos más:

  • Incluyendo solamente la columna Girth

trees %>%
  summarise_each(funs(mean), Girth)
  Height   Volume
1     76 30.17097
  • Excluyendo la variagle Girth

trees %>%
  summarise_each(funs(mean), -Girth)
  Height   Volume
1     76 30.17097
  • Filtrando las filas cuyo volumen sea superior a 30 pies cúbicos.

trees %>%
  filter(Volume > 30 )%>%
  summarise_each(funs(mean))
     Girth   Height Volume
1 16.43333 79.66667 47.175

Notas

En nuestro ejemplo no necesitaríamos utilizar la función summarise_each o apply, pues hay una función que específicamente calcula la media por columnas colMeans. Lo mismo en el caso de la función suma con la función colSums. Estas funciones son equivalentes a apply con FUN = mean o FUN = sum con MARGIN = 2, pero son mucho más rápidas.

colMeans(trees)
   Girth   Height   Volume 
13.24839 76.00000 30.17097 
colSums(trees)
 Girth Height Volume 
 410.7 2356.0  935.3 
La función summarise_each nos permite listar varias funciones.

trees %>%
  summarise_each(funs(mean, sum))
  Girth_mean Height_mean Volume_mean Girth_sum Height_sum Volume_sum
1   13.24839          76    30.17097     410.7       2356      935.3

Referencias:

No hay comentarios:

Publicar un comentario

Nube de datos