如何使用dplyr在不同分组上应用相同的函数?

如何使用dplyr在不同分组上应用相同的函数?,r,dplyr,R,Dplyr,我有一个数据帧、一个聚合函数和k=2个分组变量 如何在同一数据帧上应用相同的聚合函数,并按一个变量、另一个变量、两个变量和两个变量进行分组 换句话说,实现以下内容的惯用方法是什么?(k可能太大,无法手动执行此操作。) 库(tidyverse) 绑定行( mtcars%>% 总结(平均值(mpg)), mtcars%>% 组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别 总结(平均值(mpg)), mtcars%>% 分组

我有一个数据帧、一个聚合函数和k=2个分组变量

如何在同一数据帧上应用相同的聚合函数,并按一个变量、另一个变量、两个变量和两个变量进行分组

换句话说,实现以下内容的惯用方法是什么?(k可能太大,无法手动执行此操作。)

库(tidyverse)
绑定行(
mtcars%>%
总结(平均值(mpg)),
mtcars%>%
组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别
总结(平均值(mpg)),
mtcars%>%
分组依据(档位)%>%
总结(平均值(mpg)),
mtcars%>%
组别(气缸,档位)%>%
总结(平均值(mpg))
) %>%
替换_na(列表(cyl='Any',
档位=‘任意’)
#>平均(mpg)气缸齿轮
#>120.09062任何
#>2 26.66364任何
#>319.74286 6任何
#>4 15.10000 8任何
#>5 16.10667任何3
#>6 24.53333任何4
#>7 21.38000任何5
#> 8   21.50000   4    3
#> 9   26.92500   4    4
#> 10  28.20000   4    5
#> 11  19.75000   6    3
#> 12  19.75000   6    4
#> 13  19.70000   6    5
#> 14  15.05000   8    3
#> 15  15.40000   8    5

由(v0.3.0)于2019-11-19创建,这里有一种方法可以获得
k

library(dplyr)
k <- c('cyl', 'gear', 'am')

c(mtcars %>% summarise(mean(mpg)), 
      purrr::map(seq_along(k), ~combn(k, .x, function(y) 
       mtcars %>% group_by_at(y) %>% summarise(mean(mpg)), simplify = FALSE))) 


#$`mean(mpg)`
#[1] 20.09

#[[2]]
#[[2]][[1]]
# A tibble: 3 x 2
#    cyl `mean(mpg)`
#  <dbl>       <dbl>
#1     4        26.7
#2     6        19.7
#3     8        15.1

#[[2]][[2]]
# A tibble: 3 x 2
#  gear `mean(mpg)`
#  <dbl>       <dbl>
#1     3        16.1
#2     4        24.5
#3     5        21.4

#[[2]][[3]]
# A tibble: 2 x 2
#     am `mean(mpg)`
#  <dbl>       <dbl>
#1     0        17.1
#2     1        24.4

#[[3]]
#[[3]][[1]]
# A tibble: 8 x 3
# Groups:   cyl [3]
#    cyl  gear `mean(mpg)`
#  <dbl> <dbl>       <dbl>
#1     4     3        21.5
#2     4     4        26.9
#3     4     5        28.2
#4     6     3        19.8
#5     6     4        19.8
#6     6     5        19.7
#7     8     3        15.0
#8     8     5        15.4
#.....
#.....
库(dplyr)
k%汇总(平均值(mpg)),
purrr::映射(沿(k)方向的序列)~combn(k,.x,函数(y)
mtcars%>%按(y)的百分比进行分组%>%总结(平均值(mpg)),简化=假)
#$`平均值(每加仑)`
#[1] 20.09
#[[2]]
#[[2]][[1]]
#一个tibble:3x2
#气缸平均值(mpg)`
#         
#1     4        26.7
#2     6        19.7
#3     8        15.1
#[[2]][[2]]
#一个tibble:3x2
#档位平均值(mpg)`
#         
#1     3        16.1
#2     4        24.5
#3     5        21.4
#[[2]][[3]]
#一个tibble:2x2
#平均值(mpg)`
#         
#1     0        17.1
#2     1        24.4
#[[3]]
#[[3]][[1]]
#一个tibble:8x3
#组别:共青团[3]
#气缸档位平均值(mpg)`
#          
#1     4     3        21.5
#2     4     4        26.9
#3     4     5        28.2
#4     6     3        19.8
#5     6     4        19.8
#6     6     5        19.7
#7     8     3        15.0
#8     8     5        15.4
#.....
#.....

第一部分
mtcars%>%总结(平均值(mpg))
mean
而没有任何分组,而其余部分则以不同长度的所有可能组合进行分组

这是一个data.table解决方案。我知道这不完全是您所要求的,但是data.table具有用于这种类型操作的函数,使用dplyr处理较大数据的所有排列可能会变得非常慢

在下面的代码中,
NA
列中的
by
值表示包含该列的所有值。例如,第9行是所有
气缸==6
的车辆的平均每加仑,档位无条件。如果事先在分组列中缺少值,我建议插入一个占位符值

此操作基于分组集,这是从SQL中借用的思想。data.table有3个函数--
cube()
rollup()
groupingsets()
,它们实现了此操作的不同风格。有关更多信息,请参见说明

库(data.table)
mtcars\u复制气缸档位平均值\u mpg
#>  1:   6    4 19.75000
#>  2:   4    4 26.92500
#>  3:   6    3 19.75000
#>  4:   8    3 15.05000
#>  5:   4    3 21.50000
#>  6:   4    5 28.20000
#>  7:   8    5 15.40000
#>  8:   6    5 19.70000
#>9:6 NA 19.74286
#>10:4 NA 26.66364
#>11:8 NA 15.10000
#>12:NA 4 24.53333
#>13:NA 3 16.10667
#>14:NA 521.38000
#>15:NA NA 20.09062

如果k=4,那么分组将应用于一次取1,2,3,4的所有组合?得到完整的幂集将是很好的,因此通过{1,2,3,4}、{1,2,3}、{1,2,4}、{1,3,4}、{1,3,4}、{2,3,4}、{1,3}、{1,4}、{1,3}、{1,4}、{2,3}、{4}、{3,4}、{4}、{2,4}、{4}、{3,4}、{。一旦我有了电源,我总是可以过滤我想要的组合。