Classificação de percentil de computação em R [fechado]

18

Como posso adicionar uma nova variável ao quadro de dados, que será a classificação percentual de uma das variáveis? Eu posso fazer isso no Excel facilmente, mas eu realmente quero fazer isso no R.

obrigado

user333
fonte

Respostas:

27

Dado um vetor de valores de dados brutos, uma função simples pode parecer

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

onde x0é o valor para o qual queremos a classificação do percentil, dado o vetor x, conforme sugerido nos R-blogueiros .

No entanto, pode ser facilmente vetorizado como

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

que tem a vantagem de não precisar passar cada valor. Então, aqui está um exemplo de uso:

my.df <- data.frame(x=rnorm(200))
my.df <- within(my.df, xr <- perc.rank(x))
chl
fonte
3
1. Sua função não imita a percentrankfunção do Excel , o que é bom (+1), pois o último fornece resultados "estranhos" (veja minha comparação ). 2. Eu não nomearia o quadro de dados df, porque dfé uma função R (a densidade da distribuição F, veja ?df).
Bernd Weiss
1
@Bernd Obrigado. (1) Existem algumas funções integradas para calcular PR em vários pacotes psicométricos. Eu acho que peguei esse presente no CTTpacote há um tempo atrás. Não verifiquei no Excel porque não o tenho / uso. Sobre (2) Parece que sempre esqueço disso! Deixe-nos ir com my.*(modo Perl) :-)
chl
@chl porque é truncnecessário? Parece que a classificação sempre retornará um número inteiro de qualquer maneira.
Tyler Rinker
1
@Tyler Nope. No caso de empates, o rank()padrão é obter a média dos valores empatados (cf. ties.method = c("average",...)).
chl
8

Se o data.frame original for chamado dfre a variável de interesse for chamada myvar, você poderá usá-lo dfr$myrank<-rank(dfr$myvar)para classificações normais ou dfr$myrank<-rank(dfr$myvar)/length(myvar)percentuais.

Ah bem. Se você realmente deseja da maneira Excel (pode não ser a solução mais simples, mas me diverti usando novas funções (para mim) e evitando loops):

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

então agora você pode usar dfr$myrank<-percentilerank(dfr$myvar)

HTH.

Nick Sabbe
fonte
1 - (classificação / tamanho) dá-lhe mesmo que excel percentilerank
user333
Eu tenho esse de office.microsoft.com
Nick Sabbe
Um editor anônimo (tentado) tentou adicionar o seguinte comentário: "Função agradável, mas às vezes, infelizmente, o RLE pode retornar o vetor de length < length(dfr$myvar)".
gung - Restabelece Monica
1

Um problema com a resposta apresentada é que ela não funcionará corretamente quando você tiver NAs.

Nesse caso, outra possibilidade (inspirada na função de 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))))]
}

Aqui, x é o vetor de valores e p.ile é o percentil por classificação. O percentil 2,5 pela classificação de coef.mat (arbitrário) pode ser calculado por:

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

ou como uma única função:

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
fonte