重新排序表行和列Matlab

时间:2015-04-13 13:57:11

标签: matlab

我有一个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

2 个答案:

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