3

我正在尝试在 R 中编写一个百分位等级函数,但由于向量中缺少值,我在使用rank()and命令时遇到了麻烦。length()

这是我的代码:

percentile.rank <- function(x) rank(x) / length(x)
percentile_mathscore <- percentile.rank(mathscore)

这并没有给我我需要的答案,因为向量x包含许多缺失值,所以length(x)andrank(x)命令没有返回相关数字。有没有办法获得忽略缺失值的排名和长度?

我想出了一种方法来做到这一点,但这有点靠蛮力:

percentile.rank2 <- function(x){
   x2 <- na.omit(x)
   return(rank(x, na.last = NA, ties.method = "random")/length(x2))
   rm(x2)
 }
percentile_mathscore2 <- percentile.rank2(mathscore)

这里的问题是我需要向量长度与向量长度percentile_mathscore2相同mathscore(即,有一个NAin的地方mathscore,我想要一个NAin percentile_mathscore)。

4

3 回答 3

3

这是一种解决方案

prank<-function(x){
  r<-rank(x)/sum(!is.na(x))
  r[is.na(x)]<-NA
  r
}

如果您愿意,可以将其简化为一行:

prank<-function(x) ifelse(is.na(x),NA,rank(x)/sum(!is.na(x)))

这样做的原因是默认情况下,rank将 NA 值排在最后。这是一些示例数据

> set.seed(123)
> x<-sample(10)
> x[sample(10,2)]<-NA
> x
 [1]  3  8  4  7 NA  1 10  9  2 NA
> rank(x)
 [1]  3  6  4  5  9  1  8  7  2 10
> prank(x)
 [1] 0.375 0.750 0.500 0.625    NA 0.125 1.000 0.875 0.250    NA
于 2013-10-16T17:15:50.363 回答
0

使用以下内容:

percentile.rank <- function(x)
  (rank(x, na.last=NA) / length(na.omit(x)))[seq(x)]

为什么这样有效:

当您按大于其长度的值索引向量时,R返回NAs。
顺便说一句,这很好地用于将较短的向量填充为与较长的向量一样长。

于 2013-10-16T17:16:24.133 回答
0
mathscore <- c(64, 78, NA, 100, 87, 92, 87, NA, 94)

my.percentile.rank <- function(x){
    percentile.rank <-
        rank(x,na.last="keep",ties.method="random")/length(which(!is.na(x)))
    return(percentile.rank)
}

> my.percentile.rank(mathscore)
[1] 0.1428571 0.2857143        NA 1.0000000 0.5714286 0.7142857 0.4285714
[8]        NA 0.8571429

然而,我认为这个“百分位数”可能有点误导,因为 NA 值已有效地从总体中删除。例如,考虑到两个 NA 分数,64 分真的是“最差”吗?此外"random",您指定的关系处理方式肯定具有误导性。为什么相同的分数会得到不同的排名?我会选择其他治疗方案之一("average""min""max"

于 2013-10-16T17:29:20.427 回答