R语言中混合字母数字与非数字字符串的向量排序问题
R字符串向量自定义排序实现
需求说明
- 非数字型条目(无末尾数字的字符串)按字母降序排列
- 数字型条目(带末尾数字的字符串):
- 与相同字母前缀的非数字条目相比,排在其后
- 同一字母前缀的数字条目,按数字部分升序排列
示例向量
vec <- c("Mezclado 1", "Sin_usar", "Mezclado 3", "Sin_usar 2", "Mezclado 2", "Mezclado")
现有代码问题
当前实现存在两个关键错误:
- 提取字母部分时未去除末尾空白,导致同一前缀的非数字与数字条目(如
Sin_usar和Sin_usar 2)被判定为不同字母组 - 排序逻辑错误,未实现"同一字母前缀下非数字在前、数字在后"的规则,而是将所有非数字条目和数字条目分开排序后拼接
修正后的代码
sort_vector <- function(vec) { # 提取字母和数字部分,处理末尾空白 extract_parts <- function(x) { # 提取末尾数字并转为数值型 num_part <- regmatches(x, regexpr("\\d+$", x)) num_part <- ifelse(num_part == "", NA, as.numeric(num_part)) # 提取字母部分并去除末尾空白字符 alpha_part <- trimws(sub("\\d+$", "", x)) list(alpha_part = alpha_part, num_part = num_part) } # 批量处理所有向量条目 parts <- lapply(vec, extract_parts) alpha_parts <- sapply(parts, `[[`, "alpha_part") num_parts <- sapply(parts, `[[`, "num_part") # 标记是否为数字型条目 is_numeric <- !is.na(num_parts) # 构造包含所有排序依据的数据框 df <- data.frame( original = vec, alpha_part = alpha_parts, num_part = num_parts, is_numeric = is_numeric, stringsAsFactors = FALSE ) # 核心排序逻辑:字母降序 → 非数字在前 → 数字升序 sorted_df <- df[order(df$alpha_part, decreasing = TRUE, df$is_numeric, df$num_part), ] # 返回排序后的向量及原向量中的索引 list( sorted_vector = sorted_df$original, sorted_indices = match(sorted_df$original, vec) ) }
验证结果
运行修正后的函数:
result <- sort_vector(vec) print(result$sorted_vector) # [1] "Sin_usar" "Sin_usar 2" "Mezclado" "Mezclado 1" "Mezclado 2" "Mezclado 3" print(result$sorted_indices) # [1] 2 4 6 1 5 3
完全匹配期望输出。
内容的提问来源于stack exchange,提问作者jalcam
相关产品推荐
相关产品推荐

