MATLAB和R语言中几个向量秩序排列的相关函数

写在前面

    • MATLAB
      • 1. **sort函数**
      • 2. **unique函数**
      • 3. **tiedrank函数**
    • R语言
      • **1.sort**
      • **2.rank**
    • 参考文献

最近处理数据用到了向量结构秩序排列的问题,现将R语言与MATLAB中我用到的一些函数简要总结如下:

MATLAB

MATLAB用到一些函数及代码。

1. sort函数

将X的各个元素按递增(递减)顺序排序。

     X = [3 7 5 0 4 2];
     [X1,IX]=sort(X)
     
%%%%%%%%%  结果如下:%%%%%%%%%%%%%%%%
    X1 =

     0     2     3     4     5     7


    IX =

     4     6     1     5     3     2  

X1为排序后的X序列:IX为IX中每个元素在X中对应的位置。

2. unique函数

删除X中重复的元素,同时对新得到数列进行排序。

        a = [9 9 9 9 9 9 8 8 8 8 7 7 7 6 6 6 5 5 4 2 1];
        [c1,ia1,ic1] = unique(a)
        
        % returns
        c1 = [1 2 4 5 6 7 8 9]
        ia1 = [21 20 19 17 14 11 7 1]'
        ic1 = [8 8 8 8 8 8 7 7 7 7 6 6 6 5 5 5 4 4 3 2 1]'

其中,c1为删除重复元素后的排序结果,ia1,ic1为标记向量,满足 c1 = a(ia1) and a = c1(ic1)。

[c2,ia2,ic2] = unique(a,'stable')
        % returns
        c2 = [9 8 7 6 5 4 2 1]
        ia2 = [1 7 11 14 17 19 20 21]'
        ic2 = [1 1 1 1 1 1 2 2 2 2 3 3 3 4 4 4 5 5 6 7 8]'

stable的作用是c2与ia2一一对应。
类似的last命令如下(默认为first),

A=[1 2 3 1 2;4 5 6 4 5]
[C,IA,IC] = unique(A,'last')

  % returns
  C=[ 1     2     3     4     5     6]'
  IA=[7     9     5     8    10     6]'
  IC=[1     4     2     5     3     6     1     4     2     5]'

%如果改成默认的first
[C,IA,IC] = unique(A,'first')
C=[ 1     2     3     4     5     6]'    %同last
 IA=[1     3     5     2     4     6]'
 IC=[1     4     2     5     3     6     1     4     2     5]'  %同last

注意,IA中为A中最后一次出现元素所在的位置,如C=1,对应A中的第7个元素,即最后一个1出现的位置。

3. tiedrank函数

tie的中文术语CNKI翻译助手没找到(打平?),大致意思是向量中排序符号的方式,尤其是数列中具有相同的元素。该函数计算了向量X中每个元素的排序,如果任何X值是并列的,tiedrink计算它们的平均排名。

[R,TIEADJ] = tiedrink (X,1)

R为向量X中值的rank,TIEADJ是计算Kendall’s tau所需的领带的三个调整向量。tiedrunk (X,0)和tiedrunk (X)是等效的。

R语言

1.sort

同MATLAB差别不大,详见 ?sort。

sort(x, decreasing = FALSE, na.last = NA, ...)

2.rank

函数的表达形式如下,

rank(x, na.last = TRUE,
     ties.method = c("average", "first", "last", "random", "max", "min"))

x 为数据向量,na.last对x中NA值的处理方法。重点介绍下ties.method这个选项。
first—表示得到的索引为递增(不重复)序列。通过下面的例子可以看出重复的元素都有一个独一无二的序号。

 a<-c(2,0,2,1,2,1)
 rank(a,ties.method = "first")
 #输出结果
 #[1] 4 1 5 2 6 3

first—表示得到的索引为递减(不重复)序列。同时可注意到a中重复元素的秩序与上边不同,第一个出现的2,秩序为6。

> rank(a,ties.method = "last")
#[1] 6 1 5 3 4 2

同理,average 、max、min的计算结果可参考下边的例子。

> rank(a,ties.method = "average")
#[1] 5.0 1.0 5.0 2.5 5.0 2.5

> rank(a,ties.method = "max")
#[1] 6 1 6 3 6 3

> rank(a,ties.method = "min")
#[1] 4 1 4 2 4 2

rank() 和 tiedrank() 函数都默认 averages作为rank ties 。举例[10 20 30 40 20] 带入这两个函数后 的结果均为[1.0 2.5 4.0 5.0 2.5] 。

总的来说,R语言的函数更加丰富一些,实现的功能也较MATLAB齐全。

参考文献

【1】https://stackoverflow.com/questions/46961068/matlab-equivalent-of-the-r-function-rank
【2】https://ww2.mathworks.cn/help/matlab/ref/unique.html?s_tid=srchtitle
【3】https://ww2.mathworks.cn/help/stats/tiedrank.html?s_tid=doc_ta

你可能感兴趣的:(MATLAB和R语言中几个向量秩序排列的相关函数)