如何在R语言中按后缀规则对数据框列进行排序?
问题描述
现有数据框示例:
df <- data.frame(var_NA = 1:10, var = 11:20, var_Level = 21:30, var_Total = 31:40)
实际场景包含大量变量,每个母变量(如var)对应多个子变量(如var_NA、var_Level),且每个母变量必有后缀为_NA的子变量。需要按以下规则排列列:
- 每组母变量内,顺序为:母变量 → 后缀为
_NA的子变量 → 其他子变量 - 按此规则循环排列所有变量组
示例预期列顺序:var、var_NA、var_Level、var_Total
解决方案
使用dplyr结合stringr处理列名排序,具体代码如下:
library(tidyverse) # 提取列名并生成排序规则 col_order <- colnames(df) %>% tibble(col = .) %>% # 提取母变量名称:匹配下划线前的部分,无下划线则直接取原变量名 mutate(parent_var = str_extract(col, "^[^_]+")) %>% # 分配组内排序优先级 mutate(priority = case_when( col == parent_var ~ 1, # 母变量优先级1 str_ends(col, "_NA") ~ 2, # _NA后缀变量优先级2 TRUE ~ 3 # 其他子变量优先级3 )) %>% # 按母变量分组,再按优先级排序,最后提取列名顺序 arrange(parent_var, priority) %>% pull(col) # 重新排列数据框列 df_reordered <- df %>% select(all_of(col_order))
代码逻辑说明
- 提取母变量:用正则表达式
^[^_]+匹配变量名中第一个下划线之前的内容,无下划线的变量(即母变量)直接作为自身的母变量。 - 设置优先级:给母变量、_NA后缀变量、其他子变量分别分配1、2、3的优先级,确保组内排序符合需求。
- 排序并重排列:按母变量分组后,依据优先级排序,最后用
select按生成的顺序重新排列列。
如果存在多个母变量组(比如同时有var、foo两组),该代码会自动按母变量名称顺序,每组都遵循「母变量→_NA→其他子变量」的规则排列。
内容的提问来源于stack exchange,提问作者luchonacho
相关产品推荐
相关产品推荐

