如何使用某些排序列的自定义(即非标准)排序顺序对表的行进行排序?
例如,下面的显示显示的输出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);
我也回答细胞,原因与丹尼尔相同。
我的方法:
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句