首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用自定义排序顺序的多键“`table/sortrows`”

使用自定义排序顺序的多键“`table/sortrows`”
EN

Stack Overflow用户
提问于 2014-02-14 13:01:21
回答 2查看 811关注 0票数 4

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

例如,下面的显示显示了sortrows的输出,包括所有排序列的标准排序顺序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>> 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值的排序顺序是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'red' < 'yellow' < 'green'

Suit值的值为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
diamonds < hearts < clubs < spades

以及让Parity保持原样的那一个。

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

(当然,行的重新排序必须遵守对sortrows的原始调用(即'TrafficLight' < 'Suit' < 'Parity')中指定的排序键优先级。)

PS:生成A的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-14 16:02:03

我也回答细胞的问题,和丹尼尔一样。

我的方法:

  1. 定义每个键的顺序。
  2. 用顺序索引替换字符串。您可以很容易地使用ismember的第二个输出来完成这个任务。
  3. 使用所需的排序键优先级对替换字符串的数组进行排序。存储sort的第二个输出,它告诉排序对应的行的重新排序。
  4. 将该重新排序应用于原始数组的行。 parityOrder ={‘偶数’,‘奇数’};%//步骤1 colorOrder ={‘红色’,‘黄色’,‘绿色’};suitOrder ={‘钻石’,‘心’,‘棍棒’,‘黑桃’};~,p=sortrows(A(:,1),parityOrder);%//步骤2 ~,c= ismember(A(:,2),colorOrder);%//步骤3结果= A(ii,:);%//步骤4
票数 2
EN

Stack Overflow用户

发布于 2014-02-14 13:35:11

我为细胞回答这个问题,因为我的Matlab不支持表格。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
%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,:)

也许你也可以把这个应用到桌子上。对于Enum来说是一个很好的任务,但是Matlab不支持Enum。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21789443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文