I want to create new columns using across
and that new columns being intercalated with the old ones. In the example I manually relocate the columns to show the desired output. But I would like to do this automatically, like my try inside mutate
, which obviously does not work.
library(dplyr)
df <- tibble(a = 1:2, x_b = 1:2, x_c = 1:2)
df |>
mutate(across(starts_with("x_"),
~ .x * 2,
.names = "{sub('x_', 'y_', .col)}"),
.after = c(x_b, x_c)) |>
relocate(y_b, .after = x_b) |>
relocate(y_c, .after = x_c)
#> # A tibble: 2 × 5
#> a x_b y_b x_c y_c
#> <int> <int> <dbl> <int> <dbl>
#> 1 1 1 2 1 2
#> 2 2 2 4 2 4
Created on 2023-05-18 with reprex v2.0.2
We could create a tibble/data.frame, use .unpack
option and rename the columns
library(dplyr)
library(stringr)
df %>%
mutate(across(starts_with("x_"),
~ data.frame(x = .x, y = .x * 2), .unpack = TRUE),
.keep = 'unused') %>%
rename_with(~ str_replace(.x, "x_(.)_(.)", "\\2_\\1"))
-output
# A tibble: 2 × 5
a x_b y_b x_c y_c
<int> <int> <dbl> <int> <dbl>
1 1 1 2 1 2
2 2 2 4 2 4