如何在自定义函数中用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
相关产品推荐
相关产品推荐

