Ind*_*til 6 r tidyverse tidyeval rlang
我正在尝试编写一个自定义函数,该函数使用 的rlang非标准评估来按多个变量对数据帧进行分组。
这就是我已经-
library(rlang)
# function definition
tryfn <- function(data, groups, ...) {
# preparing data
df <- dplyr::group_by(data, !!!rlang::enquos(groups))
print(head(df))
# applying some function `.f` on df that absorbs `...`
# .f(df, ...)
}
Run Code Online (Sandbox Code Playgroud)
这适用于单个分组变量 -
# works
tryfn(mtcars, am)
#> # A tibble: 6 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
Run Code Online (Sandbox Code Playgroud)
但如果尝试使用多个分组变量,这是行不通的-
# doesn't work
tryfn(mtcars, c(am, cyl))
#> Error: Column `c(am, cyl)` must be length 32 (the number of rows) or one, not 64
# doesn't work
tryfn(mtcars, list(am, cyl))
#> Error: Column `list(am, cyl)` must be length 32 (the number of rows) or one, not 2
Run Code Online (Sandbox Code Playgroud)
我们可以将其解析为表达式并enexpr使用!!!
tryfn <- function(data, groups, ...) {\n\n groups <- as.list(rlang::enexpr(groups))\n\n groups <- if(length(groups) > 1) groups[-1] else groups\n\n group_by(data, !!!groups)\n\n }\nRun Code Online (Sandbox Code Playgroud)\n\n-测试
\n\ntryfn(mtcars, am)\n# A tibble: 32 x 11\n# Groups: am [2]\n# mpg cyl disp hp drat wt qsec vs am gear carb\n# * <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>\n# 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4\n# 2 21 6 160 110 3.9 2.88 17.0 0 1 4 4\n# 3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1\n# 4 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1\n# 5 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2\n# 6 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1\n# 7 14.3 8 360 245 3.21 3.57 15.8 0 0 3 4\n# 8 24.4 4 147. 62 3.69 3.19 20 1 0 4 2\n# 9 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2\n#10 19.2 6 168. 123 3.92 3.44 18.3 1 0 4 4\n# \xe2\x80\xa6 with 22 more rows\n\n\n\n\n\ntryfn(mtcars, c(am, cyl))\n# A tibble: 32 x 11\n# Groups: am, cyl [6]\n# mpg cyl disp hp drat wt qsec vs am gear carb\n# * <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>\n# 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4\n# 2 21 6 160 110 3.9 2.88 17.0 0 1 4 4\n# 3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1\n# 4 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1\n# 5 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2\n# 6 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1\n# 7 14.3 8 360 245 3.21 3.57 15.8 0 0 3 4\n# 8 24.4 4 147. 62 3.69 3.19 20 1 0 4 2\n# 9 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2\n#10 19.2 6 168. 123 3.92 3.44 18.3 1 0 4 4\n# \xe2\x80\xa6 with 22 more rows\nRun Code Online (Sandbox Code Playgroud)\n