R语言中正负数值列表升序排序异常的解决方法问询
问题原因
你遇到的排序异常本质是因为col1列不是数值类型,而是字符类型,R按字符串的ASCII码规则排序,而非实际数值大小排序:
- 负号的ASCII码小于数字字符,所以所有带负号的字符串会排在正数前
- 字符串逐位比较字符大小,所以
-0.00会排在-1前、-1排在-2前,看起来就是从接近0的负数往更小的负数排序,负数字符串全部排完后才会轮到正数字符串按0、1、2的顺序升序,最终出现你观察到的不符合预期的结果。
解决方法
- 先确认列类型,运行代码查看:
class(df$col1)
如果返回结果为character即可验证上述判断。 - 将
col1转换为数值类型,转换前可先检查是否存在无法转换的无效值:sum(is.na(as.numeric(df$col1)))
如果返回值大于0,说明列中存在非数值内容,需要先清理无效值。 - 完成类型转换后再执行排序即可:
# 转换列类型 df$col1 <- as.numeric(df$col1) # 按数值升序排序 df1 <- df[order(df$col1), ]
如果使用dplyr包,也可以用更简洁的写法:
library(dplyr) df1 <- df %>% mutate(col1 = as.numeric(col1)) %>% arrange(col1)
内容的提问来源于stack exchange,提问作者SpiderK
相关产品推荐
相关产品推荐

