Rango percentuale di calcolo in R [chiuso]


18

Come posso aggiungere una nuova variabile nel frame di dati che sarà il rango percentuale di una delle variabili? Posso farlo facilmente in Excel, ma voglio davvero farlo in R.

Grazie

Risposte:


27

Dato un vettore di valori di dati grezzi, potrebbe apparire una semplice funzione

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

dove x0è il valore per il quale vogliamo il rango percentuale, dato il vettore x, come suggerito su R-blogger .

Tuttavia, potrebbe essere facilmente vettorializzato come

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

che ha il vantaggio di non dover passare ciascun valore. Quindi, ecco un esempio di utilizzo:

my.df <- data.frame(x=rnorm(200))
my.df <- within(my.df, xr <- perc.rank(x))

3
1. La tua funzione non imita la funzione di Excel percentrank, che è buona (+1) poiché quest'ultima fornisce risultati "strani" (vedi il mio confronto ). 2. Non darei un nome al frame di dati df, perché dfè una funzione R (la densità della distribuzione F, vedi ?df).
Bernd Weiss,

1
@Bernd Grazie. (1) Ci sono alcune funzioni integrate per il calcolo delle PR in vari pacchetti di psicometria. Penso di aver preso questo dal CTTpacchetto qualche tempo fa. Non ho verificato contro Excel perché non l'ho / non lo uso. Circa (2) Mi sembra di dimenticarmene sempre! Andiamo con my.*(Perl way) :-)
chl

@chl perché è truncnecessario? Sembra che comunque la classifica restituisca sempre un numero intero.
Tyler Rinker,

1
@Tyler Nope. In caso di vincoli, per rank()impostazione predefinita è prendere la media dei valori collegati (cfr ties.method = c("average",...).).
chl

8

Se viene chiamato dfril tuo data.frame originale e viene chiamata la variabile di interesse myvar, puoi usarla dfr$myrank<-rank(dfr$myvar)per gradi normali o dfr$myrank<-rank(dfr$myvar)/length(myvar)per gradi percentili.

Oh bene. Se lo vuoi davvero nel modo Excel (potrebbe non essere la soluzione più semplice, ma mi sono divertito un po 'usando le nuove funzioni (per me) ed evitando i loop):

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)]
}

così ora puoi usare dfr$myrank<-percentilerank(dfr$myvar)

HTH.


1 - (rango / dimensione) ti dà lo stesso di Excel percentilerank
user333


Un editor anonimo (tentato) ha provato ad aggiungere il seguente commento: "Bella funzione ma a volte, sfortunatamente, l'RLE può restituire il vettore di length < length(dfr$myvar)".
gung - Ripristina Monica

1

Un problema con la risposta presentata è che non funzionerà correttamente quando si hanno NA.

In questo caso, un'altra possibilità (ispirata alla funzione di 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))))]
}

Qui x è il vettore di valori e p.ile è il percentile per rango. Il 2,5 percento per grado di coefficiente (arbitrario) può essere calcolato mediante:

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

o come singola funzione:

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))))]
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.