我正在与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中传递此信息。
答案 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_if
和group_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))