我正在尝试使用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'})