Обчислювальний відсотковий ранг в R [закрито]


18

Як я можу додати нову змінну в кадр даних, який буде відсотковим рангом однієї зі змінних? Я можу це зробити в Excel легко, але дуже хочу це зробити в Р.

Спасибі

Відповіді:


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
@Bernd Дякую (1) Існують деякі вбудовані функції для обчислення PR в різних психометричних пакетах. Я думаю, що я схопив цей із CTTпакета деякий час тому. Я не перевіряв Excel, тому що я не маю / не використовую його. Про (2) Я, здається, завжди про це забуваю! Поїдемо з my.*(Perl way) :-)
chl

@chl, чому це truncпотрібно? Здається, ранг все одно поверне ціле число.
Тайлер Рінкер

1
@Tyler Nope. Якщо є зв’язки, rank()за замовчуванням приймається середнє значення зв'язаних значень (пор. ties.method = c("average",...)).
чл

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)

HTH.


1 - (ранг / розмір) дає вам те ж саме, що і excel percentilerank
user333

Я отримав це від office.microsoft.com
Nick Sabbe

Анонімний (спроба) редактор намагався додати такий коментар: "Хороша функція, але іноді, на жаль, 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))))]
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.