列表中的百分位数

时间:2015-09-23 19:37:27

标签: r list percentile

我有以下清单(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),我怎么知道他的百分位是什么?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

您可以通过首先将列表转换为向量来更有效地执行此操作,如下所示:

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))

答案 2 :(得分:1)

这会将两个列表元素添加到当前列表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