如何在dplyr中找到分组变量的分位数

时间:2017-09-12 13:08:33

标签: r dplyr

我在r

中有以下数据框
No.        Key             Category
1          ABC123           0R1D
2          ABC567           0R1D
3          DEF444           1R1D
4          FRT433           1R1D
5          FRT433           1R1D
6          TYU412           2R2D
7          BEC123           0R1D
8          BCY567           0R1D
9          DEO444           1R1D
10         FRJ433           1R1D
11         FRK433           1R1D
12         TYL412           2R2D

我希望在所有类别和4个相同的分位数中找到唯一键。 我在R

做跟进
truck_quartile <- df %>% 
   group_by(Category) %>% 
   summarise(No_of_trailers = n_distinct(key)) %>% 
   do(data.frame(t(quantile(.$No_of_trailers, probs = c(0.25, 0.50, 0.75, 1))))) %>% 
   as.data.frame()

但它只给我一行,因为我在分位数之前总结它。

1 个答案:

答案 0 :(得分:1)

正如评论中所提到的,您将只获得一个分位数矢量,其中“独特的车辆数量属于不同的类别”,如预期的那样。以下是您想要计算每个独特车辆在每个类别中出现的次数的分位数的情况。

library(dplyr)

truck_quartile <- df %>% 
  group_by(Category, Key) %>%
  summarize(No_of_trailers = n()) %>%
  group_by(Category) %>%
  do(data.frame(t(quantile(.$No_of_trailers, probs = c(0.25, 0.50, 0.75, 1))))) %>% 
  as.data.frame() %>%
  setNames(c("Category", "25%", "50%", "75%", "100%"))

原始df的结果:

  Category 25% 50% 75% 100%
1     0R1D   1   1   1    1
2     1R1D   1   1   1    2
3     2R2D   1   1   1    1

您原来的df有点不幸,因为它只有一辆车在同一类别中有重复项。因此,我通过替换df_long来创建df

结果df_long

  Category 25% 50% 75% 100%
1     0R1D   1   3   4    5
2     1R1D   3   4   6   11
3     2R2D   1   2   2    4

注意:仅使用数字和特殊符号命名变量可能不是一个好主意,但如果您只想要一个好看的表而没有实际使用这些列进行进一步计算,那就没问题了。

数据:

library(data.table)

df = fread("No.        Key             Category
           1          ABC123           0R1D
           2          ABC567           0R1D
           3          DEF444           1R1D
           4          FRT433           1R1D
           5          FRT433           1R1D
           6          TYU412           2R2D
           7          BEC123           0R1D
           8          BCY567           0R1D
           9          DEO444           1R1D
           10         FRJ433           1R1D
           11         FRK433           1R1D
           12         TYL412           2R2D")

set.seed(123)
df_long = data.frame(Key = sample(df$Key, 100, replace = TRUE),
                     Category = sample(df$Category, 100, replace = TRUE))