R中数据框列排序实现:字符串按字母序在前,数值按数字序在后
R实现混合类型字符串列自定义排序方案
核心思路
通过三级排序规则实现需求,无需拆分合并数据框:
- 第一优先级:区分内容类型,纯字母类行优先排在数值类行前面
- 第二优先级:纯字母类内容按字符串字典序升序排列
- 第三优先级:数值类内容转换为数值类型后按大小升序排列
tidyverse实现方案(推荐)
首先构造示例数据方便测试:
library(tidyverse) df <- tibble( Col1 = c("Apples", "Pears", "Bananas", "Cake", "Apples", "Pears", "Bananas", "Cake"), Col2 = c("A", "12", "C", "1", "A", "B", "2", "100"), Col3 = c(90, 90, 50, 50, 90, 90, 50, 50) )
排序代码:
df_sorted <- df %>% arrange( # 第一级:字母类行前置 desc(str_detect(Col2, "^[A-Za-z]+$")), # 第二级:字母按字典序排序,数值行此处为NA自动靠后 if_else(str_detect(Col2, "^[A-Za-z]+$"), Col2, NA_character_), # 第三级:数值按大小排序,字母行此处为NA自动靠前 if_else(str_detect(Col2, "^[0-9]+$"), as.numeric(Col2), NA_real_) )
base R实现方案
# 判断是否为纯字母 is_letter <- grepl("^[A-Za-z]+$", df$Col2) # 排序 df_sorted <- df[order( -is_letter, ifelse(is_letter, df$Col2, NA_character_), ifelse(!is_letter, as.numeric(df$Col2), NA_real_) ), ]
如果需要适配大小写混合的字母内容,可在排序前统一将Col2转为小写/大写后再做判断和排序即可。
内容的提问来源于stack exchange,提问作者Anneke
相关产品推荐
相关产品推荐

