【问题标题】:create a duplicate column using tidyeval [duplicate]使用 tidyeval 创建重复列 [重复]
【发布时间】:2020-11-06 00:35:37
【问题描述】:

我正在尝试使用 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")

【问题讨论】:

    标签: r dplyr tidyeval


    【解决方案1】:

    如果只选择一列,例如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
    

    如果选择了多个列,例如mpg 和cyl,可以在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
    

    【讨论】:

    • 非常感谢...以前从未见过sym()。
    • @guyabel 实际上sym() 等价于base 中的as.name()。您可以搜索他们的文档以获取更多详细信息。
    猜你喜欢
    • 2019-11-15
    • 2018-12-12
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 2022-10-19
    相关资源
    最近更新 更多