Вычисление процентиля ранга в R [закрыто]

18

Как я могу добавить новую переменную во фрейм данных, которая будет иметь процентильный ранг одной из переменных? Я могу сделать это в Excel легко, но я действительно хочу сделать это в R.

Благодарность

user333
источник

Ответы:

27

Учитывая вектор значений необработанных данных, простая функция может выглядеть так:

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))
хл
источник
3
1. Ваша функция не имитирует функцию Excel percentrank, что хорошо (+1), поскольку последняя дает «странные» результаты (см. Мое сравнение ). 2. Я бы не назвал фрейм данных df, потому что dfэто R-функция (см. Плотность F-распределения ?df).
Бернд Вайс
1
@ Спасибо спасибо. (1) Есть несколько встроенных функций для вычисления PR в различных психометрических пакетах. Я думаю, что я взял это из CTTпакета некоторое время назад. Я не проверял на Excel, потому что я не имею / использую это. О (2) Я, кажется, всегда забываю об этом! Пойдем с my.*(путь Perl) :-)
chl
@chl почему truncтребуется? Кажется, ранг всегда будет возвращать целое число в любом случае.
Тайлер Ринкер
1
@ Тайлер Нет. В случае наличия связей по rank()умолчанию берется среднее значение связанных значений (ср. ties.method = c("average",...)).
chl
8

Если вызывается ваш оригинальный 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)

НТН.

Ник Сабби
источник
1 - (ранг / размер) дает вам такой же, как Excel
Percilrank
Я получил это от office.microsoft.com
Ник
Анонимный (попытка) редактор попытался добавить следующий комментарий: «Хорошая функция, но иногда, к сожалению, RLE может возвращать вектор length < length(dfr$myvar)».
gung - Восстановить Монику
1

Проблема с представленным ответом состоит в том, что он не будет работать должным образом, когда у вас есть 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))))]
}
Farshad
источник