通过将变量名称分组作为字符串

时间:2015-12-28 04:21:42

标签: r group-by 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))

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

4 个答案:

答案 0 :(得分:32)

如果您有变量名称的向量,则应将它们传递给.dots= group_by_参数。例如:

mtcars %>% 
   group_by_(.dots=c("mpg","hp","wt")) %>% 
   summarize(x=mean(gear))

答案 1 :(得分:3)

对于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))

答案 2 :(得分:2)

您可以使用rlang程序包,该程序包由创建dplyr的同一团队创建。

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

library(dplyr)
library(rlang)

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

mtcars %>% 
  group_by(!!!syms(group_cols)) %>% 
  summarize(mean_wt = mean(wt))

closely-related question and answer说明了如何将!!运算符和sym函数用于单个列名(即长一字符矢量)。

答案 3 :(得分:0)

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))