Відповіді:
З урахуванням вектора необроблених значень даних може виглядати проста функція
perc.rank <- function(x, xo) length(x[x <= xo])/length(x)*100
де x0
значення, для якого ми хочемо відсотковий ранг, враховуючи вектор x
, як це запропоновано на R-блогерах .
Однак це може бути легко векторизовано як
perc.rank <- function(x) trunc(rank(x))/length(x)
що має перевагу в тому, що не потрібно передавати кожне значення. Отже, ось приклад використання:
my.df <- data.frame(x=rnorm(200))
my.df <- within(my.df, xr <- perc.rank(x))
CTT
пакета деякий час тому. Я не перевіряв Excel, тому що я не маю / не використовую його. Про (2) Я, здається, завжди про це забуваю! Поїдемо з my.*
(Perl way) :-)
trunc
потрібно? Здається, ранг все одно поверне ціле число.
rank()
за замовчуванням приймається середнє значення зв'язаних значень (пор. ties.method = c("average",...)
).
Якщо ваш вихідний data.frame викликається dfr
і викликається змінна, що цікавить myvar
, ви можете використовувати dfr$myrank<-rank(dfr$myvar)
для звичайних рангів або dfr$myrank<-rank(dfr$myvar)/length(myvar)
для процентильних рангів.
Що ж, добре. Якщо ви дійсно хочете, щоб це було в Excel (можливо, це не найпростіше рішення, але мені було весело, використовуючи нові (для мене) функції та уникаючи циклів):
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)]
}
тому тепер ви можете використовувати dfr$myrank<-percentilerank(dfr$myvar)
HTH.
length < length(dfr$myvar)
".
Проблема представленої відповіді полягає в тому, що вона не працюватиме належним чином, коли у вас є NA.
У цьому випадку іншою можливістю (натхненною функцією від 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))))]
}
Тут x - вектор значень, а p.ile - відсоток за рангом. 2,5 перцентиля за рангом (довільного) coef.mat можна обчислити:
quant(coef.mat[,3], 2.5)
[1] 0.00025
або як одна функція:
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
, що добре (+1), оскільки остання дає "дивні" результати (див. Моє порівняння ). 2. Я б не назвав кадр данихdf
, оскількиdf
це функція R (щільність розподілу F, див.?df
).