Multikey `table / sortrows` using custom sort orders

How to sort table rows using custom (i.e. custom) sort orders for some sort columns?

For example, the following figure shows the output sortrowscontaining standard sort orders for all sort columns:

>> sortrows(A, {'TrafficLight', 'Suit', 'Parity'})
ans = 
    Parity    TrafficLight      Suit      order    prevalence
    ______    ____________    ________    _____    __________
    even      'green'         hearts      49       0.5025    
    even      'green'         hearts      64       0.5318    
    even      'green'         hearts      67       0.7896    
    odd       'green'         hearts       4       0.6374    
    odd       'green'         hearts      11       0.3354    
    odd       'green'         hearts      59       0.8644    
    even      'green'         spades      35       0.6674    
    odd       'green'         spades      64       0.4348    
    even      'red'           diamonds    69       0.5751    
    even      'red'           diamonds    77       0.6318    
    even      'red'           diamonds    89       0.2629    
    even      'red'           diamonds    92       0.2596    
    even      'red'           diamonds    98       0.3578    
    odd       'red'           diamonds    69       0.2911    
    odd       'red'           diamonds    74       0.3343    
    even      'red'           hearts      19       0.5695    
    odd       'red'           hearts      51       0.9122    
    even      'red'           spades      38       0.9837    
    odd       'red'           spades      22       0.5587    
    even      'yellow'        clubs       22       0.6917    
    odd       'yellow'        diamonds     1       0.2064    
    odd       'yellow'        diamonds    25       0.8257    
    odd       'yellow'        spades      33       0.2653    
    odd       'yellow'        spades      38       0.2549    

But suppose I want the sort order for the values โ€‹โ€‹to TrafficLightbe

'red' < 'yellow' < 'green'

value for Suitshould be

diamonds < hearts < clubs < spades

but for Paritythat will remain the one that is.

How can I reorder strings Aso that the new ordering reflects these custom sort orders?

(, , , sortrows, 'TrafficLight' < 'Suit' < 'Parity'.)


PS: A:

kvs = {'Parity', 'TrafficLight', 'Suit'};
A = cell2table({
                'odd', 'yellow', 'diamonds', 1, 0.2064;
                'odd', 'green', 'hearts', 4, 0.6374;
                'odd', 'green', 'hearts', 11, 0.3354;
                'even', 'red', 'hearts', 19, 0.5695;
                'even', 'yellow', 'clubs', 22, 0.6917;
                'odd', 'red', 'spades', 22, 0.5587;
                'odd', 'yellow', 'diamonds', 25, 0.8257;
                'odd', 'yellow', 'spades', 33, 0.2653;
                'even', 'green', 'spades', 35, 0.6674;
                'even', 'red', 'spades', 38, 0.9837;
                'odd', 'yellow', 'spades', 38, 0.2549;
                'even', 'green', 'hearts', 49, 0.5025;
                'odd', 'red', 'hearts', 51, 0.9122;
                'odd', 'green', 'hearts', 59, 0.8644;
                'even', 'green', 'hearts', 64, 0.5318;
                'odd', 'green', 'spades', 64, 0.4348;
                'even', 'green', 'hearts', 67, 0.7896;
                'even', 'red', 'diamonds', 69, 0.5751;
                'odd', 'red', 'diamonds', 69, 0.2911;
                'odd', 'red', 'diamonds', 74, 0.3343;
                'even', 'red', 'diamonds', 77, 0.6318;
                'even', 'red', 'diamonds', 89, 0.2629;
                'even', 'red', 'diamonds', 92, 0.2596;
                'even', 'red', 'diamonds', 98, 0.3578
               }, 'VariableNames', ...
               [kvs {'order', 'prevalence'}]);
A.Parity = categorical(A.Parity);
A.Suit = categorical(A.Suit);
+4
2

, .

:

  • .
  • . , ismember
  • . sort, , .
  • .

    parityOrder = {'even','odd'}; %// step 1
    colorOrder = {'red','yellow','green'};
    suitOrder = {'diamonds','hearts','clubs','spades'};
    
    [~, p] = ismember(A(:,1),parityOrder); %// step 2
    [~, c] = ismember(A(:,2),colorOrder);
    [~, s] = ismember(A(:,3),suitOrder);
    
    [~, ii] = sortrows([p c s],[2 3 1]); %// step 3
    
    result = A(ii,:); %// step 4
    
+2

, Matlab .

%define an order:
colororder=@(x)(strcmp(x,'red')+strcmp(x,'yellow')*2+strcmp(x,'green')*3)
%get sorted indices
[~,ix]=sort(colororder(A(:,2)))
%sort:
A(ix,:)

, . Enums, Matlab Enums.

+2

Source: https://habr.com/ru/post/1527023/


All Articles