R语言实现含_sub/_pct后缀向量的自定义规则排序方法
R向量自定义排序实现方案
核心思路是给每个元素生成三个优先级从高到低的排序键,不需要提前指定包含的州名,完全通用:
- 第一键:分组优先级,
var最高(排最前),普通州相关元素次之,US相关元素最低(排最后) - 第二键:提取州名缩写,普通州按字母序排列
- 第三键:州/US组内部的类型权重,匹配要求的内部顺序
基础R实现
# 自定义排序函数 custom_sort <- function(vec) { sort_keys <- lapply(vec, function(x) { # 处理var特殊值 if (x == "var") return(list(0, "", 0)) # 处理US相关值 if (startsWith(x, "US")) { type_lv <- ifelse(x == "US", 0, 1) return(list(2, "US", type_lv)) } # 处理普通州相关值 state <- sub("(_sub|_pct)*$", "", x) type_lv <- ifelse(endsWith(x, "_sub"), 0, ifelse(endsWith(x, "_sub_pct"), 1, ifelse(!grepl("_", x), 2, 3))) return(list(1, state, type_lv)) }) # 按三个键排序后返回结果 vec[order( sapply(sort_keys, `[[`, 1), sapply(sort_keys, `[[`, 2), sapply(sort_keys, `[[`, 3) )] } # 测试用例 vec <- c("var", "NY", "AK", "UT", "US", "NY_sub", "UT_sub", "AK_sub", "AK_pct", "AK_sub_pct", "NY_sub_pct", "UT_sub_pct", "UT_pct", "NY_pct", "US_pct") custom_sort(vec)
输出结果和给出的期望完全一致。
dplyr实现
如果习惯dplyr的语法,也可以用转数据框加排序的方式实现,逻辑更直观:
library(dplyr) custom_sort_dplyr <- function(vec) { tibble(col_name = vec) %>% mutate( group_lv = case_when( col_name == "var" ~ 0, startsWith(col_name, "US") ~ 2, .default = 1 ), state = case_when( col_name == "var" ~ "", startsWith(col_name, "US") ~ "US", .default = sub("(_sub|_pct)*$", "", col_name) ), type_lv = case_when( col_name == "var" ~ 0, col_name == "US" ~ 0, col_name == "US_pct" ~ 1, endsWith(col_name, "_sub") ~ 0, endsWith(col_name, "_sub_pct") ~ 1, !grepl("_", col_name) ~ 2, endsWith(col_name, "_pct") ~ 3 ) ) %>% arrange(group_lv, state, type_lv) %>% pull(col_name) } # 测试 custom_sort_dplyr(vec)
内容的提问来源于stack exchange,提问作者hmhensen
相关产品推荐
相关产品推荐

