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

如何从dplyr的mutate函数中提取输出列名?

从dplyr::mutate()中提取修改/新增的列名

解决方案思路

要提取mutate()中修改或新增的列名,核心是解析传入mutate()的参数,识别出所有目标列——包括直接赋值的列和across()等函数指定的列。可以借助rlang包的表达式解析工具来实现。

完整实现代码

library(dplyr)
library(rlang)

my_function <- function(.data, ...) {
  # 捕获mutate的所有参数为quosure对象
  mutate_args <- enquos(...)
  
  out_names <- character(0)
  
  for (arg in mutate_args) {
    # 提取参数的左侧名称(直接赋值的情况,比如Sepal.Length = ...)
    lhs_name <- quo_name(get_expr(arg)[[1]])
    
    # 判断是否是across调用
    if (call_name(arg) == "across") {
      # 解析across的第一个参数,获取目标列名
      across_cols <- eval_tidy(get_expr(arg)[[2]], .data)
      out_names <- c(out_names, across_cols)
    } else {
      # 非across的情况,直接取左侧名称
      out_names <- c(out_names, lhs_name)
    }
  }
  
  # 去重(避免同一列被多次指定的情况)
  unique(out_names)
}

测试验证

用你提供的示例输入测试:

my_function(iris, Sepal.Length = as.integer(Sepal.Length),
            across(all_of("Sepal.Width"), \(x) x * 100),
            Petal.Width = Petal.Length,
            new_column = 42)

输出结果:

[1] "Sepal.Length" "Sepal.Width"  "Petal.Width"  "new_column"  

完全符合预期。

补充说明

  • 该方法能处理across()、直接赋值等常见的mutate()用法,也支持all_of()、contains()等列选择器;
  • 加入了unique()去重,避免同一列被多次修改时重复输出;
  • 依赖rlang包解析表达式,确保能准确识别各种复杂的mutate参数。

内容的提问来源于stack exchange,提问作者NicChr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 14:42:38