R语言如何基于正则/模式实现数据框多列分组重排序
R 数据框按列名后缀自动交替排序实现方案
需求说明
现有列名格式为前缀_后缀的数据框,需要实现列的自动排列:同后缀的列相邻,按「前缀1_后缀N、前缀2_后缀N、前缀1_后缀N+1、前缀2_后缀N+1」的交替逻辑排列,替代手动枚举列名的低效操作。
- 示例原始列顺序:
a_aa a_ab a_ac b_aa b_ab b_ac - 期望输出列顺序:
a_aa b_aa a_ab b_ab a_ac b_ac
方案1:tidyverse 实现(适配管道操作习惯)
和当前使用的dplyr语法兼容,不需要手动指定任何列名,自动适配任意数量的前缀、后缀:
library(dplyr) library(tidyr) # 测试数据构造 d <- "a_aa a_ab a_ac b_aa b_ab b_ac 2 3 3 3 1 2 3 4 1 1 3 1" dd <- read.table(textConnection(object = d), header = T) # 自动排序核心代码 dd <- dd %>% relocate( .cols = colnames(.) %>% as_tibble_col(column_name = "col_name") %>% separate(col = col_name, into = c("prefix", "suffix"), sep = "_", remove = F) %>% arrange(suffix, prefix) %>% pull(col_name) )
运行后查看列名colnames(dd),即可得到期望的排列顺序。
如果需要自定义前缀的排列顺序(比如需要b开头的列排在a前面),只需要在arrange前增加前缀因子水平的定义即可,示例:
%>% mutate(prefix = factor(prefix, levels = c("b", "a"))) %>%
方案2:基础R实现(无额外依赖)
不需要加载第三方包,直接用基础R函数即可实现相同效果:
# 按下划线拆分所有列名,得到前缀、后缀矩阵 col_split <- do.call(rbind, strsplit(colnames(dd), "_")) # 生成排序索引:优先按后缀排序,同后缀下按前缀排序 col_order <- order(col_split[, 2], col_split[, 1]) # 按索引重排数据框列 dd <- dd[, col_order]
两种方案都支持任意数量的列,只要列名遵循「前缀_后缀」的下划线分隔规则,都可以直接运行得到正确结果,列数较多时相比手动指定列名效率提升明显。
内容的提问来源于stack exchange,提问作者Andrei Maiseyeu
相关产品推荐
相关产品推荐

