Как отсортировать матрицу на основе двух столбцов - PullRequest
2 голосов
/ 13 июля 2011

Я пытаюсь отсортировать матрицу ячеек на основе двух столбцов, используя 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

Кто-нибудь знает, как я могу это сделать?БЛАГОДАРЯ.

Ответы [ 4 ]

5 голосов
/ 13 июля 2011

Я бы преобразовал столбец даты в соответствующий порядковый номер даты с 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));
    
1 голос
/ 13 июля 2011

объединяет два массива ячеек в один массив строк.Отсортируйте результирующий массив ячеек строк и получите порядок указаний.Используйте эти индикаторы для сортировки исходных массивов ячеек

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}]
0 голосов
/ 01 июля 2017
[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'})
0 голосов
/ 15 июля 2011

Используя идею, аналогичную @ 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...