我正在尝试在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
。
答案 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"
)。