首页 > 解决方案 > 在 R 中做一个等效于 Excel 的 =PERCENTRANK.EXC 函数?

问题描述

我想知道如何在 R 中转换 Excel 的百分位排他函数。我在这里找到了一种技术,如下所示:

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 中的信息弹出窗口,a=PERCENTRANK.INC采用 (array, x-value of rank, [significance-optional]) 并返回包含第一个 (0%) 和最后一个 (100%) 的百分比排名数组中的值。

=PERCENTRANK.EXC类似于它的对应物,但它返回的百分比排名不包括数组中的第一个和最后一个值。意思不是 0% 或 100%。

这是一个使用 Excel 显示差异的小示例:

在此处输入图像描述

当我应用上面的 R 函数时,它给了我类似于PERCENTRANK.INC($A$32:$A$36,A32)列的输出。我怎样才能做到这一点?我是 R 的新手。

标签: rexcelexcel-formula

解决方案


我弄乱了代码并得到了这个:

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....和类似地摆脱了我从线路中取出 [-1] 的 100%larger<-...[-1]


推荐阅读