如何对基于两列的矩阵排序



我正在尝试使用MATLAB对基于两列的单元格矩阵进行排序:

ticker date price
msft 1/9/11 19.8
msft 1/8/11 18.7
csco 1/8/11 9.8
csco 1/9/11 10.0

我想先按日期然后按股票排序,所以我想要的结果是:

ticker date price
csco 1/8/11 9.8
msft 1/8/11 18.7
csco 1/9/11 10.0
msft 1/9/11 19.8

有人知道我怎么做吗?谢谢。

我将使用datenum将日期列转换为相应的串行日期号,并使用sortrows按照所需的顺序对数据进行排序。

下面是一些代码;假设d是你的4x3单元数组从你给的例子:

d = 
'msft'    '1/9/11'    [19.8000]
'msft'    '1/8/11'    [18.7000]
'csco'    '1/8/11'    [ 9.8000]
'csco'    '1/9/11'    [     10]
  • 使用arrayfun将日期列转换为数字

    d(:,2) = arrayfun(@(x){datenum(x)},d(:,2));
    
  • sortrows排序矩阵(日期先,股票代码后)

    d = sortrows(d,[2 1]);
    
  • 将日期替换为字符串datestr

    d(:,2) = arrayfun(@(x){datestr(x{1},'mm/dd/yy')},d(:,2));
    

将两个单元格数组连接为单个字符串单元格数组。对生成的字符串单元格数组进行排序,并获得索引的顺序。使用这些索引对原始单元格数组进行排序

a = {'1', '2', '2', '3'}
b = {'a', 'b', 'a', 'a'}
for i = 1:length(a)
   ab{i} = [a{i},b{i}]
end
[s,si] = sort(ab);
sorted_a = a(si);
sorted_b = b(si);

按照Jacob的建议,如果您使用的日期格式不能按字母顺序排序,您可以替换

   ab{i} = [a{i},b{i}]

   ab{i} = [num2str(datenum(a{i})),b{i}]

使用类似于@Jacob的想法,这里是一个稍微简单的解决方案:

%# your cell array
d = {
    'msft' '1/9/11' 19.8
    'msft' '1/8/11' 18.7
    'csco' '1/8/11'  9.8
    'csco' '1/9/11' 10.0
};
%# extract 2 columns, convert to serial date, sort, apply order to original data
[~,idx] = sortrows([datenum(d(:,2),'mm/dd/yy') cell2mat(d(:,3))], [1 2]);
d = d(idx,:)

:

d = 
    'msft'    '1/9/11'    [19.8]
    'msft'    '1/8/11'    [18.7]
    'csco'    '1/8/11'    [ 9.8]
    'csco'    '1/9/11'    [  10]

:

d = 
    'csco'    '1/8/11'    [ 9.8]
    'msft'    '1/8/11'    [18.7]
    'csco'    '1/9/11'    [  10]
    'msft'    '1/9/11'    [19.8]
[tblB,index] = sortrows(tblA,{'Height','Weight'},{'ascend','descend'})

具体情况:

ticker date price
msft 1/9/11 19.8
msft 1/8/11 18.7
csco 1/8/11 9.8
csco 1/9/11 10.0

,

[tblB,index] = sortrows(tblA,{'date','price'},{'ascend','descend'})

相关内容

  • 没有找到相关文章

最新更新