R语言在自定义函数内为dataframe添加指定名称新列的问题
R函数动态指定dataframe新增列名解决方案
问题根源
你的写法存在两个核心问题:
- 使用
df$参数名的方式赋值新列时,R会直接把参数名当做固定的字符串作为列名,不会解析为你调用时传入的自定义名称 - 待处理列
df_col_name在函数内直接读取时,无法对应到传入的dataframe的对应列,会出现找不到对象的报错
基础R实现方案(无需额外安装包)
修正后的函数如下:
no_way <- function(df, df_col_name, df_col_flagH, df_col_flagL) { # 转换传入的未加引号的列名为字符串 col_name <- deparse(substitute(df_col_name)) flagH_name <- gsub('"|.*\\$', "", deparse(substitute(df_col_flagH))) flagL_name <- gsub('"|.*\\$', "", deparse(substitute(df_col_flagL))) lo_perc <- 2 hi_perc <- 6 col_val <- df[[col_name]] # 动态赋值新列,使用传入的自定义列名 df[[flagH_name]] <- as.factor(ifelse(col_val < lo_perc, 1, 0)) df[[flagL_name]] <- as.factor(ifelse(col_val > hi_perc, 1, 0)) # 原列的转换逻辑写回 df[[col_name]] <- (col_val + 1.4) * 0.12 return(df) }
调用方式
推荐直接传入不带引号的列名,写法最简洁:
res <- no_way(df2, col, new_col, new_col2)
也兼容你之前加df$前缀、传字符串列名的写法:
# 兼容原有写法 res <- no_way(df2, col, df$new_col, df$new_col2) # 传字符串列名也支持 res <- no_way(df2, "col", "new_col", "new_col2")
调用后查看res的列名,即可看到新增的new_col、new_col2两列,而非默认的参数占位符名称。
核心说明
- R中要动态指定dataframe的列名,必须使用
df[[列名变量]]的写法,不能使用$符号 deparse(substitute())可以将函数调用时传入的未加引号的变量名转换为字符串,实现非标准参数的解析
内容的提问来源于stack exchange,提问作者RoiMinuit
相关产品推荐
相关产品推荐

