如何在paste()中使用tidy select变量,支持任意分组生成文件名?
问题:使基于tidyverse的分组嵌套函数支持任意数量分组变量并生成对应文件名
原函数仅能处理恰好2个分组变量,需要修改以支持任意数量分组变量,同时正确生成包含所有分组取值的文件名:
library(tidyverse) nest_fun <- function(data, groups) { data %>% group_by(pick({{groups}})) %>% nest() %>% mutate(filename = paste({{groups}}[1], {{groups}}[2], "file.png", sep = "_")) } nest_fun(data = mtcars, groups = c(vs, am))
修改后的函数
library(tidyverse) nest_fun <- function(data, groups) { data %>% group_by(pick({{groups}})) %>% nest() %>% rowwise() %>% mutate(filename = str_c(c_across({{groups}}), collapse = "_") %>% str_c("_file.png")) %>% ungroup() }
测试示例
- 2个分组变量:
nest_fun(mtcars, c(vs, am)) - 1个分组变量:
nest_fun(mtcars, vs) - 3个分组变量:
nest_fun(mtcars, c(cyl, vs, am))
关键改动说明
- 保留灵活分组:
pick({{groups}})依然支持传入任意数量的分组变量(单个或多个),兼容原函数的调用方式 - 逐行处理分组值:
rowwise()开启逐行模式,确保每一行的分组变量值能被单独拼接 - 动态获取所有分组值:
c_across({{groups}})提取当前行所有分组变量的取值形成向量,彻底避免硬编码变量数量的问题 - 通用文件名拼接:用
str_c(..., collapse = "_")将所有分组值用下划线拼接,再统一添加后缀_file.png,不管分组变量数量多少都能生成合理文件名 - 取消分组状态:最后用
ungroup()清除分组标记,避免影响后续数据操作
替代实现(基于base R)
如果不想依赖stringr包,也可以用base R的paste实现:
nest_fun <- function(data, groups) { data %>% group_by(pick({{groups}})) %>% nest() %>% rowwise() %>% mutate(filename = paste(c_across({{groups}}), collapse = "_", "_file.png", sep = "")) %>% ungroup() }
内容的提问来源于stack exchange,提问作者retodomax
相关产品推荐
相关产品推荐

