如何用dplyr的across自动生成新列并与原列交替排列
解决dplyr中用across生成新列并与原列交替排列的问题
你原来的写法里,mutate的.after参数没法给每个新列指定不同的位置——它只能把所有新列一股脑放到同一个位置,所以没法实现交替排列。这里有两种自动实现的方法:
方法1:先生成所有新列,再重新排列顺序
先一次性用across生成所有需要的新列,再通过构造目标列顺序来重新排列,把每个原列和对应的新列配对:
library(dplyr) library(purrr) library(stringr) 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)}")) |> relocate( c( # 保留非x_开头的列 setdiff(names(.), starts_with("x_")), # 把每个x_列和对应的y_列配对后展开 unlist(map2(starts_with("x_"), str_replace(starts_with("x_"), "x_", "y_"), c)) ) )
方法2:逐个处理列,动态添加并放置
用purrr::reduce逐个处理每个x_开头的列,每次添加对应的新列并直接放在原列后面:
library(dplyr) library(purrr) library(stringr) df <- tibble(a = 1:2, x_b = 1:2, x_c = 1:2) # 提取所有x_开头的列名 x_cols <- df |> select(starts_with("x_")) |> names() # 逐个处理每列,生成新列并放在对应原列后 x_cols |> reduce( function(current_df, col) { new_col_name <- str_replace(col, "x_", "y_") current_df |> mutate(!!new_col_name := .data[[col]] * 2, .after = col) }, .init = df )
两种方法都能得到你想要的交替列结构,不需要手动调用多次relocate。
内容的提问来源于stack exchange,提问作者Josep Pueyo
相关产品推荐
相关产品推荐

