1

我有一个60x6矩阵X,其中第 1 列是索引,第 2 到 6 列是该特定索引的数据。我想为数据列中的每个值分配排名,以便第 2 到第 5 列按降序排列(最高值排名第 1,最低值排名第 60),第 6 列按降序排列(最低值排名1,最高排名60),但这样的行顺序是根据索引保持的(第1列)。排名关系的排名等于其按值升序排列的位置平均值。

我查看了许多建议(这里这里这里)并尝试了我自己的版本:

[~,Z1] = sort(X(:,2),'descend');
[~,Z2] = sort(X(:,3),'descend');
[~,Z3] = sort(X(:,4),'descend');
[~,Z4] = sort(X(:,5),'descend');
[~,Z5] = sort(X(:,6));

但似乎没有一个按我希望的方式工作。因此对于

    X =

        1    0.9503    0.5646    0.3785    0.5468   -0.0161     
        2    0.9430    0.5728    0.3320    0.6693   -0.0161
        3    0.5305    0.2719    0.1545    0.3480    0.0042
        4    0.8588    0.5816    0.3429    0.6477   -0.0158
        5    0.9391    0.5984    0.3362    0.6054   -0.0161
        6    0.3780    0.2307    0.0906    0.3387    0.0054

我需要

    Ans = 

         1   1   4   1   4   2
         2   2   3   4   1   2
         3   5   5   5   5   5
         4   4   2   2   2   4
         5   3   1   3   3   2
         6   6   6   6   6   6
4

1 回答 1

0

我找到了一个有点笨拙但可行的解决方案来解决我的问题。

它涉及分别为每列数据提取、排序和分配排名,然后在另一个表中重新组合排名。

Arank = sortrows(X(:,1:2),-2);       % sort data in descending (or ascending) order
Arank(:,3)=1:60;                     % assign rank
Arank = sortrows(Arank,1);           % re-sort by index
% % same process is applied individually to each column
Allranks = horzcat(Arank(:,[1,3]), Brank(:,3),... 
Crank(:,3), Drank(:,3), Erank(:,3)); % combine all ranks sorted by index

然而,这加起来总共有 20 行代码,所以任何更优雅的替代品都会很受欢迎!

于 2013-05-15T09:58:48.130 回答