Возможно, я неправильно понимаю, но думаю, что это можно сделать так:
> 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
Это правильно?
Я имею в виду фактический процентиль каждого
наблюдение. - Райан Росарио
Edit:
Я думаю, что это может сделать это тогда:
> 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
С вашими данными:
> 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
Редактировать 2:
Это, вероятно, быстрее:
tapply(scores, years, function(x) { f = ecdf(x); f(x) })
f()
векторизовано: -)
Последнее, модификация, обещаю :-). Если вы хотите имена:
> 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