Problem
Sie müssen eine Tabelle mit einer oder mehreren Spalten als Sortierschlüssel sortieren.
Lösung
Verwenden Sie die Sortiermethode der Tabelle, die aufsteigende und absteigende Reihenfolge sowie direkte oder neue Tabellensortierung unterstützt.
// run these lines, one at a time, to see the effects
// (place the cursor on the line and use the Enter key
// on the numeric keypad to easily submit the line.)
dt = Open( "$sample_data/big class.jmp" );
// example 1: makes a new table
new table = dt << sort( by( height, weight ) );
Wait( 2 );
Close( new table, nosave );
// example 2: updates table in place
dt << sort( by( height, weight ), order( descending ), replace table );
Wait( 2 );
Close( dt, nosave );
// example 3: keep a column of original row order
dt = Open( "$sample_data/big class.jmp" );
orig = dt << New Column( "original row", formula( Row() ) );
dt << runFormulas; // make sure the background formula evaluation is done, then
orig << deleteFormula; // delete the formula so it won't run after the sort (!)
dt << sort( by( height, weight ), order( descending ), replace table );
Wait( 2 );
dt << sort( by( orig ), order( ascending ), replace table );
Wait( 2 );
Close( dt, nosave );
Diskussion
Das letzte Beispiel zeigt das Hinzufügen einer neuen Spalte zum Erfassen der ursprünglichen Sortierreihenfolge und die Verwendung dieser neuen Spalte zum Wiederherstellen der ursprünglichen Reihenfolge. Die Dokumentation zeigt eine weitere nützliche Option zum Benennen der Tabelle.
new table = dt << sort( by( height, weight ), Output Table Name("Fred") );
Siehe auch
Dokumentation
Guter Punkt. Anstatt für jede Zeile eine Formel auszuwerten und dann die Formel zu entfernen, erstellen Sie einfach die Sequenz als Matrix (den ::-Operator) und initialisieren Sie die Spalte direkt. Danke!
Ich denke, die Aussage
orig = dt << New Column( "original row", formula( Row() ) );
dt << runFormulas; // make sure the background formula evaluation is done, then
orig << deleteFormula; // delete the formula so it won't run after the sort (!)
effizienter sein als
dt << New Column( "original row", set values( 1::(N Rows(dt)) );
.
Danke für das Beispiel!