You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言实现含_sub/_pct后缀向量的自定义规则排序方法

R向量自定义排序实现方案

核心思路是给每个元素生成三个优先级从高到低的排序键,不需要提前指定包含的州名,完全通用:

  1. 第一键:分组优先级,var最高(排最前),普通州相关元素次之,US相关元素最低(排最后)
  2. 第二键:提取州名缩写,普通州按字母序排列
  3. 第三键:州/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 08:48:02