在R中缺少值的rank()和length()

时间:2013-10-16 17:10:37

标签: r

我正在尝试在R中编写百分位等级函数,但由于向量中缺少值,我遇到了rank()length()命令的问题。

这是我的代码:

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

这并没有给我我需要的答案,因为向量x包含许多缺失值,因此length(x)rank(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的向量长度相同(即NA中有mathscore的位置,我想要NA中的percentile_mathscore

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

使用以下内容:

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

为什么会这样:

当您使用大于其长度的值对矢量编制索引时,R会返回NA s。    顺便提一下,这可以很好地填充较短的向量,使其与较长的向量一样长。

答案 2 :(得分: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")。