使用`rlang`NSE按多个变量分组
我正在尝试编写一个自定义函数,它使用使用`rlang`NSE按多个变量分组,r,tidyverse,rlang,tidyeval,R,Tidyverse,Rlang,Tidyeval,我正在尝试编写一个自定义函数,它使用rlang的非标准求值将数据帧按多个变量分组 这就是我所知道的- 库(rlang) #函数定义 tryfn#组:am[2] #>mpg气缸显示hp drat wt qsec与am齿轮carb #> #> 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4 #> 2 21 6 160 110 3.9 2.88 17.0
rlang
的非标准求值将数据帧按多个变量分组
这就是我所知道的-
库(rlang)
#函数定义
tryfn#组:am[2]
#>mpg气缸显示hp drat wt qsec与am齿轮carb
#>
#> 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4
#> 2 21 6 160 110 3.9 2.88 17.0 0 1 4 4
#> 3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1
#> 4 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1
#> 5 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2
#> 6 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1
但是,如果尝试使用多个分组变量,这是行不通的-
#不起作用
tryfn(mtcars,c(am,cyl))
#>错误:“c(am,cyl)”列的长度必须为32(行数)或1,而不是64
#不起作用
tryfn(mtcars,列表(am,cyl))
#>错误:“列表(am,cyl)”列的长度必须为32(行数)或1,而不是2
我们可以用eExpr
解析为表达式并使用代码>
tryfn <- function(data, groups, ...) {
groups <- as.list(rlang::enexpr(groups))
groups <- if(length(groups) > 1) groups[-1] else groups
group_by(data, !!!groups)
}
tryfn一个选项可能是切换到group\u by_at()
,因为vars()
可以非常方便地在“at”变量(裸变量、向量、字符串)中传递所有不同类型的变量:dplyr::group\u by_at(数据、dplyr::vars(!!rlang::enquo(组))
请参阅。它有你想要的答案。大致如下:sum\u fun%group\u by\u at(grp);sum_fun(mtcars,grp=vars(cyl,am))
这是否回答了您的问题?我重新打开了它,因为链接的问题解决方案修改了OP的输入,使其能够在
处使用groupby\u。在这里,OP正在寻找一个解决方案,其中输入作为c(…)
传递。为什么当我已经接受了这个问题的解决方案已经在中提供的建议时,这个问题被否决了?!
tryfn(mtcars, am)
# A tibble: 32 x 11
# Groups: am [2]
# mpg cyl disp hp drat wt qsec vs am gear carb
# * <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4
# 2 21 6 160 110 3.9 2.88 17.0 0 1 4 4
# 3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1
# 4 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1
# 5 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2
# 6 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1
# 7 14.3 8 360 245 3.21 3.57 15.8 0 0 3 4
# 8 24.4 4 147. 62 3.69 3.19 20 1 0 4 2
# 9 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2
#10 19.2 6 168. 123 3.92 3.44 18.3 1 0 4 4
# … with 22 more rows
tryfn(mtcars, c(am, cyl))
# A tibble: 32 x 11
# Groups: am, cyl [6]
# mpg cyl disp hp drat wt qsec vs am gear carb
# * <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4
# 2 21 6 160 110 3.9 2.88 17.0 0 1 4 4
# 3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1
# 4 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1
# 5 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2
# 6 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1
# 7 14.3 8 360 245 3.21 3.57 15.8 0 0 3 4
# 8 24.4 4 147. 62 3.69 3.19 20 1 0 4 2
# 9 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2
#10 19.2 6 168. 123 3.92 3.44 18.3 1 0 4 4
# … with 22 more rows