百分位数分组表[重复]

Posted

技术标签:

【中文标题】百分位数分组表[重复]【英文标题】:Grouped table of percentiles [duplicate] 【发布时间】:2020-05-11 23:31:24 【问题描述】:

我需要计算哪个值代表组内的 5%、34%、50%、67% 和 95%(在单独的列中)。预期的输出是

    5%   34%  50%  67% 95%
A   4     6    8    12  30
B   1     2    3    4    10

每个组的整数值。

下面的代码显示了我到目前为止的内容(但使用生成的数据):

library(dplyr)
library(tidyr)
data.frame(group=sample(LETTERS[1:5],100,TRUE),values=rnorm(100)) %>%
      group_by(group) %>%
      mutate(perc_int=findInterval(values, 
                    quantile(values, probs=c(0.05,0.34,0.5,0.67,0.95)))) %>%
      pivot_wider(names_from = perc_int,values_from = values)

使用这个例子我得到了六列,我不知道为什么。

此外,列填充的是向量而不是单个值。如何在值向量中只获得一个表示百分位数的值?

【问题讨论】:

【参考方案1】:

您可以在列表中获取quantile 数据,然后使用unnest_wider 拥有单独的列。

library(dplyr)
set.seed(123)

data.frame(group=sample(LETTERS[1:5],100,TRUE),values=rnorm(100)) %>%
   group_by(group) %>%
   summarise(perc_int= list(quantile(values, probs=c(0.05,0.34,0.5,0.67,0.95)))) %>%
   tidyr::unnest_wider(perc_int)

# A tibble: 5 x 6
#  group   `5%`  `34%`   `50%` `67%` `95%`
#  <fct>  <dbl>  <dbl>   <dbl> <dbl> <dbl>
#1  A     -2.40  -0.580 -0.0887 0.371  1.38
#2  B     -1.83  -0.200  0.0848 0.546  1.78
#3  C     -0.947 -0.148  0.184  0.789  1.81
#4  D     -0.992 -0.275 -0.0193 0.274  1.82
#5  E     -1.65  -0.457 -0.0422 0.540  1.66

【讨论】:

太棒了。正是我需要的。【参考方案2】:

以下应该有效。

library(dplyr)
data.frame(group=sample(LETTERS[1:5],100,TRUE),values=rnorm(100)) %>%
      group_by(group) %>% summarise(`5 %` = quantile(values,0.05),
                                    `34 %` = quantile(values,0.34), 
                                    `50 %` = quantile(values,0.5), 
                                    `67 %` = quantile(values,0.67), 
                                    `95 %` = quantile(values,0.95))

【讨论】:

是的,这可行,但下面的解决方案更优雅。

以上是关于百分位数分组表[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Python数据分析pandas之分组统计透视表

使用 SparkR 分组百分位数

大熊猫是否表现出错误的百分位数?

如何计算列的每个值所在的百分位数? (Spark SQL)[重复]

JavaScript中的分位数/百分点/百分位数/逆累积分布函数

Pandas .. 分位数函数是不是需要排序数据来计算百分位数?