如何计算 R 中的百分位数 [0,1) 以使值低于百分位数
How to calculate percentile [0,1) in R such that values lies below the percentile
我有代理商的数据框及其相应的产品销售数量
Gent_Code number_policies
A096 3
A0828 12
A0843 2
A0141 2
B079 7
B05 3
M012 5
P010 2
S039 3
我想计算每个值 (xi) 所在的百分位数,使得数据中 p% 的值低于 xi。
百分位数的最小值为 0,最大值非常接近 1 但不是 1。
我已经完成了以下操作:
ag_df <- mutate(ag_df, pon_percentiles = ecdf(ag_df$pon)(ag_df$pon))
summary(ag_df$pon_percentiles )
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.4805 0.4805 0.6417 0.6356 0.7738 1.0000
但是,我希望百分位数公式计算的值低于某个值,而不是低于或等于该值。
因此,向量中最小值的百分位数应为 0,最大值应接近 1 但不完全为 1。
Current output:
0.6666667 1.0000000 0.3333333 0.3333333 0.8888889 0.6666667 0.7777778 0.3333333 0.6666667
如果我们看到上面的输出,对于 number_policies (2) 的最小值为 0.3333 ,但我希望它为 0。
对于最大值 12,它不应该是 1,而是 0.99。
我如何在 R 中执行此操作?
我在 ecdf、cume_distr 等基本函数中搜索了相关参数,但没有找到任何参数。
有人可以帮我解决这个问题吗?
您只需使用分位数函数即可:
quantile(df, probs = c(0, 0.24, 0.49, 0.74, 0.99))
希望对您有所帮助!!!
使用 percent_rank()
函数的一个解决方案是:
pkgs <- c("tidyverse", "stringi")
invisible(lapply(pkgs, require, character.only = TRUE))
set.seed(2)
n <- 30
db <- tibble(gent_code = paste0(stri_rand_strings(n, 1, '[A-Z]'),
stri_rand_strings(n, 4, '[0-9]')),
nr_pol = sample(1L:100L, n, TRUE))
db %>%
mutate(percentile = percent_rank(nr_pol)) %>%
print(n = n)
给出输出:
gent_code nr_pol percentile
<chr> <int> <dbl>
1 E0188 35 0.241
2 S5682 91 0.862
3 O6192 96 0.931
4 E1197 97 1.000
5 Y9358 39 0.345
6 Y0069 63 0.552
7 D2879 14 0.138
8 V6778 25 0.172
9 M6284 75 0.759
10 O3420 69 0.690
11 O2301 35 0.241
12 G1728 3 0.0345
13 T4536 38 0.310
14 E0418 1 0
15 K9373 44 0.414
16 W9335 66 0.621
17 Z4140 58 0.448
18 F1424 62 0.517
19 L9825 96 0.931
20 B8411 59 0.483
21 R0735 41 0.379
22 K8881 81 0.793
23 V9502 87 0.828
24 D9827 5 0.0690
25 J5363 8 0.103
26 M2909 68 0.655
27 D3658 94 0.897
28 J1312 34 0.207
29 Z6347 63 0.552
30 D6342 72 0.724
如您所见,它从 0 开始,但最高百分位数将等于 1,因为它反映了数据中最多的策略。
编辑:
在这种情况下强制 12 等于例如第 99 个百分位数意味着数据中的数据点高于 12。它将等于 1,因为您的所有数据点都小于或等于该值。
我想这是你想要的,但我不确定,你只需要按照你想要的方式设置 labels
和 probs
。
iris2 <- iris
iris2$quartile_number <- cut(iris$Sepal.Length,
quantile(iris$Sepal.Length) ,
include.lowest=T,
labels=c(.25, .5, .75, 1))
head(iris2)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species quartile_number
1 5.1 3.5 1.4 0.2 setosa 0.25
2 4.9 3.0 1.4 0.2 setosa 0.25
3 4.7 3.2 1.3 0.2 setosa 0.25
4 4.6 3.1 1.5 0.2 setosa 0.25
5 5.0 3.6 1.4 0.2 setosa 0.25
6 5.4 3.9 1.7 0.4 setosa 0.5
x <- c(3, 12, 2, 2, 7, 3, 5, 2, 3)
(1) 最小值 2 为 0%,
那么您需要从向量中删除最小值。
(2) 最大值 12 是 99% 百分位数,
那么你需要添加一个比最大值更大的值,并用最大值填充你的向量,以便向量长度为 100。
x1 <- c(x[x > min(x)], Inf)
x2 <- c(x1, rep(max(x), 100 - length(x1)))
ecdf(x2)(x)
> ecdf(x2)(x)
[1] 0.03 0.99 0.00 0.00 0.05 0.03 0.04 0.00 0.03
我有代理商的数据框及其相应的产品销售数量
Gent_Code number_policies
A096 3
A0828 12
A0843 2
A0141 2
B079 7
B05 3
M012 5
P010 2
S039 3
我想计算每个值 (xi) 所在的百分位数,使得数据中 p% 的值低于 xi。 百分位数的最小值为 0,最大值非常接近 1 但不是 1。
我已经完成了以下操作:
ag_df <- mutate(ag_df, pon_percentiles = ecdf(ag_df$pon)(ag_df$pon))
summary(ag_df$pon_percentiles )
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.4805 0.4805 0.6417 0.6356 0.7738 1.0000
但是,我希望百分位数公式计算的值低于某个值,而不是低于或等于该值。
因此,向量中最小值的百分位数应为 0,最大值应接近 1 但不完全为 1。
Current output:
0.6666667 1.0000000 0.3333333 0.3333333 0.8888889 0.6666667 0.7777778 0.3333333 0.6666667
如果我们看到上面的输出,对于 number_policies (2) 的最小值为 0.3333 ,但我希望它为 0。 对于最大值 12,它不应该是 1,而是 0.99。
我如何在 R 中执行此操作? 我在 ecdf、cume_distr 等基本函数中搜索了相关参数,但没有找到任何参数。 有人可以帮我解决这个问题吗?
您只需使用分位数函数即可:
quantile(df, probs = c(0, 0.24, 0.49, 0.74, 0.99))
希望对您有所帮助!!!
使用 percent_rank()
函数的一个解决方案是:
pkgs <- c("tidyverse", "stringi")
invisible(lapply(pkgs, require, character.only = TRUE))
set.seed(2)
n <- 30
db <- tibble(gent_code = paste0(stri_rand_strings(n, 1, '[A-Z]'),
stri_rand_strings(n, 4, '[0-9]')),
nr_pol = sample(1L:100L, n, TRUE))
db %>%
mutate(percentile = percent_rank(nr_pol)) %>%
print(n = n)
给出输出:
gent_code nr_pol percentile
<chr> <int> <dbl>
1 E0188 35 0.241
2 S5682 91 0.862
3 O6192 96 0.931
4 E1197 97 1.000
5 Y9358 39 0.345
6 Y0069 63 0.552
7 D2879 14 0.138
8 V6778 25 0.172
9 M6284 75 0.759
10 O3420 69 0.690
11 O2301 35 0.241
12 G1728 3 0.0345
13 T4536 38 0.310
14 E0418 1 0
15 K9373 44 0.414
16 W9335 66 0.621
17 Z4140 58 0.448
18 F1424 62 0.517
19 L9825 96 0.931
20 B8411 59 0.483
21 R0735 41 0.379
22 K8881 81 0.793
23 V9502 87 0.828
24 D9827 5 0.0690
25 J5363 8 0.103
26 M2909 68 0.655
27 D3658 94 0.897
28 J1312 34 0.207
29 Z6347 63 0.552
30 D6342 72 0.724
如您所见,它从 0 开始,但最高百分位数将等于 1,因为它反映了数据中最多的策略。
编辑: 在这种情况下强制 12 等于例如第 99 个百分位数意味着数据中的数据点高于 12。它将等于 1,因为您的所有数据点都小于或等于该值。
我想这是你想要的,但我不确定,你只需要按照你想要的方式设置 labels
和 probs
。
iris2 <- iris
iris2$quartile_number <- cut(iris$Sepal.Length,
quantile(iris$Sepal.Length) ,
include.lowest=T,
labels=c(.25, .5, .75, 1))
head(iris2)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species quartile_number
1 5.1 3.5 1.4 0.2 setosa 0.25
2 4.9 3.0 1.4 0.2 setosa 0.25
3 4.7 3.2 1.3 0.2 setosa 0.25
4 4.6 3.1 1.5 0.2 setosa 0.25
5 5.0 3.6 1.4 0.2 setosa 0.25
6 5.4 3.9 1.7 0.4 setosa 0.5
x <- c(3, 12, 2, 2, 7, 3, 5, 2, 3)
(1) 最小值 2 为 0%, 那么您需要从向量中删除最小值。 (2) 最大值 12 是 99% 百分位数, 那么你需要添加一个比最大值更大的值,并用最大值填充你的向量,以便向量长度为 100。
x1 <- c(x[x > min(x)], Inf)
x2 <- c(x1, rep(max(x), 100 - length(x1)))
ecdf(x2)(x)
> ecdf(x2)(x)
[1] 0.03 0.99 0.00 0.00 0.05 0.03 0.04 0.00 0.03