我正在与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中传递此信息。
如果你有一个变量名的向量,你应该将它们传递给.dots=
的group_by_
参数。例如:
mtcars %>%
group_by_(.dots=c("mpg","hp","wt")) %>%
summarize(x=mean(gear))
您可以使用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
函数如何用于单个列名称(即长度为一个字符的向量)。
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))