借助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_后缀格式的列 - 排序规则实现:
- 用
parse_number()提取列名中的数字n,作为第一排序维度(升序) - 用
str_remove()去除前缀var数字_,将后缀转为指定顺序的因子(levels = c("name", "desc", "cats")),作为第二排序维度
- 用
- 调整列位置:将排序后的列通过
all_of()传入relocate(),指定放在id_col之后
内容的提问来源于stack exchange,提问作者pyg
相关产品推荐
相关产品推荐

