如何对某些排序列使用自定义(即非标准)排序顺序对表行进行排序?
例如,下面的显示显示了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);
发布于 2014-02-14 16:02:03
我也回答细胞的问题,和丹尼尔一样。
我的方法:
ismember
的第二个输出来完成这个任务。sort
的第二个输出,它告诉排序对应的行的重新排序。发布于 2014-02-14 13:35:11
我为细胞回答这个问题,因为我的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,:)
也许你也可以把这个应用到桌子上。对于Enum来说是一个很好的任务,但是Matlab不支持Enum。
https://stackoverflow.com/questions/21789443
复制相似问题