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

如何在自定义函数中用dplyr根据传入列名动态命名新变量?

问题:如何在dplyr自定义函数中动态生成包含传入列名的新变量名?

示例数据

samp_df <- tibble(var1 = c('a', 'b', 'c'),
                  var_in_df = c(3,7,9))

原函数

calculateMean <- function(df, variable){
  df <- df %>% 
    mutate(mean_of_var = mean({{variable}}))
}

df_result <- calculateMean(samp_df, var_in_df)

需求

想让函数生成的新变量名包含传入的列名,比如传var_in_df时,新变量叫mean_of_var_in_df。之前尝试直接用paste赋值,结果报错:

calculateMean <- function(df, variable){
  df <- df %>% 
    mutate(paste('mean_of', {{variable}}, sep = '-') = mean({{variable}}))
}

解决办法

dplyr里动态命名新变量必须用:=运算符,它能让你把动态生成的字符串作为变量名。这里有几种简洁的实现方式:

方式1:用rlang::englue(推荐,语法直观)

library(dplyr)
library(rlang)

calculateMean <- function(df, variable){
  df %>% 
    mutate("{englue('mean_of_{{variable}}')}" := mean({{variable}}))
}

# 测试
df_result <- calculateMean(samp_df, var_in_df)

方式2:用paste配合!!和sym

library(dplyr)
library(rlang)

calculateMean <- function(df, variable){
  # 生成目标变量名
  new_var <- sym(paste('mean_of', deparse(substitute(variable)), sep = '_'))
  df %>% 
    mutate(!!new_var := mean({{variable}}))
}

# 测试
df_result <- calculateMean(samp_df, var_in_df)

方式3:dplyr 1.0+的简化写法

直接在:=左边拼接字符串,用!!解析:

library(dplyr)

calculateMean <- function(df, variable){
  df %>% 
    mutate(
      !!paste('mean_of', {{variable}}, sep = '_') := mean({{variable}})
    )
}

# 测试
df_result <- calculateMean(samp_df, var_in_df)

运行后df_result里会多出一列mean_of_var_in_df,值为6.333...,完全符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:15:37