我想使用创建新列,across并且新列与旧列插入。在示例中,我手动重新定位列以显示所需的输出。但是我想自动执行此操作,就像我的 try inside 一样mutate,这显然是行不通的。
across
mutate
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
要自动执行你所描述的操作,你可以使用以下方法:
library(dplyr) df <- tibble(a = 1:2, x_b = 1:2, x_c = 1:2) df <- df %>% mutate(across(starts_with("x_"), ~ .x * 2, .names = "y_{.col}")) %>% relocate(starts_with("y_"), .after = starts_with("x_"))
这里的关键是使用starts_with()函数来选择以x_开头的列和以y_开头的列,然后将它们重新定位到x_列之后。这样,你就可以自动完成列的重新定位,而不需要手动指定每个列的位置。
starts_with()
x_
y_
结果将如下所示:
phpCopy code# A tibble: 2 x 5 a x_b x_c y_b y_c <int> <int> <int> <dbl> <dbl> 1 1 1 1 2 2 2 2 2 2 4 4
现在,新列y_b和y_c将自动插入到对应的x_b和x_c列之后。
y_b
y_c
x_b
x_c