Сделать эквивалент функции Excel = PERCENTRANK.EX C в R? - PullRequest
3 голосов
/ 22 марта 2020

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

true_df <- data.frame(some_column= c(24516,7174,13594,33838,40000))

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<-percentilerank(true_df$some_column)

#output which is similar to =PERCENTRANK.INC and NOT =PERCENTRANK.EXC
#[1] 0.50 0.00 0.25 0.75 1.00

Но это для =PERCENTRANK.INC эквивалент в R. Согласно всплывающему окну информации в Excel, =PERCENTRANK.INC принимает (массив, значение x ранга, [значение-необязательное]) и возвращает процентный ранг, включая первое (0%) и последнее (100%) значения в массиве.

=PERCENTRANK.EXC аналогичен своему аналогу, но возвращает процентный ранг, исключая первое и последнее значения в массиве. Значение не 0% или 100%.

Вот небольшой пример использования Excel, чтобы показать разницу:

enter image description here

Когда я применяю вышеупомянутую функцию R, она дает мне вывод аналогично PERCENTRANK.INC($A$32:$A$36,A32) столбцу. Как мне этого добиться? Я новичок в Р.

Ответы [ 2 ]

1 голос
/ 22 марта 2020

Использование dplyr:

library(dplyr)

# inclusive
percent_rank(x)

# exclusive
percent_rank(c(-Inf, Inf, x))[-(1:2)]
1 голос
/ 22 марта 2020

Я возился с кодом и получил это:

true_df <- data.frame(some_column= c(24516,7174,13594,33838,40000))

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))))
  rxpr<-smaller/(smaller+larger)
  rxpr[match(x, rx$values)]
}

dfr<-percentilerank(true_df$some_column)

#output is now matches =PERCENTRANK.EXC 
#[1] 0.5000000 0.1666667 0.3333333 0.6666667 0.8333333

Так как 0 и 100% не включены в процентиль. Я изменил строку smaller<-cumsum(c(0.... на smaller<-cumsum(c(!0.... и аналогично избавился от 100%, где я вынул [-1] из строки larger<-...[-1]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...