dplyr通过将分组变量名称作为字符串传递给多个列

问题描述 投票:15回答:3

我正在与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中传递此信息。

r group-by shiny dplyr
3个回答
33
投票

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

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

3
投票

您可以使用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函数如何用于单个列名称(即长度为一个字符的向量)。


1
投票

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))
© www.soinside.com 2019 - 2024. All rights reserved.