11.4 Más allá de summarize y transform

Aunque es frecuente usar ddply junto con las funciones summarize o transform, también pueden usarse otras: la única condición es que acepten tablas y devuelvan igualmente tablas (con la misma estructura).

En esta sección vamos a construir un ejemplo para el que resultará útil (aunque no estrictamente necesaria) la función arrange. Esta función es una de las que, más allá de ddply y similares, contiene el paquete plyr y permite ordenar una tabla por una o varias columnas:

arrange(paro, Provinces, Periodo, Gender, Situation)

Busca en ?arrange cómo ordenar descendentemente.

El problema que queremos resolver es el siguiente: de cada especie de iris extraer los tres ejemplares con el pétalo más largo. Evidentemente, este proceso tiene que realizarse especie a especie. Para cada una de ellas, hay que ordenar por la longitud del pétalo y quedarse con las tres últimas filas. Podemos proceder así:

extract.top3 <- function(x)
  tail(arrange(x, Petal.Length), 3)

ddply(iris, .(Species), extract.top3)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
## 1          5.1         3.3          1.7         0.5     setosa
## 2          4.8         3.4          1.9         0.2     setosa
## 3          5.1         3.8          1.9         0.4     setosa
## 4          6.3         2.5          4.9         1.5 versicolor
## 5          6.7         3.0          5.0         1.7 versicolor
## 6          6.0         2.7          5.1         1.6 versicolor
## 7          7.7         3.8          6.7         2.2  virginica
## 8          7.7         2.8          6.7         2.0  virginica
## 9          7.7         2.6          6.9         2.3  virginica

En este caso ddply ha distribuido la función extract.top3 que acepta una tabla, la ordena y selecciona sus tres últimas filas.

En una sección anterior habíamos resuelto el ejercicio consistente en seleccionar, para cada periodo, las tres provincias en las que fue menor la tasa de paro tanto para hombres como para mujeres (por separado) usando transform. Repítelo utilizando una versión de la función introducida en esta sección.