You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 18:05:01