《R for Data Science》中排序函数示例的技术疑问咨询
R中排序函数的疑问解答
先回顾示例代码:
y <- c(1, 2, 2, NA, 3, 4) min_rank(y) #> [1] 1 2 2 NA 4 5 min_rank(desc(y)) #> [1] 5 3 3 NA 2 1 row_number(y) #> [1] 1 2 3 NA 4 5 dense_rank(y) #> [1] 1 2 2 NA 3 4 percent_rank(y) #> [1] 0.00 0.25 0.25 NA 0.75 1.00 cume_dist(y) #> [1] 0.2 0.6 0.6 NA 0.8 1.0
具体疑问解答
1. min_rank函数:结果中的5来自哪里?为何NA没有排在最后?
min_rank的核心规则是:给相同值分配最小的可能排名,排名会跳过重复值占用的位置。
对y的非NA值从小到大看:1是第1名;两个2占了第2、3名;3就只能排第4名;4自然是第5名,所以结果里4对应的排名是5。- NA的处理:
min_rank默认保留NA在原始向量中的位置,不会自动将其排到末尾。如果需要把NA放最后,可添加参数min_rank(y, na.last = TRUE)。
2. min_rank(desc(y)):结果中为何出现两个3而非两个2?
desc(y)会把y倒序处理,倒序后的非NA值为4,3,2,2,1。- 按照
min_rank的规则,倒序后相同值取最小排名:- 4是最大的,排第1;
- 3排第2;
- 两个2是倒序里的第三大值,它们的最小可能排名是3;
- 1排第5。
对应原始y的顺序,两个2的位置就会返回3,所以结果出现两个3。
3. row_number函数:仍对NA的位置存在困惑,且为何结果不是6个数值?
row_number的规则是给每个非NA值分配唯一的连续排名,即使值重复也会得到不同序号,相当于给非NA值按出现顺序编位置号。- 结果里其实是6个元素:5个数值+1个NA。NA的位置会直接返回NA,不会被替换成数字,所以看起来像是少了一个数值,但实际长度和原向量一致。
内容的提问来源于stack exchange,提问作者Nicole Petrovic
相关产品推荐
相关产品推荐

