Réponses:
Étant donné un vecteur de valeurs de données brutes, une fonction simple pourrait ressembler à
perc.rank <- function(x, xo) length(x[x <= xo])/length(x)*100
où x0
est la valeur pour laquelle nous voulons le rang centile, étant donné le vecteur x
, comme suggéré sur R-bloggers .
Cependant, il pourrait facilement être vectorisé comme
perc.rank <- function(x) trunc(rank(x))/length(x)
ce qui a l'avantage de ne pas avoir à passer chaque valeur. Voici donc un exemple d'utilisation:
my.df <- data.frame(x=rnorm(200))
my.df <- within(my.df, xr <- perc.rank(x))
CTT
paquet il y a quelque temps. Je n'ai pas vérifié contre Excel parce que je ne l'ai pas / ne l'utilise pas. À propos de (2) Je semble toujours oublier cela! C'est my.*
trunc
nécessaire? Il semble que le rang renvoie toujours un entier de toute façon.
rank()
défaut est de prendre la moyenne des valeurs liées (cf. ties.method = c("average",...)
).
Si votre data.frame d'origine est appelée dfr
et que la variable d'intérêt est appelée myvar
, vous pouvez l'utiliser dfr$myrank<-rank(dfr$myvar)
pour les classements normaux ou dfr$myrank<-rank(dfr$myvar)/length(myvar)
pour les classements centiles.
Tant pis. Si vous le voulez vraiment à la manière Excel (ce n'est peut-être pas la solution la plus simple, mais je me suis amusé à utiliser de nouvelles fonctions (pour moi) et à éviter les boucles):
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)]
}
maintenant vous pouvez utiliser dfr$myrank<-percentilerank(dfr$myvar)
HTH.
length < length(dfr$myvar)
".
Un problème avec la réponse présentée est qu'elle ne fonctionnera pas correctement lorsque vous avez des NA.
Dans ce cas, une autre possibilité (inspirée de la fonction de chl ♦) est:
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))))]
}
Ici, x est le vecteur de valeurs et p.ile est le centile par rang. 2,5 percentile par rang de (arbitraire) coef.mat peut être calculé par:
quant(coef.mat[,3], 2.5)
[1] 0.00025
ou comme une seule fonction:
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
n'imite pas la fonction d'Excel , ce qui est bien (+1) car ce dernier donne des résultats "étranges" (voir ma comparaison ). 2. Je ne nommerais pas le bloc de donnéesdf
, car ildf
s'agit d'une fonction R (la densité de la distribution F, voir?df
).