2016-06-06 9 views
0

Ich habe einen Datensatz mit mehr als 6.000 Beobachtungen, jeder Datensatz mit einer Punktzahl von 0-100. Unten ist ein Beispiel:r bin gleich Dezil

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

ich ist auf ihre Rangordnung im Verhältnis zu ihren Kollegen in der Partitur Spalte mit Cutoffs bei jedem 10. Perzentil, bezogen sie in gleiche Dezilen will, wie unten zu sehen:

+-----+-------+-----------+----------+ 
| 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 | 
+-----+-------+-----------+----------+ 

Bisher habe ich Cut, Cut2, Tapply usw. ausprobiert. Ich denke, ich bin auf dem richtigen logischen Weg, aber ich habe keine Ahnung, wie man sie auf meine Situation anwendet. Jede Hilfe wird sehr geschätzt.

Antwort

1

Ich würde ntile() in dplyr verwenden.

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) 
+0

Nun, das täuschend einfach war. Danke eine Tonne Bryan! Andere Antworten sind auch großartig, also wird dies ein guter Referenzbeitrag für mich sein. – Jrausch2

0

In base R wir eine Kombination aus .bincode() und quantile() verwenden können:

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 
0

Hier ist eine Methode, die quantile zusammen mit cut verwendet die Behälter zu erhalten:

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

as.integer nötigt die Ausgabe von cut (was ein Faktor ist) in die zugrunde liegende ganze Zahl.

Eine Möglichkeit, die Position Prozent zu erhalten, ist die Verwendung rank:

df$position <- rank(df$score)/nrow(df)