Ответы:
Учитывая вектор значений необработанных данных, простая функция может выглядеть так:
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) :-)
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)
НТН.
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
).