计算R中的百分位等级[关闭]


18

如何将新变量添加到数据框架中,该变量将是变量之一的百分等级?我可以在Excel中轻松完成此操作,但我真的很想在R中执行此操作。

谢谢

Answers:


27

给定原始数据值的向量,一个简单的函数可能看起来像

perc.rank <- function(x, xo)  length(x[x <= xo])/length(x)*100

根据R-bloggers的建议x0,给定向量x,我们想要百分等级的值在哪里。

但是,可以很容易地将其向量化为

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-function,它很好(+1),因为后者给出了“奇怪的”结果(请参阅我的比较)。2.我不会命名数据框df,因为df它是R函数(F分布的密度,请参见?df)。
Bernd Weiss

1
@伯恩德谢谢。(1)在各种心理测验软件包中,有一些内置函数可以计算PR。我想我CTT前一阵子从包装中抢了这个。我没有检查Excel,因为我没有/使用它。关于(2)我似乎总是忘记这一点!让我们来看一下my.*(Perl方式):-)
chl

@chl为什么是trunc必需的?看来rank总是会返回整数。
泰勒·林克

1
@泰勒不。如果存在平局,则rank()默认为取平局值的平均值(参见参考资料ties.method = c("average",...))。
chl

8

如果调用dfr了原始的data.frame,并且感兴趣的变量称为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


一个匿名的(尝试过的)编辑器试图添加以下注释:“功能不错,但有时,不幸的是,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是排名的百分位。(任意)coef.mat等级的2.5个百分点可以通过以下公式计算:

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))))]
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.