Respostas:
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))
CTT
pacote 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) :-)
trunc
necessário? Parece que a classificação sempre retornará um número inteiro de qualquer maneira.
rank()
padrão é obter a média dos valores empatados (cf. ties.method = c("average",...)
).
Se o data.frame original for chamado dfr
e 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.
length < length(dfr$myvar)
".
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))))]
}
percentrank
funçã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 dadosdf
, porquedf
é uma função R (a densidade da distribuição F, veja?df
).