R语言中order函数的平局打破机制及参数传递疑问
我明白你翻了不少类似问题还是搞不清order函数怎么靠后续参数打破平局,咱们就拿你贴的R文档示例一步步拆解,肯定能彻底搞明白。
首先先把三个向量的原始值列出来,方便对应每个位置的数值:
- x向量(位置1到10):
[1] 1 1 3 2 1 1 2 3 4 3 - y向量(位置1到10):
[1] 9 9 8 7 6 5 4 3 2 1 - z向量(位置1到10):
[1] 2 1 2 3 4 5 6 7 8 9
先搞懂order的核心规则
order函数的排序逻辑是优先级从左到右层层递进:
- 先按第一个参数(这里是x)升序排列,把相同值的位置归为一组
- 当某组里x的值相同(也就是出现平局),就用第二个参数(y)的升序来决定组内位置的先后
- 如果y也有相同值,再用第三个参数(z)的升序打破平局,以此类推
- 如果所有参数都用完还有平局,就按原始向量的索引升序排列(原位置靠前的排前面)
情况1:带z参数的完整调用 order(x, y, z)
咱们先拿x中值为1的位置开刀,这里平局最多,最容易看明白:
x中值为1的位置是:位置1、2、5、6(这四个位置的x值都是1,属于同一组)
现在看这四个位置对应的y值:
- 位置1的y:9
- 位置2的y:9
- 位置5的y:6
- 位置6的y:5
按y升序排的话,y值从小到大是5(位置6)→6(位置5)→9(位置1、2),所以这组里先排6、5,剩下的1和2因为y值相同,就得用z来打破平局了:
- 位置1的z:2
- 位置2的z:1
z升序的话1(位置2)更小,所以这两个的顺序是2→1。最终x=1的组排序是:6 →5 →2 →1,这和返回结果的前四个[1] 6 5 2 1完全对应。
接下来看x中值为2的位置:位置4、7
对应的y值分别是7和4,按y升序的话4(位置7)更小,所以顺序是7→4,对应结果里的7 4。
然后是x中值为3的位置:位置3、8、10
对应的y值是8、3、1,按y升序是1(位置10)→3(位置8)→8(位置3),所以顺序是10→8→3,对应结果里的10 8 3。
最后x中值为4的只有位置9,直接放在最后,对应结果的9。
把这些顺序连起来就是完整的返回结果:[1] 6 5 2 1 7 4 10 8 3 9,和文档里的输出完全匹配。
情况2:去掉z参数的调用 order(x, y)
还是先看x=1的四个位置:1、2、5、6
对应的y值是9、9、6、5,按y升序排是5(6)→6(5)→9(1)→9(2)。这时候因为没有z参数,当y值相同时(位置1和2的y都是9),就按原始索引升序排,也就是1→2,所以x=1的组排序变成:6 →5 →1 →2,这就对应了去掉z后的结果前四个[1] 6 5 1 2。
剩下的部分和带z的情况完全一致:
- x=2的位置4、7,y值7和4,顺序7→4
- x=3的位置3、8、10,y值8、3、1,顺序10→8→3
- x=4的位置9在最后
所以最终结果就是[1] 6 5 1 2 7 4 10 8 3 9,和你实际运行得到的结果完全对得上。
一句话总结
order就是先按第一个参数排,相同值的组内按第二个参数排,还相同就按第三个,以此类推;所有参数用完还有平局就按原位置升序排,是不是一下子就清晰了?
内容的提问来源于stack exchange,提问作者Youcheong Chang

