Berechnung des Perzentil-Ranges in R [abgeschlossen]

18

Wie kann ich dem Datenrahmen eine neue Variable hinzufügen, die der Perzentilrang einer der Variablen ist? Ich kann dies in Excel leicht tun, aber ich möchte das wirklich in R tun.

Vielen Dank

user333
quelle

Antworten:

27

Bei einem gegebenen Vektor von Rohdatenwerten könnte eine einfache Funktion so aussehen

perc.rank <- function(x, xo)  length(x[x <= xo])/length(x)*100

Wo x0ist der Wert, für den wir den Perzentil-Rang wollen, gegeben durch den Vektor x, wie in R-Bloggern vorgeschlagen .

Es kann jedoch leicht als vektorisiert werden

perc.rank <- function(x) trunc(rank(x))/length(x)

Dies hat den Vorteil, dass nicht jeder Wert übergeben werden muss. Hier ist ein Anwendungsbeispiel:

my.df <- data.frame(x=rnorm(200))
my.df <- within(my.df, xr <- perc.rank(x))
chl
quelle
3
1. Ihre Funktion imitiert nicht die Excel-Funktion percentrank, was gut ist (+1), da letztere "seltsame" Ergebnisse liefert (siehe meinen Vergleich ). 2. Ich würde den Datenrahmen nicht benennen df, da dfes sich um eine R-Funktion handelt (Dichte der F-Verteilung, siehe ?df).
Bernd Weiss
1
@ Bernd Danke. (1) In verschiedenen Psychometrie-Paketen sind einige Funktionen zur PR-Berechnung integriert. Ich glaube, ich habe mir diesen vor einiger Zeit aus dem CTTPaket geholt. Ich habe nicht gegen Excel geprüft, weil ich es nicht habe / benutze. Über (2) Ich scheine das immer zu vergessen! Lass uns mit my.*(Perl Weg) gehen :-)
chl
@chl warum ist das truncnötig? Es scheint, dass rank immer eine ganze Zahl zurückgibt.
Tyler Rinker
1
@ Tyler Nope. Bei Gleichheit wird rank()standardmäßig der Durchschnitt der Gleichheitswerte gebildet (vgl. ties.method = c("average",...)).
chl
8

Wenn Ihr ursprünglicher data.frame aufgerufen wird dfrund die Variable von Interesse aufgerufen wird myvar, können Sie sie dfr$myrank<-rank(dfr$myvar)für normale Ränge oder dfr$myrank<-rank(dfr$myvar)/length(myvar)für Perzentil-Ränge verwenden.

Naja. Wenn Sie es wirklich in Excel wollen (vielleicht nicht die einfachste Lösung, aber ich hatte ein bisschen Spaß beim Verwenden neuer (für mich) Funktionen und beim Vermeiden von Schleifen):

percentilerank<-function(x){
  rx<-rle(sort(x))
  smaller<-cumsum(c(0, rx$lengths))[seq(length(rx$lengths))]
  larger<-rev(cumsum(c(0, rev(rx$lengths))))[-1]
  rxpr<-smaller/(smaller+larger)
  rxpr[match(x, rx$values)]
}

So, jetzt können Sie verwenden dfr$myrank<-percentilerank(dfr$myvar)

HTH.

Nick Sabbe
quelle
1 - (Rang / Größe) gibt Ihnen das Gleiche wie Excel
Percentilerank
Ich habe dies von office.microsoft.com
Nick Sabbe
Ein anonymer (versuchter) Editor hat versucht, den folgenden Kommentar hinzuzufügen: "Nette Funktion, aber manchmal kann der RLE leider den Vektor von length < length(dfr$myvar)" zurückgeben.
gung - Wiedereinsetzung von Monica
1

Ein Problem mit der vorgestellten Antwort ist, dass es nicht richtig funktioniert, wenn Sie NAs haben.

In diesem Fall ist eine andere Möglichkeit (inspiriert von der Funktion von chl ♦):

perc.rank <- function(x) trunc(rank(x,na.last = NA))/sum(!is.na(x))
quant <- function (x, p.ile) {
      x[which.min(x = abs(perc.rank(x-(p.ile/100))))]
}

Hier ist x der Vektor der Werte und p.ile ist das Rang-Perzentil. 2,5 Perzentile nach Rang (beliebig) coef.mat können berechnet werden durch:

quant(coef.mat[,3], 2.5)  
[1] 0.00025  

oder als einzelne Funktion:

quant <- function (x, p.ile) {
   perc.rank <- trunc(rank(x,na.last = NA))/sum(!is.na(x))
   x = na.omit(x)
   x[which.min(x = abs(perc.rank(x-(p.ile/100))))]
}
Farshad
quelle