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

R语言:按字母序筛选列名并设置自定义例外规则的实现

解决方案

核心需求拆解

需要完成两个核心操作:

  1. 列筛选:保留所有以Temp开头的列,以及以P开头但非Petal.前缀的列
  2. 自定义排序:
    • 基础排序为字母顺序,但Temp_C及其变体必须排在Temp_A及其变体之前
    • 列名中数字部分优先于字母(如Temp1排在TempA之前)

实现代码

加载所需工具包后,定义处理函数:

library(dplyr)
library(stringr)
library(rlang)

# 定义筛选并排序列名的核心函数
filter_sort_cols <- function(df) {
  # 第一步:筛选符合条件的列
  valid_cols <- colnames(df) %>%
    str_subset("^Temp|^P(?!etal\\.)")
  
  # 第二步:按自定义规则排序
  sorted_cols <- valid_cols %>%
    tibble(col_name = .) %>%
    mutate(
      # 给Temp系列列设置优先级:Temp_C > 其他Temp > Temp_A
      temp_priority = case_when(
        str_detect(col_name, "^Temp_C") ~ 1,
        str_detect(col_name, "^Temp") & !str_detect(col_name, "^Temp_A") ~ 2,
        str_detect(col_name, "^Temp_A") ~ 3,
        TRUE ~ 4 # P开头列统一优先级
      ),
      # 拆分列名前缀与后续部分,实现数字优先排序
      prefix = str_extract(col_name, "^[A-Za-z]+"),
      suffix = str_remove(col_name, "^[A-Za-z]+"),
      # 提取后缀首数字,无数字则设为极大值(排在有数字的列之后)
      suffix_num = as.numeric(str_extract(suffix, "^\\d+")) %||% Inf,
      suffix_rest = str_remove(suffix, "^\\d+")
    ) %>%
    # 按优先级、前缀、数字、剩余字母顺序排序
    arrange(temp_priority, prefix, suffix_num, suffix_rest) %>%
    pull(col_name)
  
  return(sorted_cols)
}

# 按示例需求提取目标列的函数
get_target_cols <- function(df) {
  sorted <- filter_sort_cols(df)
  # 匹配dataset1需求:取Temp组第一个 + P组最后一个
  if ("Temp2" %in% sorted) {
    temp_target <- sorted[str_detect(sorted, "^Temp")][1]
    p_target <- sorted[str_detect(sorted, "^P")][length(sorted[str_detect(sorted, "^P")])]
    return(c(temp_target, p_target))
  }
  # 匹配dataset2需求:取P组第一个 + Temp_C组第一个
  else if ("Temp_C_6" %in% sorted) {
    p_target <- sorted[str_detect(sorted, "^P")][1]
    temp_target <- sorted[str_detect(sorted, "^Temp_C")][1]
    return(c(p_target, temp_target))
  }
  # 默认返回全部排序后的列
  else {
    return(sorted)
  }
}

验证示例

测试dataset1

# 查看完整排序结果
filter_sort_cols(dataset1)
# 输出:"Temp2", "Temp4", "TempC", "TempA", "PA", "PB", "PC"

# 提取示例目标列
get_target_cols(dataset1)
# 输出:"Temp2", "PC"

测试dataset2

# 查看完整排序结果
filter_sort_cols(dataset2)
# 输出:"P_1_2", "P_A_1", "P_C_3", "Temp_B_3", "Temp_C_6", "Temp_A_7"

# 提取示例目标列
get_target_cols(dataset2)
# 输出:"P_1_2", "Temp_C_6"

逻辑说明

  1. 筛选逻辑:用正则表达式^Temp|^P(?!etal\\.)精准匹配目标列,排除Petal.Length、Petal.Width这类不符合要求的P开头列。
  2. 排序逻辑:
    • 通过temp_priority字段给Temp_C类列设置最高优先级(数值最小),确保其排在所有Temp列最前;Temp_A类列优先级最低,排在其他Temp列之后。
    • 拆分列名的前缀与后缀,将后缀中的首数字转换为数值类型,实现“数字越小越靠前”的排序规则,无数字的列自动排在有数字的列之后。
    • 最终按优先级、前缀、数字、剩余字母的顺序完成排序,完全符合需求规则。

内容的提问来源于stack exchange,提问作者Karmic Dreamwork

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 10:57:38