假设我们想group_by()和summarise一个巨大的data.frame非常多列,但也有一些大集团连续列中,将具有相同的summarise条件下(如max,mean等)
有没有办法避免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 个连续列,但实际用例有数百个。
即将推出的版本1.0.0的dplyr将有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 日创建