如何基于指定前缀对data.frame列排序,使S1/S5开头列前置
实现方法
核心逻辑为通过列名匹配筛选优先级列,仅调整列索引不修改底层数据,面对你提到的5.3万列、1.2万行的规模也可以秒级完成:
方法1:Base R实现(无需额外安装包)
# 提取全部列名 col_all <- colnames(df) # 筛选优先级列:保留Names列 + 匹配S1/S5开头的列 # 正则中加下划线是避免误匹配S10、S51这类列,如果不需要严格区分可以去掉_ col_priority <- c("Names", grep("^S(1|5)_", col_all, value = TRUE)) # 筛选剩余列,保留原有排序 col_others <- setdiff(col_all, col_priority) # 重排data.frame df_sorted <- df[, c(col_priority, col_others)]
方法2:tidyverse实现(语法更简洁)
library(dplyr) df_sorted <- df %>% # 先放Names列,再放S1_/S5_开头的列,剩下的列按原顺序排在最后 select(Names, starts_with(c("S1_", "S5_")), everything())
如果不需要严格匹配S1后接下划线的格式,直接把starts_with的参数改成c("S1", "S5")即可。
内容的提问来源于stack exchange,提问作者NewUsr_stat
相关产品推荐
相关产品推荐

