r - dplyr group_by - 混合带或不带引号的变量名称

标签 r dplyr

我希望能够使用 dplyr 的 group_by 按多列进行分组,足够简单。但是,复杂的是我想创建一个函数,其中一个或多个列始终位于分组依据中,并且用户可以选择附加列进行分组。到目前为止,我所尝试的涉及使用始终位于组中的列的非字符串规范,以及对用户选择的列使用字符串,但我尝试过的任何方法都不起作用。这种组合似乎在 SELECT 中工作得很好,但在 GROUP_BY 中则不然。理想情况下,我不想切换到所有字符串,因为我希望能够利用 dplyr 的一些功能来选择一系列列。下面是一个例子。

举一个简单的例子,我从 iris 数据集开始,添加了几列,它们的确切含义并不重要。

test_tbl <- iris %>%
  mutate(extra_var1 = ifelse(Sepal.Length >= 5.0, "Yes", "No"),
         extra_var2 = "What")

这是一个对所有变量使用非字符串规范的示例,效果很好:

test_tbl %>%
  select(Species, extra_var1, Sepal.Length, Petal.Width) %>%
  group_by(Species, extra_var1) %>%
  summarize(average.Sepal.Length = mean(Sepal.Length),
            average.Petal.Width = mean(Petal.Width))

但是,我希望能够在函数内让用户指定是否要按 extra_var1 或 extra_var2 进行分组。这是我的尝试,但行不通。再说一遍,我相信 select 部分工作正常,但 group_by 部分却不行。

group_and_summarize <- function(var) {
  test_tbl %>%
    select(Species, var, Sepal.Length, Petal.Width) %>%
    group_by(Species, var) %>%
    summarize(average.Sepal.Length = mean(Sepal.Length),
              average.Petal.Width = mean(Petal.Width))
}

group_and_summarize("extra_var1")

最佳答案

这是一种方法:

library(dplyr)

group_and_summarize <- function(var) {
  test_tbl %>%
    select(Species, {{var}}, Sepal.Length, Petal.Width) %>%
    group_by(Species, {{var}}) %>%
    summarize(average.Sepal.Length = mean(Sepal.Length),
              average.Petal.Width = mean(Petal.Width))
}

group_and_summarize(extra_var1)
#> `summarise()` regrouping output by 'Species' (override with `.groups` argument)
#> # A tibble: 6 x 4
#> # Groups:   Species [3]
#>   Species    extra_var1 average.Sepal.Length average.Petal.Width
#>   <fct>      <chr>                     <dbl>               <dbl>
#> 1 setosa     No                         4.67               0.195
#> 2 setosa     Yes                        5.23               0.28 
#> 3 versicolor No                         4.9                1    
#> 4 versicolor Yes                        5.96               1.33 
#> 5 virginica  No                         4.9                1.7  
#> 6 virginica  Yes                        6.62               2.03

reprex package 于 2021 年 5 月 11 日创建(v0.3.0)

如果你想让用户输入字符串那么我们可以使用!!! syms():

group_and_summarize <- function(vars) {
  test_tbl %>%
    select(Species, !!! syms(vars), Sepal.Length, Petal.Width) %>%
    group_by(Species, !!! syms(vars)) %>%
    summarize(average.Sepal.Length = mean(Sepal.Length),
              average.Petal.Width = mean(Petal.Width))
}

group_and_summarize(c("extra_var1", "extra_var2"))

#> `summarise()` regrouping output by 'Species', 'extra_var1' (override with `.groups` argument)
#> # A tibble: 6 x 5
#> # Groups:   Species, extra_var1 [6]
#>   Species    extra_var1 extra_var2 average.Sepal.Length average.Petal.Width
#>   <fct>      <chr>      <chr>                     <dbl>               <dbl>
#> 1 setosa     No         What                       4.67               0.195
#> 2 setosa     Yes        What                       5.23               0.28 
#> 3 versicolor No         What                       4.9                1    
#> 4 versicolor Yes        What                       5.96               1.33 
#> 5 virginica  No         What                       4.9                1.7  
#> 6 virginica  Yes        What                       6.62               2.03

reprex package 于 2021 年 5 月 11 日创建(v0.3.0)

关于r - dplyr group_by - 混合带或不带引号的变量名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67488844/

相关文章:

r - 如何使用 R 删除遵循特定模式但不包括另一个模式的字符串部分?

r - 已知在 windows xp 上运行的最新版本的 R 是什么?

r - Dplyr Mutate_each 用于成对的列集

r - 将多个列合并为一个具有 R 中特定条件的列

r - 用 R 对表格进行排序

python - rpy2 无法加载外部库

R如何安装指定版本的bioconductor包?

r - 给定名称范围对的向量化子集

r - 如何将列值与定界符以及定界符的异常(exception)结合起来?

r - 如何最好地重命名 R 中的列值