que puede ser malentendido, pero creo que se puede hacer de esta manera:
> years = c(2006, 2006, 2006, 2006, 2001, 2001, 2001, 2001, 2001)
> scores = c(13, 65, 23, 34, 78, 56, 89, 98, 100)
> tapply(scores, years, quantile)
$`2001`
0% 25% 50% 75% 100%
56 78 89 98 100
$`2006`
0% 25% 50% 75% 100%
13.00 20.50 28.50 41.75 65.00
¿Es esto así?
Me refiero al percentil real de cada observación . - Ryan Rosario
Editar:
Creo que esto puede hacerlo a continuación:
> tapply(scores, years, function(x) { f = ecdf(x); sapply(x, f) })
$`2001`
[1] 0.4 0.2 0.6 0.8 1.0
$`2006`
[1] 0.25 1.00 0.50 0.75
con sus datos:
> tapply(scores, years, function(x) { f = ecdf(x); sapply(x, f) })
$`2000`
[1] 0.3333333 0.6666667 1.0000000
$`2008`
[1] 0.5 1.0
Edición 2:
Este es probablemente más rápido:
tapply(scores, years, function(x) { f = ecdf(x); f(x) })
f()
se vectorizado :-)
pasado, modificación, lo prometo :-). Si desea nombres:
> tapply(scores, years, function(x) { f = ecdf(x); r = f(x); names(r) <- x; r })
$`2000`
1000 1700 2000
0.3333333 0.6666667 1.0000000
$`2008`
1500 2000
0.5 1.0
+1 porque realmente debería pasar algo de tiempo con plyr –
Esto es hermoso. Sabía que tenía que haber una forma de una sola línea para hacer esto, incluso si requiere cargar un paquete. –
O un poco más simple: 'ddply (df,. (Years), transform, percentile = ecdf (scores) (scores))' – hadley