Problem
Sie müssen eine Tabelle mit einer oder mehreren Spalten als Sortierschlüssel sortieren.
Lösung
Verwenden Sie die sort-Methode 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 wie diese neue Spalte verwendet wird, um die ursprüngliche Reihenfolge wiederherzustellen. Die Dokumentation zeigt eine weitere nützliche Möglichkeit, die Tabelle zu benennen.
new table = dt << sort( by( height, weight ), Output Table Name("Fred") );
Siehe auch
Dokumentation
Guter Punkt. Anstatt eine Formel für jede Zeile auszuwerten und dann die Formel zu entfernen, erstellen Sie einfach die Sequenz als Matrix (der ::-Operator) und initialisieren 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!