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: