使用 `mutate` 使用命名向量创建列副本

Joh*_*nry 5 r names dplyr

我有一个tibble和一个命名向量。我想使用向量名称复制命名向量中的所有列,同时保留原始名称。

我知道如何相当简单地重命名所有列:

library(dplyr)

named_vector <- 
  c("var1" = "x1",
    "var2" = "x2",
    "var3" = "x3")

tibble(x1 = 1:3, x2 = 1:3, x3 = 1:3, z = 68, zz = 69) %>% 
  rename(!!!named_vector)
#> # A tibble: 3 x 5
#>    var1  var2  var3     z    zz
#>   <int> <int> <int> <dbl> <dbl>
#> 1     1     1     1    68    69
#> 2     2     2     2    68    69
#> 3     3     3     3    68    69
Run Code Online (Sandbox Code Playgroud)

reprex 包(v0.3.0)于 2021 年 8 月 27 日创建

但我不知道如何使用mutate. 如何以保留原始名称但还有向量名称的方式制作列的副本?

我的预期输出相当于:

library(dplyr)

named_vector <- 
  c("var1" = "x1",
    "var2" = "x2",
    "var3" = "x3")

tibble(x1 = 1:3, x2 = 1:3, x3 = 1:3, z = 68, zz = 69) %>% 
  mutate(var1 = x1,
         var2 = x2,
         var3 = x3)
#> # A tibble: 3 x 8
#>      x1    x2    x3     z    zz  var1  var2  var3
#>   <int> <int> <int> <dbl> <dbl> <int> <int> <int>
#> 1     1     1     1    68    69     1     1     1
#> 2     2     2     2    68    69     2     2     2
#> 3     3     3     3    68    69     3     3     3
Run Code Online (Sandbox Code Playgroud)

reprex 包(v0.3.0)于 2021 年 8 月 27 日创建

akr*_*run 3

我们可以使用acrosswith mutate,并str_replace通过用 'var' 替换子字符串 'x' 来重命名 with 来创建新列

library(dplyr)
library(stringr)
tibble(x1 = 1:3, x2 = 1:3, x3 = 1:3) %>%
    mutate(across(everything(), 
       .names = "{str_replace(.col, 'x', 'var')}"))
Run Code Online (Sandbox Code Playgroud)

-输出

# A tibble: 3 x 6
     x1    x2    x3  var1  var2  var3
  <int> <int> <int> <int> <int> <int>
1     1     1     1     1     1     1
2     2     2     2     2     2     2
3     3     3     3     3     3     3
Run Code Online (Sandbox Code Playgroud)

或者使用matchnamed_vector中.names

tibble(x1 = 1:3, x2 = 1:3, x3 = 1:3) %>% 
    mutate(across(all_of(unname(named_vector)),
      .names = "{names(named_vector)[match(.col, named_vector)]}"))
Run Code Online (Sandbox Code Playgroud)

-输出

# A tibble: 3 x 6
     x1    x2    x3  var1  var2  var3
  <int> <int> <int> <int> <int> <int>
1     1     1     1     1     1     1
2     2     2     2     2     2     2
3     3     3     3     3     3     3
Run Code Online (Sandbox Code Playgroud)

通过更新的帖子,解决方案也有效

tibble(x1 = 1:3, x2 = 1:3, x3 = 1:3, z = 68, zz = 69)  %>%  
    mutate(across(all_of(unname(named_vector)),
       .names = "{names(named_vector)[match(.col, named_vector)]}"))
# A tibble: 3 x 8
     x1    x2    x3     z    zz  var1  var2  var3
  <int> <int> <int> <dbl> <dbl> <int> <int> <int>
1     1     1     1    68    69     1     1     1
2     2     2     2    68    69     2     2     2
3     3     3     3    68    69     3     3     3
Run Code Online (Sandbox Code Playgroud)