dplyr-使用变量名对多个列进行分组

dplyr-使用变量名对多个列进行分组,r,group-by,shiny,dplyr,R,Group By,Shiny,Dplyr,我正在与R Shinny合作进行一些探索性的数据分析。我有两个复选框输入,只包含用户选择的选项。第一个复选框输入仅包含分类变量;第二个复选框仅包含数值变量。接下来,我对这两个选项应用groupby: var1 <- input$variable1 # Checkbox with categorical variables var2 <- input$variable2 # Checkbox with numerical variables v$data <

我正在与R Shinny合作进行一些探索性的数据分析。我有两个复选框输入,只包含用户选择的选项。第一个复选框输入仅包含分类变量;第二个复选框仅包含数值变量。接下来,我对这两个选项应用
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))
var1%
安排(说明(总和))
当仅选择一个分类变量时,此
groupby
工作正常。当选择多个分类变量时,此
groupby
返回一个具有列名的数组。如何将此列名数组传递给
dplyr
groupby

dplyr版本>1.0 对于较新版本的
dplyr
,您应该在
中使用
以及tidyselect helper函数。有关所有帮助程序函数的列表,请参见
帮助(“语言”,“tidyselect”)
。在这种情况下,如果希望字符向量中的所有列,请使用
all\u of()


您可以使用
rlang
包中的帮助程序,该包由创建
dplyr
的团队创建。使用
dplyr
和其他tidyverse软件包时,不必加载
rlang
软件包即可使用这些帮助程序

具体来说,您可以使用
syms
功能和
功能如下:

library(dplyr)

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

mtcars %>% 
  group_by(!!!syms(group_cols)) %>% 
  summarize(mean_wt = mean(wt))
库(dplyr)
集团成本%
分组人(!!!符号(分组))%>%
汇总(平均值=平均值)

这说明了
是如何
运算符和
sym
函数用于单个列名(即长度为一个字符的向量)。

最新版本的
dplyr
包包括
groupby
的变体,例如
groupby\u if
groupby\u at
。您可以使用这些选项执行与
select
函数类似的语法的列选择

正如您可以使用
select(my\u data,一个/u(group\u cols))
选择列列表一样,您也可以使用
group\u by\u at
执行以下操作:

library(dplyr)

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

mtcars %>% 
  group_by_at(.vars = vars(one_of(group_cols))) %>% 
  summarize(mean_wt = mean(wt))
库(dplyr)
集团成本%
一组一组(.vars=vars(一组中的一组))%>%
汇总(平均值=平均值)

对于
dplyr 1.0.0
,我们基于“正常”的
组有以下可能性:

library(dplyr)

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

mtcars %>% 
  group_by(across(all_of(group_cols))) %>% 
  summarize(mean_wt = mean(wt))
库(dplyr)
集团成本%
分组依据(跨越(所有分组))%>%
汇总(平均值=平均值)

当用户选择时,我有11个分类变量,比如说它在
var1
中给我3个分类变量“dish\u name”“dish\u type”[3]“user\u location\u grp”
如何将这个数组传递给groupby。因为这些答案是根本不同的方法。如果用户发现一种方法比另一种方法更有用,投票过程将清楚地表明这一点。有两篇帖子对读者没有害处,我很乐意分别对这两篇帖子发表评论和编辑。请参阅在此类情况下建议使用多个答案。应注意的是,
groupby()
函数已被软性弃用,最终将从
dplyr
包中删除。groupby(在本例中,是(?)中是否需要所有答案。
library(dplyr)

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

mtcars %>% 
  group_by_at(.vars = vars(one_of(group_cols))) %>% 
  summarize(mean_wt = mean(wt))
library(dplyr)

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

mtcars %>% 
  group_by(across(all_of(group_cols))) %>% 
  summarize(mean_wt = mean(wt))