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

如何在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))

关键改动说明

  1. 保留灵活分组:pick({{groups}}) 依然支持传入任意数量的分组变量(单个或多个),兼容原函数的调用方式
  2. 逐行处理分组值:rowwise() 开启逐行模式,确保每一行的分组变量值能被单独拼接
  3. 动态获取所有分组值:c_across({{groups}}) 提取当前行所有分组变量的取值形成向量,彻底避免硬编码变量数量的问题
  4. 通用文件名拼接:用str_c(..., collapse = "_") 将所有分组值用下划线拼接,再统一添加后缀_file.png,不管分组变量数量多少都能生成合理文件名
  5. 取消分组状态:最后用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 11:17:29