我有一个5x5表:
a b c d e
a 1 2 3 4 5
b 3 5 7 2 6
c 1 3 4 6 1
d 4 4 1 7 8
e 6 7 2 1 6
其中标题是字符串。
我想知道如何使用标头重新排序表行和列
所以例如我希望它们按照这个顺序e b c a d
,然后这将是表格:
e b c a d
e 6 7 2 6 1
b 6 5 7 3 2
c 1 3 4 1 6
a 5 7 3 1 4
d 8 4 1 4 7
答案 0 :(得分:5)
将表定义为
T = table;
T.a = [1 3 1 4 6].';
T.b = [2 5 3 4 7].';
T.c = [3 7 4 1 2].';
T.d = [4 2 6 7 1].';
T.e = [5 6 1 8 6].';
让新的所需订单
order = {'e' 'b' 'c' 'a' 'd'};
可以使用索引来重新排序表:
[~, ind] = ismember(order, T.Properties.VariableNames);
T_reordered = T(ind,order);
请注意:
T_reorderedCols = T(:,order);
T_reorderedRows = T(ind,:);
所以在这个例子中,
T =
a b c d e
_ _ _ _ _
1 2 3 4 5
3 5 7 2 6
1 3 4 6 1
4 4 1 7 8
6 7 2 1 6
T_reordered =
e b c a d
_ _ _ _ _
6 7 2 6 1
6 5 7 3 2
1 3 4 1 6
5 2 3 1 4
8 4 1 4 7
答案 1 :(得分:3)
以下是使用索引进行此操作的方法。您可以使用索引重新排列行和列,就像对任何数组一样。在这种情况下,我用headers
数组中的每个字母替换一个数字(最初为[1 2 3 4 5]
),然后使用定义新订单[5 2 3 1 4]
的向量,重新排序表。在处理较大的表时,您可以创建某种查找表来自动执行此操作:
clc
clear
a = [1 2 3 4 5;
3 5 7 2 6;
1 3 4 6 1;
4 4 1 7 8;
6 7 2 1 6];
headers = {'a' 'b' 'c' 'd' 'e'};
%// Original order. Not used but useful to understand the idea... I think :)
OriginalOrder = 1:5;
%// New order
NewOrder = [5 2 3 1 4];
%// Create table
t = table(a(:,1),a(:,2),a(:,3),a(:,4),a(:,5),'RowNames',headers,'VariableNames',headers)
作为使用函数table
手动创建表的一种不那么麻烦的替代方法,您可以使用(感谢@excaza)函数array2table
,这可以节省几个步骤:
t = array2table(a,'RowNames',headers,'VariableNames',headers)
无论哪种方式,使用新索引重新排列表格:
New_t = t(NewOrder,NewOrder)
输出:
t =
a b c d e
_ _ _ _ _
a 1 2 3 4 5
b 3 5 7 2 6
c 1 3 4 6 1
d 4 4 1 7 8
e 6 7 2 1 6
New_t =
e b c a d
_ _ _ _ _
e 6 7 2 6 1
b 6 5 7 3 2
c 1 3 4 1 6
a 5 2 3 1 4
d 8 4 1 4 7