我正在尝试使用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
任何人都知道我该怎么做?感谢。
答案 0 :(得分:5)
我会使用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]
答案 1 :(得分:1)
将两个单元格数组连接成一个单元格的字符串数组。对结果的字符串数组进行排序,并获得指标的顺序。使用这些指标对原始单元格数组进行排序
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);
按照雅各布的建议,如果您使用的日期格式不能按字母顺序排序,则可以替换
ab{i} = [a{i},b{i}]
与
ab{i} = [num2str(datenum(a{i})),b{i}]
答案 2 :(得分:0)
使用与@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]
答案 3 :(得分:0)
[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'})