R语言自定义函数中如何使用传入数据框名称作为重命名列名
核心问题
当前代码无法实现需求的原因有两点:
select(obstime, x = obsvalue)是硬编码的静态列名赋值,不支持动态生成列名- 用
lapply(list(df1,df2,df3), monthly_fun)调用时,函数接收到的只有数据框的数值内容,拿不到数据框原本的对象名(比如df1/df2),自然没法自动用对象名做新列名。
解决方法
用dplyr支持的动态列名语法:=(海象运算符)改造函数,配合命名列表做批量调用即可,不需要依赖不稳定的环境回溯逻辑,兼容性和稳定性更好。
第一步:改造函数
给函数增加用于接收目标列名的参数,用:=替代=做动态列名赋值:
library(dplyr) monthly_fun <- function(x, target_colname){ x %>% mutate(obstime = convert_dates(obstime)) %>% select(obstime, {{target_colname}} := obsvalue) }
第二步:调整批量调用逻辑
先给传入的列表设置和数据框同名的列表项名,再用能自动传递列表名的迭代函数批量处理即可。推荐用purrr::imap,它会自动把列表元素作为第一个参数、列表项名称作为第二个参数传入目标函数,写法最简洁:
library(purrr) result <- list(df1 = df1, df2 = df2, df3 = df3) %>% imap(monthly_fun)
处理后每个子数据框里,原来的obsvalue列就会被重命名为对应的数据框名称:第一个子表列名为df1,第二个为df2,第三个为df3。
如果不想额外加载purrr,用base R也可以实现同样效果:
df_list <- list(df1 = df1, df2 = df2, df3 = df3) result <- lapply(seq_along(df_list), function(i){ monthly_fun(df_list[[i]], names(df_list)[i]) })
单独调用函数时也可以直接指定列名,比如执行monthly_fun(df, "df"),输出的表中obsvalue就会被重命名为df。
内容的提问来源于stack exchange,提问作者user6441253
相关产品推荐
相关产品推荐

