gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 18:45:32 24 4
gpt4 key购买 nike

我希望能够使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com