R语言中如何按学期顺序对tibble对象的列进行排序
解决方法
问题原因
直接使用str_sort排序失效的原因是字符串默认按字典序排序,首字母F(Fall)的优先级高于S(Spring),会导致同一年份的秋季排在春季前面,不符合学期时间逻辑。
实现思路
将列名拆解为「学期类型」和「年份」两个维度,先按年份升序排序,同一年份内强制Spring排在Fall前即可。
代码实现
tidyverse风格完整实现
library(tidyverse) # 生成排序后的列名向量 sorted_cols <- names(dataSet) %>% enframe(value = "col_name", name = NULL) %>% # 拆分学期和年份 separate(col_name, into = c("term", "year"), sep = " ", remove = FALSE) %>% mutate( year = as.numeric(year), # 定义学期顺序,Spring在前 term = factor(term, levels = c("Spring", "Fall")) ) %>% arrange(year, term) %>% pull(col_name) # 重排tibble列 dataSet_sorted <- dataSet %>% select(all_of(sorted_cols))
简洁版实现(无需额外拆分行)
# 提取年份和学期权重 col_year <- as.numeric(str_extract(names(dataSet), "\\d{4}")) col_term_weight <- ifelse(str_starts(names(dataSet), "Spring"), 1, 2) # 按规则排序后重排列 sorted_cols <- names(dataSet)[order(col_year, col_term_weight)] dataSet_sorted <- dataSet %>% select(all_of(sorted_cols))
内容的提问来源于stack exchange,提问作者lurodrig
相关产品推荐
相关产品推荐

