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

借助tidyselect动态重排列:自定义var_n系列列顺序实现

按指定规则排序数据集列(适配可变编号n)

需求说明

数据集包含多组三列组合:var_n_name、var_n_desc、var_n_cats(n为从1开始的连续整数),需要按以下规则排序列:

  • 先按n的升序排列分组
  • 每组内按_name→_desc→_cats的固定顺序排列(而非字母序)
  • 保留id_col在列的最前端,且方案需适配n上限可变的通用场景

输入数据示例

# unsorted
dat <- structure(list(id_col = 1:2, var2_name = c("A", "B"), var1_cats = c("A", 
"B"), var3_desc = c("A", "B"), var3_cats = c("A", "B"), var3_name = c("A", 
"B"), var2_cats = c("A", "B"), var1_name = c("A", "B"), var1_desc = c("A", 
"B"), var2_desc = c("A", "B")), class = "data.frame", row.names = c(NA, 
-2L))

期望输出

# sorted

#>   id_col var1_name var1_desc var1_cats var2_name var2_desc var2_cats var3_name
#> 1      1         A         A         A         A         A         A         A
#> 2      2         B         B         B         B         B         B         B
#>   var3_desc var3_cats
#> 1         A         A
#> 2         B         B

解决方案(单行dplyr实现)

library(dplyr)
library(readr) # 提供parse_number()函数

dat %>%
  relocate(
    all_of(
      names(.) %>%
        .[grepl("^var\\d+_.+$", .)] %>%
        arrange(parse_number(.), factor(str_remove(., "^var\\d+_"), levels = c("name", "desc", "cats"))) %>%
        unlist()
    ),
    .after = id_col
  )

代码逻辑说明

  • 筛选目标列:通过正则表达式grepl("^var\\d+_.+$", .)筛选出所有符合var_n_后缀格式的列
  • 排序规则实现:
    1. 用parse_number()提取列名中的数字n,作为第一排序维度(升序)
    2. 用str_remove()去除前缀var数字_,将后缀转为指定顺序的因子(levels = c("name", "desc", "cats")),作为第二排序维度
  • 调整列位置:将排序后的列通过all_of()传入relocate(),指定放在id_col之后

内容的提问来源于stack exchange,提问作者pyg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 05:11:12