使用自定义排序顺序的多键“表/排序”

这个

如何使用某些排序列的自定义(即非标准)排序顺序对表的行进行排序?

例如,下面的显示显示的输出sortrows,其中具有所有排序列的标准排序顺序:

>> 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    

但让我们假设我希望TrafficLight的排序顺序为

'red' < 'yellow' < 'green'

一个Suit值是

diamonds < hearts < clubs < spades

Parity保持原样。

如何重新排序这些行,A以使新排序反映这些自定义排序顺序?

(当然,对行的重新排序必须遵守在原始调用中指定的排序键优先级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);
路易斯·门多

我也回答细胞,原因与丹尼尔相同。

我的方法:

  1. 定义每个键的顺序。
  2. 将字符串替换为其顺序索引。您可以使用的第二个输出非常轻松地执行此操作ismember
  3. 使用所需的排序键优先级对替换后的字符串数组进行排序。存储的第二个输出sort,该输出告知与排序相对应的行的重新排序。
  4. 将该重新排序应用于原始数组的行。

    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
    

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用自定义字母顺序排序

来自分类Dev

jQuery按自定义顺序对HTML表进行排序

来自分类Dev

如何按自定义顺序对SAS表进行排序?

来自分类Dev

使用自定义顺序对行重新排序

来自分类Dev

Swift:使用自定义顺序按键对字典进行排序

来自分类Dev

使用自定义顺序在 MongoDB shell 中排序

来自分类Dev

SSRS报告自定义排序顺序

来自分类Dev

对象数组的自定义排序顺序

来自分类Dev

SQLALchemy自定义整数排序顺序

来自分类Dev

自定义排序(非字母顺序)

来自分类Dev

枚举字段的自定义排序顺序

来自分类Dev

对象数组的自定义排序顺序

来自分类Dev

SSRS报告自定义排序顺序

来自分类Dev

以自定义顺序对 Arraylist 进行排序

来自分类Dev

使用多列的CGridCtrl自定义排序

来自分类Dev

自定义排序Dataframe的多列

来自分类Dev

使用jQuery的HTML表行自定义排序

来自分类Dev

使用 JQuery 数据表进行自定义排序

来自分类Dev

Stata:使用自定义排序顺序对数据集进行排序

来自分类Dev

如何使用下划线根据自定义排序顺序对对象数组进行排序

来自分类Dev

如何使用自定义排序顺序在angular js中对对象进行排序?

来自分类Dev

使用Google脚本对Google表格中的数据进行排序(具有自定义排序顺序)

来自分类Dev

排序表自定义td属性

来自分类Dev

使用自定义顺序按字母顺序对数组进行排序

来自分类Dev

自定义排序`by =`

来自分类Dev

将自定义排序顺序添加到数据透视表

来自分类Dev

按照自定义顺序重新排序表中的行

来自分类Dev

使用熊猫自定义排序

来自分类Dev

使用orderBy的AngularJS自定义排序