r бин равные децили

У меня есть набор данных, содержащий более 6000 наблюдений, каждая запись имеет оценку от 0 до 100. Ниже приведен образец:

+-----+-------+
| uID | score |
+-----+-------+
|   1 |    77 |
|   2 |    61 |
|   3 |    74 |
|   4 |    47 |
|   5 |    65 |
|   6 |    51 |
|   7 |    25 |
|   8 |    64 |
|   9 |    69 |
|  10 |    52 |
+-----+-------+

Я хочу разделить их на равные децили на основе их ранжирования по отношению к их сверстникам в столбце оценок с отсечкой на каждом 10-м процентиле, как показано ниже:

+-----+-------+-----------+----------+
| uID | score | position% | scoreBin |
+-----+-------+-----------+----------+
|   7 |    25 | 0.1       |        1 |
|   4 |    47 | 0.2       |        2 |
|   6 |    51 | 0.3       |        3 |
|  10 |    52 | 0.4       |        4 |
|   2 |    61 | 0.5       |        5 |
|   8 |    64 | 0.6       |        6 |
|   5 |    65 | 0.7       |        7 |
|   9 |    69 | 0.8       |        8 |
|   3 |    74 | 0.9       |        9 |
|   1 |    77 | 1         |       10 |
+-----+-------+-----------+----------+

До сих пор я пробовал cut, cut2, tapply и т. д. Я думаю, что нахожусь на правильном логическом пути, но я понятия не имею, как применить их к моей ситуации. Любая помощь приветствуется.


person Jrausch2    schedule 06.06.2016    source источник


Ответы (3)


Я бы использовал ntile() в dplyr.

library(dplyr)

score<-c(77,61,74,47,65,51,25,64,69,52)
ntile(score, 10)

##[1] 10  5  9  2  7  3  1  6  8  4

scoreBin<- ntile(score, 10)
person Bryan Goggin    schedule 06.06.2016
comment
Что ж, это было обманчиво просто. Большое спасибо, Брайан! Другие ответы тоже хороши, так что это будет для меня хорошим справочным постом. - person Jrausch2; 06.06.2016

В base R мы можем использовать комбинацию .bincode() и quantile():

df$new <- .bincode(df$score, 
               breaks = quantile(df$score, seq(0, 1, by = 0.1)),
               include.lowest = TRUE)
#   uID score new
#1    1    77  10
#2    2    61   5
#3    3    74   9
#4    4    47   2
#5    5    65   7
#6    6    51   3
#7    7    25   1
#8    8    64   6
#9    9    69   8
#10  10    52   4
person mtoto    schedule 06.06.2016

Вот метод, который использует quantile вместе с cut для получения бинов:

df$scoreBin <- as.integer(cut(df$score,
                      breaks=quantile(df$score, seq(0,1, .1), include.lowest=T)))

as.integer приводит вывод cut (который является фактором) к базовому целому числу.

Один из способов получить процент позиции — использовать rank:

df$position <- rank(df$score) / nrow(df)
person lmo    schedule 06.06.2016