Calcul du rang centile dans R [fermé]

18

Comment puis-je ajouter une nouvelle variable dans le bloc de données qui sera le rang centile de l'une des variables? Je peux le faire facilement dans Excel, mais je veux vraiment le faire dans R.

Merci

user333
la source

Réponses:

27

É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

x0est 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))
chl
la source
3
1. Votre fonction percentrankn'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ées df, car il dfs'agit d'une fonction R (la densité de la distribution F, voir ?df).
Bernd Weiss
1
@Bernd Merci. (1) Il existe des fonctions intégrées pour le calcul des RP dans divers packages psychométriques. Je pense que j'ai saisi celui-ci dans le CTTpaquet 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.*
parti
@chl pourquoi le truncnécessaire? Il semble que le rang renvoie toujours un entier de toute façon.
Tyler Rinker
1
@Tyler Nope. En cas d'égalité, la valeur par rank()défaut est de prendre la moyenne des valeurs liées (cf. ties.method = c("average",...)).
chl
8

Si votre data.frame d'origine est appelée dfret 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.

Nick Sabbe
la source
1 - (rang / taille) vous donne la même chose que Excel percentilerank
user333
Je l'ai obtenu de office.microsoft.com
Nick Sabbe
Un éditeur anonyme (tenté) a tenté d'ajouter le commentaire suivant: "Fonction sympa mais parfois, malheureusement, le RLE peut renvoyer le vecteur de length < length(dfr$myvar)".
gung - Réintègre Monica
1

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))))]
}
Farshad
la source