gtools包mixedsort处理十进制值不符合预期问题问询
解决gtools::mixedsort排序不符合预期的问题
我来帮你搞定这个排序问题!你遇到的问题根源在于错误地混用了mixedsort和order函数,导致计算出来的rank完全不符合预期。
问题分析
你的代码里用了:
df$rank = as.numeric(as.character(order(mixedsort(df$buckets))))
这里的逻辑是先对buckets向量做自然排序得到一个新向量,然后对这个已经排好序的向量再调用order——这其实得到的是排序后向量自身的顺序索引(也就是1到8的序列),和原向量中每个元素的实际排名没有关系,自然会出现2.5和7.5的排名错误。
正确解决方案
应该使用gtools包中的mixedorder函数,它专门用来返回向量按自然排序规则的索引位置,直接用它就能正确计算每个元素的排名:
library(gtools) df <- data.frame(matrix(ncol = 1, nrow = 8)) colnames(df) <- "buckets" buc <- c("-Inf","0.5","1.5","2.5","7.5", "11.5", "27.5", "Inf") df$buckets <- as.character(buc) # 使用mixedorder获取正确的排序索引,直接得到每个元素的排名 df$rank <- mixedorder(df$buckets) print(df)
运行这段代码后,你会看到2.5的rank是4,7.5的rank是5,完全符合你的预期。
补充说明
mixedsort(x):返回排序后的向量本身mixedorder(x):返回原向量中每个元素在排序后的位置索引,这才是你需要用来计算排名的工具
内容的提问来源于stack exchange,提问作者rapunzel
相关产品推荐
相关产品推荐

