使用 tidyeval 创建一个重复的列

create a duplicate column using tidyeval

我正在尝试使用 tidyeval 创建一个重复的列。在每个循环中,要复制的列的名称各不相同,并且是使用正则表达式获得的。例如,

library(tidyverse)
a <- str_subset(string = names(mtcars), pattern = "^a")
a
# am

获取要复制的列。

然后我不知道如何使用这里的字符串来复制列(到新列a2)。从下面的代码中尝试了各种组合,但努力让我的头脑围绕整洁的评估。

# a <- enquo(a)

mtcars %>%
  as_tibble() %>%
  mutate(a2 := {{a}})
  # mutate(a2 := !!a)
  # mutate(a2 := vars(!!!a))

# # A tibble: 32 x 12
#      mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb am2  
#    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
#  1  21       6  160    110  3.9   2.62  16.5     0     1     4     4 am   
#  2  21       6  160    110  3.9   2.88  17.0     0     1     4     4 am   
#  3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1 am   
#  4  21.4     6  258    110  3.08  3.22  19.4     1     0     3     1 am   
#  5  18.7     8  360    175  3.15  3.44  17.0     0     0     3     2 am   
#  6  18.1     6  225    105  2.76  3.46  20.2     1     0     3     1 am   
#  7  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4 am   
#  8  24.4     4  147.    62  3.69  3.19  20       1     0     4     2 am   
#  9  22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2 am   
# 10  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4 am 

(我在这里寻找 am2 作为 am 的副本,所以每一行都是 1 和 0,而不是 "am"

如果只选择了一列,例如am

a <- "am"

mtcars %>%
  mutate("{a}2" := !!sym(a))

#     mpg cyl  disp  hp drat    wt  qsec vs am gear carb am2
# 1  21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4   1
# 2  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4   1
# 3  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1   1
# 4  21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1   0
# 5  18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2   0
# 6  18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1   0
# 7  14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4   0
# 8  24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2   0

如果选择了不止一列,例如mpgcyl,可以在across()中使用.names参数。

a <- c("mpg", "cyl")

mtcars %>%
  mutate(across(all_of(a), ~ ., .names = "{col}2"))

#     mpg cyl  disp  hp drat    wt  qsec vs am gear carb mpg2 cyl2
# 1  21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4 21.0    6
# 2  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4 21.0    6
# 3  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1 22.8    4
# 4  21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1 21.4    6
# 5  18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2 18.7    8
# 6  18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1 18.1    6
# 7  14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4 14.3    8
# 8  24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2 24.4    4