如何使用列名向量作为dplyr::group_by()的输入?

如何使用列名向量作为dplyr::group_by()的输入?,r,dplyr,eval,tidyeval,R,Dplyr,Eval,Tidyeval,我想基于dplyr创建一个函数,对数据子集执行某些操作。子集由数据集中一个或多个键列的值定义。当只有一列用于标识子集时,我的代码工作正常: set.seed(1) df您需要使用unquote拼接操作符: aggregate <- function(df, by) { df %>% group_by(!!!syms(by)) %>% summarize(a = mean(a)) } group_key <- c("g1", "g2") aggregate(df,

我想基于
dplyr
创建一个函数,对数据子集执行某些操作。子集由数据集中一个或多个键列的值定义。当只有一列用于标识子集时,我的代码工作正常:

set.seed(1)

df您需要使用unquote拼接操作符

aggregate <- function(df, by) {
  df %>% group_by(!!!syms(by)) %>% summarize(a = mean(a))
}

group_key <- c("g1", "g2")

aggregate(df, by = group_key)
## A tibble: 4 x 3
## Groups:   g1 [2]
#     g1    g2     a
#  <dbl> <dbl> <dbl>
#1     1     1   1  
#2     1     2   4  
#3     2     1   2.5
#4     2     2   5 
聚合%group_by(!!!syms(by))%>%summary(a=平均值(a))
}

分组键或者,您可以在
处使用
dplyr::group\u by\u:

agg%group\u by\u at(vars(其中一个)(by))%%>%summary(a=mean(a))}
组键g1 a
#>    
#> 1     1  2.5 
#> 2     2  3.33
agg(df,by=组密钥)
#>#tibble:4 x 3
#>#组:g1[2]
#>g1 g2 a
#>     
#> 1     1     1   1  
#> 2     1     2   4  
#> 3     2     1   2.5
#> 4     2     2   5
使用dplyr 1.0.0更新 新的
cross()
允许像
all\u of
这样的tidyselect函数,它取代了NSE的quote unqote过程。代码看起来有点简单:

aggregate <- function(df, by) {
  df %>% 
    group_by(across(all_of(by))) %>% 
    summarize(a = mean(a))
}

df %>% aggregate(group_key)
aggregate%
分组依据(全部依据))%>%
总结(a=平均值(a))
}
df%>%聚合(组密钥)

您可以直接传递字符向量,而不是
vars()
group\u by\u at(by)
@LionelHenry您尝试过这个吗<代码>UseMethod(“tbl_vars”)中的错误:没有适用于“tbl_vars”的方法应用于类“function”的对象。
是否需要将数据帧导入其中<代码>mtcars%>%分组(c(“cyl”,“am”))
@LionelHenry油井管道从来没有必要。您总是可以这样放置
group\u by(df,col)
。阅读有关
magrittr::%%>%%
的更多信息。让我重新措辞:是否需要将数据帧传递给
groupby()
aggregate <- function(df, by) {
  df %>% 
    group_by(across(all_of(by))) %>% 
    summarize(a = mean(a))
}

df %>% aggregate(group_key)