我有一个可行的解决方案,但我正在寻找一个更干净、更可读的解决方案,它可能会利用一些较新的dplyr窗口函数.

使用mtcars数据集,如果我想查看第25、50、75百分位,以及每加仑英里数("mpg")的平均值和计数(按气缸数("cyl"),我使用以下代码:

library(dplyr)
library(tidyr)

# load data
data("mtcars")

# Percentiles used in calculation
p <- c(.25,.5,.75)

# old dplyr solution 
mtcars %>% group_by(cyl) %>% 
  do(data.frame(p=p, stats=quantile(.$mpg, probs=p), 
                n = length(.$mpg), avg = mean(.$mpg))) %>%
  spread(p, stats) %>%
  select(1, 4:6, 3, 2)

# note: the select and spread statements are just to get the data into
#       the format in which I'd like to see it, but are not critical

有没有一种方法可以让dplyr使用一些摘要函数(n_tiles、percent_rank等)更清晰地实现这一点?我所说的干净,是指没有"做"的陈述.

非常感谢.

推荐答案

dplyr 1.0中,summarise可以返回多个值,允许以下操作:

library(tidyverse)

mtcars %>% 
  group_by(cyl) %>%  
  summarise(quantile = scales::percent(c(0.25, 0.5, 0.75)),
            mpg = quantile(mpg, c(0.25, 0.5, 0.75)))

或者,您可以通过使用enframe避免使用单独的行来命名分位数:

mtcars %>% 
  group_by(cyl) %>%  
  summarise(enframe(quantile(mpg, c(0.25, 0.5, 0.75)), "quantile", "mpg"))
    cyl quantile   mpg
  <dbl> <chr>    <dbl>
1     4 25%       22.8
2     4 50%       26  
3     4 75%       30.4
4     6 25%       18.6
5     6 50%       19.7
6     6 75%       21  
7     8 25%       14.4
8     8 50%       15.2
9     8 75%       16.2

Answer for previous versions of 100

library(tidyverse)

mtcars %>% 
  group_by(cyl) %>% 
  summarise(x=list(enframe(quantile(mpg, probs=c(0.25,0.5,0.75)), "quantiles", "mpg"))) %>% 
  unnest(x)
    cyl quantiles   mpg
1     4       25% 22.80
2     4       50% 26.00
3     4       75% 30.40
4     6       25% 18.65
5     6       50% 19.70
6     6       75% 21.00
7     8       25% 14.40
8     8       50% 15.20
9     8       75% 16.25

可以使用tidyeval将其转换为更通用的函数:

q_by_group = function(data, value.col, ..., probs=seq(0,1,0.25)) {

  groups=enquos(...)
  
  data %>% 
    group_by(!!!groups) %>% 
    summarise(x = list(enframe(quantile({{value.col}}, probs=probs), "quantiles", "mpg"))) %>% 
    unnest(x)
}

q_by_group(mtcars, mpg)
q_by_group(mtcars, mpg, cyl)
q_by_group(mtcars, mpg, cyl, vs, probs=c(0.5,0.75))
q_by_group(iris, Petal.Width, Species)

R相关问答推荐

R:如何在没有for循环的情况下替换多边形几何中的值?

如何计算具有NA的行的更改百分比

创建计数(带重置)变量

用单个表达匹配多个替代模式

R的GG平行坐标图中的排序变量

无法将传奇添加到cowplot多情节中

在发布到PowerBI Service时,是否可以使用R脚本作为PowerBI的数据源?

为什么横向页面会导致officeverse中的页码/节头/页脚出现问题?

如何在格子中添加双曲曲线

如何改变时间图R中的悬停信息?

标识R中多个列中缺少的唯一值

如何调整曲线图中的y轴标签?

在多页PDF中以特定布局排列的绘图列表不起作用

派生程序包| ;无法检索';return()';的正文

R如何将列名转换为更好的年和月格式

WRS2包中带有bwtrim的简单ANOVA抛出错误

如何在PrePlot()中将多个元素设置为斜体

仅当后续值与特定值匹配时,才在列中回填Nas

以不同于绘图中元素的方式对GG图图例进行排序

如何获取R chromote中的当前URL?