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

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

从dplyr::mutate中提取输入列名的方法

要提取mutate调用中涉及的输入列名,可以借助rlang包的表达式解析能力,针对不同的表达式类型(直接列引用、赋值式、across调用等)做针对性处理。以下是具体实现方案:

1. 加载依赖包

library(dplyr)
library(rlang)

2. 定义提取函数

extract_mutate_inputs <- function(data, ...) {
  # 捕获mutate的所有参数表达式
  exprs <- enquos(...)
  
  # 辅助函数:解析单个表达式,提取输入列/表达式内容
  extract_cols <- function(expr) {
    expr <- get_expr(expr)
    
    # 处理across调用:解析其列选择器参数
    if (is_call(expr, "across")) {
      cols_expr <- expr[[2]]
      cols <- eval_tidy(cols_expr, data)
      as.character(cols)
    } 
    # 处理直接引用列的情况(如Species)
    else if (is_symbol(expr)) {
      as.character(expr)
    } 
    # 处理赋值式(如okay = Species):提取右侧表达式
    else if (is_call(expr, "=")) {
      extract_cols(enquo(expr[[3]]))
    } 
    # 处理其他表达式(如1:150):转为字符串
    else {
      deparse(expr)
    }
  }
  
  # 遍历所有表达式,提取结果并展开
  unlist(lapply(exprs, extract_cols))
}

3. 测试函数

用你提供的示例数据测试:

result <- extract_mutate_inputs(iris,
  Species, 
  okay = Species, 
  across(c(Species, Sepal.Length), identity, .names = "{.col}_2"), 
  1:150
)

print(result)
#> [1] "Species"      "Species"      "Species"      "Sepal.Length" "1:150"

这个函数能覆盖你示例中的所有场景:直接列引用、赋值式生成新列、across批量处理列,以及纯表达式的情况,最终输出你期望的输入列/表达式列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 14:17:06