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