表按月排序

时间:2017-12-29 20:15:52

标签: matlab sorting

我在MATLAB中有一个表,前三列中有属性,第四列中有数据。我试图根据前三列对整个表进行排序。但是,其中一列(C列)包含月份(' 1月',' 2月' ...等)。 sortrows函数只允许我选择“提升”。或者'下降'但不是按月排序的自定义选项。任何帮助将不胜感激。以下是我使用的代码。

sortrows(表格,{' A栏',' B栏',' C栏'},{'提升',& #39;提升',' ???'})

1 个答案:

答案 0 :(得分:0)

正如@ AnonSubmitter85建议的那样,您可以做的最好的事情是将月份名称转换为1(1月)到12(12月)的数值,如下所示:

c = {
  7 1 'February';
  1 0 'April';
  2 1 'December';
  2 1 'January';
  5 1 'January';
};

t = cell2table(c,'VariableNames',{'ColumnA' 'ColumnB' 'ColumnC'});
t.ColumnC = month(datenum(t.ColumnC,'mmmm'));

这有助于您ColumnC访问标准排序标准(在此示例中为ascending):

t = sortrows(t,{'ColumnA' 'ColumnB' 'ColumnC'},{'ascend', 'ascend', 'ascend'});

如果由于我们未知的任何原因,您被迫将您的月份保留为文字,您可以使用一种解决方法,该方法包括使用上述方法对表的克隆进行排序,然后应用于结果索引:

c = {
  7 1 'February';
  1 0 'April';
  2 1 'December';
  2 1 'January';
  5 1 'January';
};

t_original = cell2table(c,'VariableNames',{'ColumnA' 'ColumnB' 'ColumnC'});

t_clone = t_original;
t_clone.ColumnC = month(datenum(t_clone.ColumnC,'mmmm'));
[~,idx] = sortrows(t_clone,{'ColumnA' 'ColumnB' 'ColumnC'},{'ascend', 'ascend', 'ascend'});

t_original = t_original(idx,:);
相关问题