列表中的百分位数
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
我有以下列表 (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