У меня есть набор данных с разными группами - для этого примера давайте просто скажем две группы - и я хочу рассчитать средний процентный ранг, но я хочу использовать dplyr
(так что без цикла).
Вот данные и то, что у меня есть на данный момент:
library(dplyr);
group<-c("A","A","A","A","A","A","A","A","A","A","A","B","B","B","B","B","B","B","B","B","B","B")
score<-c(1,2,3,4,5,6,7,8,9,10,10,9,10,7,8,4,5,10,11,12,13,10)
my_orig_df<-data.frame(group,score)
mydf<-my_orig_df %.%
group_by(group) %.%
mutate ( Cum= round( cume_dist(score),2) , myPTILE=percent_rank(score))
mydf
Для ясности: я ожидаю, что первое значение для группы A
будет .05, а не .09 или 0. Хотя результаты близки, они не совсем то, что я ожидал.
Я могу получить желаемые результаты с помощью вложенного цикла (но это не то, что мне нужно):
Ugroup<-unique (group)
for (i in 1:length(Ugroup)) {
temp<-subset(mydf,group==Ugroup[i])
for(j in 1:length(temp$score)) {
ptile<-c(ptile, ((sum(temp$score==temp$score[j])/2)+sum(temp$score<temp$score[j])) /length(temp$score))
} }
Когда я запускаю код с циклом (см. Выше) с большим набором данных с несколькими группами, время становится проблемой.
Я пробовал следующее: row_number(score); ntile(score, 99); min_rank(score); dense_rank(score); percent_rank(score); cume_dist(score)
, но ни один из них не дал того, что я ищу. Любые идеи были бы хорошы.