最近在看GSEA的1.0源码,对order仔细的看了一下,觉得应该写下来。
order的官方说它返回一个能将参数排序的permutation。
order的行为是:(A)返回新有序列对应位置的元素在原序列中的索引号,也就
是位置;有些情况下我们会认为order(B)返回原序列对应位置的元素在新序列
中的位置:秩(rank),这是不对的,两者不等价。
例如
> a<-sample(seq(1:10),5)
> a
[1] 1 4 9 8 3
> a.order<-order(a)
> a.order
[1] 1 5 2 4 3 #可以看到返回值是(A)所述的情况,(B)所述的情况为 1 3 5 4 2
(B)所述的情况可以用下面的两种操作得到
> a.sort<-sort(a)
> match(a,a.sort)
[1] 1 3 5 4 2
> rank(a)
[1] 1 3 5 4 2
同时order函数等价于
不要搞混
有趣的是:1,不论一个vector A有序还是无序,
执行A[order(A)]将得到sort(A)的结果。
也就是说,在操作上,vec[order(vec)]与
sort(vec)等价。
2,order运算性质:
order(a)
∈(1,length(a)) 奇数次order运算的结果相同,偶数次order运算结果相同
> a<-sample(seq(1:10),5,replace=F)
> sort(a)
[1] 1 3 4 5 8
> a[order(a)]
[1] 1 3 4 5 8
order(a)
[1] 4 1 2 5 3
> order(order(a))
[1] 2 3 5 1 4
> order(order(order(a)))
[1] 4 1 2 5 3
> order(order(order(order(a))))
[1] 2 3 5 1 4
总结:
order <==> match(a.sort,a)
rank <==> match(a,a.sort)