如何使用 dplyr 编程语法创建和评估变量名称
How to use dplyr programming syntax to create and evaluate variable names
我想使用 dplyr 编程语法动态输入变量名,但是,正如许多人所描述的那样,这可能会非常混乱。
我试过 quo/enquo 的各种组合!!等无济于事。这是我的代码的最简单形式
library(tidyverse)
df <- tibble(
color1 = c("blue", "blue", "blue", "blue", "blue"),
color2 = c("black", "black", "black", "black", "black"),
value = 1:5
)
num <- 2
df %>%
mutate(color3 = !!(paste0("color", num)))
#> # A tibble: 5 x 4
#> color1 color2 value color3
#> <chr> <chr> <int> <chr>
#> 1 blue black 1 color2
#> 2 blue black 2 color2
#> 3 blue black 3 color2
#> 4 blue black 4 color2
#> 5 blue black 5 color2
由 reprex package (v0.2.1)
创建于 2018-12-19
相反,我想评估引用的输入。
#> # A tibble: 5 x 4
#> color1 color2 value color3
#> <chr> <chr> <int> <chr>
#> 1 blue black 1 black
#> 2 blue black 2 black
#> 3 blue black 3 black
#> 4 blue black 4 black
#> 5 blue black 5 black
我们可以使用 rlang
中的 sym
将字符串转换为符号,然后计算 (!!
)
library(dplyr)
df %>%
mutate(color3 = !!(rlang::sym(paste0("color", num))))
# A tibble: 5 x 4
# color1 color2 value color3
# <chr> <chr> <int> <chr>
#1 blue black 1 black
#2 blue black 2 black
#3 blue black 3 black
#4 blue black 4 black
#5 blue black 5 black
我想使用 dplyr 编程语法动态输入变量名,但是,正如许多人所描述的那样,这可能会非常混乱。
我试过 quo/enquo 的各种组合!!等无济于事。这是我的代码的最简单形式
library(tidyverse)
df <- tibble(
color1 = c("blue", "blue", "blue", "blue", "blue"),
color2 = c("black", "black", "black", "black", "black"),
value = 1:5
)
num <- 2
df %>%
mutate(color3 = !!(paste0("color", num)))
#> # A tibble: 5 x 4
#> color1 color2 value color3
#> <chr> <chr> <int> <chr>
#> 1 blue black 1 color2
#> 2 blue black 2 color2
#> 3 blue black 3 color2
#> 4 blue black 4 color2
#> 5 blue black 5 color2
由 reprex package (v0.2.1)
创建于 2018-12-19相反,我想评估引用的输入。
#> # A tibble: 5 x 4
#> color1 color2 value color3
#> <chr> <chr> <int> <chr>
#> 1 blue black 1 black
#> 2 blue black 2 black
#> 3 blue black 3 black
#> 4 blue black 4 black
#> 5 blue black 5 black
我们可以使用 rlang
中的 sym
将字符串转换为符号,然后计算 (!!
)
library(dplyr)
df %>%
mutate(color3 = !!(rlang::sym(paste0("color", num))))
# A tibble: 5 x 4
# color1 color2 value color3
# <chr> <chr> <int> <chr>
#1 blue black 1 black
#2 blue black 2 black
#3 blue black 3 black
#4 blue black 4 black
#5 blue black 5 black