dplyr group by on multiple columns

Nei*_*eil 19 group-by r shiny dplyr

我正在与R shine合作进行一些探索性数据分析.我有两个复选框输入,在一个复选框中我填充所有分类变量,其他都是数字变量.然后我在这两个选项上应用groupby如下.

var1 <- input$variable1      # Checkbox with categorical variables
var2 <- input$variable2      # Checkbox with numerical variables

v$data <- dataset %>%
  group_by_(var1) %>%
  summarize_(Sum = interp(~sum(x), x = as.name(var2))) %>%
  arrange(desc(Sum))
Run Code Online (Sandbox Code Playgroud)

当只有1列的groupby时,哪种工作完全正常,但我想在多列上进行分组.当用户选择多个分类变量时,它会返回一个包含列名的数组.如何在dplyr groupby中传递此信息.

MrF*_*ick 37

如果你有一个变量名的向量,你应该将它们传递给.dots=参数group_by_.例如:

mtcars %>% 
   group_by_(.dots=c("mpg","hp","wt")) %>% 
   summarize(x=mean(gear))
Run Code Online (Sandbox Code Playgroud)

  • 应该注意的是,`group_by_()` 函数已被软弃用,最终将从 `dplyr` 包中删除。 (5认同)
  • 这也使用`group_by`. (4认同)

Mic*_*l M 11

有了dplyr 1.0.0,我们有以下基于“正常”的可能性group_by

library(dplyr)

group_cols <- c("vs", "am")

mtcars %>% 
  group_by(across(all_of(group_cols))) %>% 
  summarize(mean_wt = mean(wt))
Run Code Online (Sandbox Code Playgroud)


bsc*_*idr 10

您可以使用rlangpackage 中的 helpers ,它是由创建dplyr. 使用dplyr和 其他 tidyverse 包时,您不必加载rlang包即可使用这些帮助程序。

具体来说,您可以像这样使用syms函数和!!!函数:

library(dplyr)

group_cols <- c("vs", "am")

mtcars %>% 
  group_by(!!!syms(group_cols)) %>% 
  summarize(mean_wt = mean(wt))
Run Code Online (Sandbox Code Playgroud)

这个密切相关的问题和答案解释了如何将!!运算符和sym函数用于单个列名(即长度为一的字符向量)。


bsc*_*idr 5

dplyr软件包的最新版本包括 的变体group_by,例如group_by_ifgroup_by_at。您可以使用这些来使用与select函数类似的语法来执行列选择。

就像您可以使用 选择列列表一样select(my_data, one_of(group_cols)),您可以使用它group_by_at来执行以下操作:

library(dplyr)

group_cols <- c("vs", "am")

mtcars %>% 
  group_by_at(.vars = vars(one_of(group_cols))) %>% 
  summarize(mean_wt = mean(wt))
Run Code Online (Sandbox Code Playgroud)

  • 因为这些答案是根本不同的方法。如果用户发现一种方法比另一种方法更有帮助,投票过程将清楚地表明这一点。有两篇文章对读者来说没有什么坏处,我很高兴分别对这两篇文章进行评论和编辑。请参阅[有关 `meta.stackexchange` 的相关帖子](https://meta.stackexchange.com/a/25210),建议在此类情况下使用多个答案。 (2认同)