2017-12-29 40 views
0

Ich habe eine Tabelle in MATLAB mit Attributen in den ersten drei Spalten und Daten aus der vierten Spalte ab. Ich habe versucht, die gesamte Tabelle anhand der ersten drei Spalten zu sortieren. Eine der Spalten (Spalte C) enthält jedoch Monate ('Januar', 'Februar' usw.). Die sortrows-Funktion würde mir nur erlauben, "aufzusteigen" oder "abzusteigen", aber keine benutzerdefinierte Option, um nach Monat zu sortieren. Jede Hilfe würde sehr geschätzt werden. Unten ist der Code, den ich benutzt habe.Tabelle sortieren nach Monat

Methode sortRows (Tabelle, { 'Spalte A', 'Spalte B', 'Spalte C'}, { 'Ascend', 'Ascend', '???'})

+0

Die Monate nach Zahlen und nicht nach Namen darstellen. – AnonSubmitter85

Antwort

0

Wie @ AnonSubmitter85 vorgeschlagen, das beste, was Sie tun können, ist Ihre Monatsnamen in numerischen Werten von 1 (Januar) bis 12 (Dezember) zu konvertieren, wie folgt:

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')); 

Dies wird für Ihre ColumnC auch den Zugang zu einem Standard-Sortierkriterium erleichtern (in diesem Beispiel ascending):

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

Wenn Sie aus irgendeinem uns unbekannten Grund gezwungen sind, Ihre Monate als Literale zu behalten, können Sie eine Problemumgehung verwenden, die darin besteht, einen Klon der Tabelle nach dem oben beschriebenen Ansatz zu sortieren und dann anzuwenden die resultierenden Indizes:

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,:);