使用 dplyr group_by 时将汇总条件应用于一系列列?

use*_*745 4 group-by r dplyr

假设我们想group_by()summarise一个巨大的data.frame非常多列,但也有一些大集团连续列中,将具有相同的summarise条件下(如maxmean等)

有没有办法避免summarise为每一列指定条件,而是为列范围指定条件?

例子

假设我们想要这样做:

iris %>% 
  group_by(Species) %>% 
  summarise(max(Sepal.Length), mean(Sepal.Width), mean(Petal.Length), mean(Petal.Width))
Run Code Online (Sandbox Code Playgroud)

但请注意,连续 3 列具有相同的summarise条件,mean(Sepal.Width), mean(Petal.Length), mean(Petal.Width)

有没有办法使用某种方法,例如mean(Sepal.Width:Petal.Width)指定列范围的条件,从而避免必须为中间的所有列多次输入汇总条件)

笔记

上面的 iris 示例是一个小型且易于管理的示例,其范围为 3 个连续列,但实际用例有数百个。

Tun*_*ung 5

即将推出的版本1.0.0dplyr将有across()功能,做你希望的东西

基本用法

across() 有两个主要参数:

  • 第一个参数.cols选择要操作的列。它使用整洁的选择(如select()),因此您可以按位置、名称和类型选择变量。

  • 第二个参数.fns是要应用于每一列的函数或函数列表。这也可以是 purrr 样式的公式(或公式列表),例如~ .x / 2. (此参数是可选的,如果您只想获取基础数据,则可以省略它;您将在 中看到该技术 vignette("rowwise")。)

### Install development version on GitHub first
# install.packages("devtools")
# devtools::install_github("tidyverse/dplyr")
library(dplyr, warn.conflicts = FALSE)
Run Code Online (Sandbox Code Playgroud)

使用.names采用胶水规范的参数控制如何创建名称:

iris %>% 
  group_by(Species) %>% 
  summarise(
    across(c(Sepal.Width:Petal.Width), ~ mean(.x, na.rm = TRUE), .names = "mean_{col}"),
    across(c(Sepal.Length), ~ max(.x, na.rm = TRUE), .names = "max_{col}")
    )
#> # A tibble: 3 x 5
#>   Species    mean_Sepal.Width mean_Petal.Leng~ mean_Petal.Width max_Sepal.Length
#> * <fct>                 <dbl>            <dbl>            <dbl>            <dbl>
#> 1 setosa                 3.43             1.46            0.246              5.8
#> 2 versicolor             2.77             4.26            1.33               7  
#> 3 virginica              2.97             5.55            2.03               7.9
Run Code Online (Sandbox Code Playgroud)

使用多种功能

my_func <- list(
  mean = ~ mean(., na.rm = TRUE),
  max  = ~ max(., na.rm = TRUE)
)

iris %>%
  group_by(Species) %>%
  summarise(across(is.numeric, my_func, .names = "{fn}.{col}"))
#> # A tibble: 3 x 9
#>   Species    mean.Sepal.Length max.Sepal.Length mean.Sepal.Width max.Sepal.Width
#> * <fct>                  <dbl>            <dbl>            <dbl>           <dbl>
#> 1 setosa                  5.01              5.8             3.43             4.4
#> 2 versicolor              5.94              7               2.77             3.4
#> 3 virginica               6.59              7.9             2.97             3.8
#>   mean.Petal.Length max.Petal.Length mean.Petal.Width max.Petal.Width
#> *             <dbl>            <dbl>            <dbl>           <dbl>
#> 1              1.46              1.9            0.246             0.6
#> 2              4.26              5.1            1.33              1.8
#> 3              5.55              6.9            2.03              2.5
Run Code Online (Sandbox Code Playgroud)

reprex 包(v0.3.0)于 2020 年 3 月 6 日创建