Risposte:
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))
CTT
pacchetto 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) :-)
trunc
necessario? Sembra che comunque la classifica restituisca sempre un numero intero.
rank()
impostazione predefinita è prendere la media dei valori collegati (cfr ties.method = c("average",...)
.).
Se viene chiamato dfr
il 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.
length < length(dfr$myvar)
".
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))))]
}
percentrank
, che è buona (+1) poiché quest'ultima fornisce risultati "strani" (vedi il mio confronto ). 2. Non darei un nome al frame di datidf
, perchédf
è una funzione R (la densità della distribuzione F, vedi?df
).