【问题标题】:How to use quantile function with dplyr summarize_at如何在 dplyr summarise_at 中使用分位数函数
【发布时间】:2020-03-28 16:11:43
【问题描述】:

我正在尝试计算按数据集 iris 的种类分组的所有计量变量的 25、50 和 75 个百分位数,因此使用 dplyr::summarize_at 函数可以只执行一次。我使用以下代码,但总是出错:

iris %>%
  group_by(Species) %>% 
  summarize_at(dplyr::vars(c("Sepal.Length","Sepal.Width","Petal.Length","Petal.Width")),
               .funs=c("25%"=quantile(0.25),
                       "50%"=quantile(0.50),
                       "75%"=quantile(0.75)))

这是我得到的错误:“错误:需要一个单边公式、函数或函数名称。”

感谢您的帮助。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我可以为您推荐一个data.table 解决方案。不幸的是,我没有想到dplyr 解决方案。

    dt <- data.table::as.data.table(iris)
    
    dt <- dt[,lapply(.SD, quantile, probs = c(.25,.5,.75)),
       .SDcols = c("Sepal.Length","Sepal.Width","Petal.Length","Petal.Width"),
       by = "Species"]
    
    dt[,'quantile' := c("25%","50%","75%")]
    
    # Sepal.Length Sepal.Width Petal.Length Petal.Width # Species Sepal.Length Sepal.Width Petal.Length Petal.Width quantile
    # 1:     setosa        4.800       3.200        1.400         0.2      25%
    # 2:     setosa        5.000       3.400        1.500         0.2      50%
    # 3:     setosa        5.200       3.675        1.575         0.3      75%
    # 4: versicolor        5.600       2.525        4.000         1.2      25%
    # 5: versicolor        5.900       2.800        4.350         1.3      50%
    # 6: versicolor        6.300       3.000        4.600         1.5      75%
    # 7:  virginica        6.225       2.800        5.100         1.8      25%
    # 8:  virginica        6.500       3.000        5.550         2.0      50%
    # 9:  virginica        6.900       3.175        5.875         2.3      75%
    

    希望有帮助!

    【讨论】:

      【解决方案2】:

      使用dplyr(0.8.9) 的开发者版本,我们可以使用summariseacross。一个缺点是不会返回分位数的名称,尽管我们可以知道,因为我们按照我们想要的顺序进行操作:

      iris %>%
        group_by(Species) %>% 
         summarise(across(is.numeric,~c(`25%`=quantile(.x,0.25), `50%`=
                                             quantile(.x,0.5),
                                           `75%`= quantile(.x,0.75))))
      

      以上等价于:

       iris %>%
         group_by(Species) %>% 
         summarise_if(is.numeric,~c(`25%`=quantile(.x,0.25), `50%`=
                                             quantile(.x,0.5),
                                           `75%`= quantile(.x,0.75)))
      

      结果:

      # A tibble: 9 x 5
        Species    Sepal.Length Sepal.Width Petal.Length Petal.Width
        <fct>             <dbl>       <dbl>        <dbl>       <dbl>
      1 setosa             4.8         3.2          1.4          0.2
      2 setosa             5           3.4          1.5          0.2
      3 setosa             5.2         3.68         1.58         0.3
      4 versicolor         5.6         2.52         4            1.2
      5 versicolor         5.9         2.8          4.35         1.3
      6 versicolor         6.3         3            4.6          1.5
      7 virginica          6.22        2.8          5.1          1.8
      8 virginica          6.5         3            5.55         2  
      9 virginica          6.9         3.18         5.88         2.3
      

      可以添加分位数的名称。但是请注意,dplyrtidyverse 不会回收向量,这意味着我们必须对其进行硬编码:

      iris %>%
        group_by(Species) %>% 
         summarise_if(is.numeric,~c(`25%`=quantile(.x,0.25), `50%`=
                                             quantile(.x,0.5),
                                           `75%`= quantile(.x,0.75))) %>% 
         mutate(quant= rep(c("25%","50%","75%"),nrow(.) / 3))
      

      您还可以保存summarise 结果(res 此处)并求助于 base 进行回收:res$quant &lt;- c("25%","50%","75%")

      # A tibble: 9 x 6
        Species    Sepal.Length Sepal.Width Petal.Length Petal.Width quant
        <fct>             <dbl>       <dbl>        <dbl>       <dbl> <chr>
      1 setosa             4.8         3.2          1.4          0.2 25%  
      2 setosa             5           3.4          1.5          0.2 50%  
      3 setosa             5.2         3.68         1.58         0.3 75%  
      4 versicolor         5.6         2.52         4            1.2 25%  
      5 versicolor         5.9         2.8          4.35         1.3 50%  
      6 versicolor         6.3         3            4.6          1.5 75%  
      7 virginica          6.22        2.8          5.1          1.8 25%  
      8 virginica          6.5         3            5.55         2   50%  
      9 virginica          6.9         3.18         5.88         2.3 75% 
      

      【讨论】:

        猜你喜欢
        • 2020-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-12
        • 2018-11-02
        • 1970-01-01
        相关资源
        最近更新 更多