基于quosure命名一个新变量
Naming a new variable based on a quosure
我正在尝试编写一个自定义函数,该函数将根据预定义变量向量(例如 vector_heavy)中的值计算新变量,然后根据提供给的参数命名新变量函数(例如,custom_name)。
这个变量命名是我的 quosure 技能让我失望的地方。任何帮助是极大的赞赏。
library(tidyverse)
vector_heavy <- quos(disp, wt, cyl)
cv_compute <- function(data, cv_name, cv_vector){
cv_name <- enquo(cv_name)
data %>%
rowwise() %>%
mutate(!!cv_name = mean(c(!!!cv_vector), na.rm = TRUE)) %>%
ungroup()
}
d <- cv_compute(mtcars, cv_name = custom_name, cv_vector = vector_heavy)
我的错误信息是:
Error: unexpected '=' in:
" rowwise() %>%
mutate(!!cv_name ="
在 mutate()
中删除 cv_name
之前的 !!
将导致一个函数计算一个字面上名为 cv_name
的新变量,并忽略 custom_name
我已经包括在内作为一个论点。
cv_compute <- function(data, cv_name, cv_vector){
cv_name <- enquo(cv_name)
data %>%
rowwise() %>%
mutate(cv_name = mean(c(!!!cv_vector), na.rm = TRUE)) %>%
ungroup()
}
如何让此函数利用我提供的 custom_name
作为 cv_name
的参数?
您需要在 mutate
中使用 :=
助手。您还需要 quo_name
将输入转换为字符串。
你的函数的 mutate
行看起来像
mutate(!!quo_name(cv_name) := mean(c(!!!cv_vector), na.rm = TRUE))
完整:
cv_compute <- function(data, cv_name, cv_vector){
cv_name <- enquo(cv_name)
data %>%
rowwise() %>%
mutate(!!quo_name(cv_name) := mean(c(!!!cv_vector), na.rm = TRUE)) %>%
ungroup()
}
cv_compute(mtcars, cv_name = custom_name, cv_vector = vector_heavy)
mpg cyl disp hp drat wt qsec vs am gear carb custom_name
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 56.20667
2 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 56.29167
3 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 38.10667
4 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 89.07167
5 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 123.81333
6 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 78.15333
我正在尝试编写一个自定义函数,该函数将根据预定义变量向量(例如 vector_heavy)中的值计算新变量,然后根据提供给的参数命名新变量函数(例如,custom_name)。
这个变量命名是我的 quosure 技能让我失望的地方。任何帮助是极大的赞赏。
library(tidyverse)
vector_heavy <- quos(disp, wt, cyl)
cv_compute <- function(data, cv_name, cv_vector){
cv_name <- enquo(cv_name)
data %>%
rowwise() %>%
mutate(!!cv_name = mean(c(!!!cv_vector), na.rm = TRUE)) %>%
ungroup()
}
d <- cv_compute(mtcars, cv_name = custom_name, cv_vector = vector_heavy)
我的错误信息是:
Error: unexpected '=' in:
" rowwise() %>%
mutate(!!cv_name ="
在 mutate()
中删除 cv_name
之前的 !!
将导致一个函数计算一个字面上名为 cv_name
的新变量,并忽略 custom_name
我已经包括在内作为一个论点。
cv_compute <- function(data, cv_name, cv_vector){
cv_name <- enquo(cv_name)
data %>%
rowwise() %>%
mutate(cv_name = mean(c(!!!cv_vector), na.rm = TRUE)) %>%
ungroup()
}
如何让此函数利用我提供的 custom_name
作为 cv_name
的参数?
您需要在 mutate
中使用 :=
助手。您还需要 quo_name
将输入转换为字符串。
你的函数的 mutate
行看起来像
mutate(!!quo_name(cv_name) := mean(c(!!!cv_vector), na.rm = TRUE))
完整:
cv_compute <- function(data, cv_name, cv_vector){
cv_name <- enquo(cv_name)
data %>%
rowwise() %>%
mutate(!!quo_name(cv_name) := mean(c(!!!cv_vector), na.rm = TRUE)) %>%
ungroup()
}
cv_compute(mtcars, cv_name = custom_name, cv_vector = vector_heavy)
mpg cyl disp hp drat wt qsec vs am gear carb custom_name
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 56.20667
2 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 56.29167
3 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 38.10667
4 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 89.07167
5 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 123.81333
6 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 78.15333