列表中的百分位数

Percentile in list

我有以下列表 (h):

> h
[[1]]
[1] 0.9613971

[[2]]
[1] 0.9705882

[[3]]
[1] 0.9503676

[[4]]
[1] 0.9632353

[[5]]
[1] 0.9779412

[[6]]
[1] 0.9852941

[[7]]
[1] 0.9852941

[[8]]
[1] 0.9816176

我想添加一个新列来计算列表中每个数字的百分位数。 我尝试使用以下内容但出现错误:

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


perc.rank <- function(x) trunc(rank(x))/length(x)

trunc(rank(h))/length(h)

此外,我想知道给定一个数字,例如 0.9503676(第三个数字)或其数字 (3),我如何知道他的百分位数是多少?

转换为数据框会使事情变得更容易。这是一种解决方案

library(dplyr)
df<-data.frame(x=rnorm(10))
df%>%mutate(percrank=rank(x)/length(x)*100)

             x percrank
1   1.56254900      100
2  -0.52554968       10
3   0.16410991       70
4   0.95150575       80
5   0.01960002       60
6  -0.22860395       30
7   1.43025012       90
8  -0.15836126       40
9  -0.01150753       50
10 -0.39064474       20

您可以先将列表转换为向量,如下所示,从而更有效地完成此操作:

h <- unlist(h)

接下来,创建一个函数来查找百分位数,您可以通过为您的列表创建一个经验 cdf 函数来轻松完成此操作,如下所示:

perc.rank <- ecdf(h)

要查找任何数字的百分位数,例如第三个数字,请执行以下操作:

perc.rank(0.9503676)

即使该号码不在您的列表中,这也能正常工作。例如。 perc.rank(0.91) 应该给你 0.91 的百分位数,你也可以将多个数字传递给函数,如 perc.rank(c(0.950,0.913,0.6))

这会将两个列表元素添加到当前列表 h

第二个列表元素是您所拥有的百分位数。

第三个列表元素是序数。

h <- list(.9613971, .9705882, .9503676, .9632353, .9779412, .9852941, .9852941, .9816176)

# create percentiles
rnk1 <- rank(unlist(h)) / length(h)

# ordinal rank
rnk2 <- rank(unlist(rnk1))

# combine the original lists with the two additional elements
res <- mapply(c, h, rnk1, rnk2, SIMPLIFY=FALSE)
res
[[1]]
[1] 0.9613971 0.2500000 2.0000000

[[2]]
[1] 0.9705882 0.5000000 4.0000000

[[3]]
[1] 0.9503676 0.1250000 1.0000000

[[4]]
[1] 0.9632353 0.3750000 3.0000000

[[5]]
[1] 0.9779412 0.6250000 5.0000000

[[6]]
[1] 0.9852941 0.9375000 7.5000000

[[7]]
[1] 0.9852941 0.9375000 7.5000000

[[8]]
[1] 0.9816176 0.7500000 6.0000000

按序数排序的查找函数

perc.rank <- function(x, xo) {
  x[[match(xo, sapply(x, "[[", 1))]]
}

perc.rank(res, .9779412)   
[1] 0.9779412 0.6250000 5.0000000

这表明 .9779412 排名第 5