Problème
Vous devez trier un tableau en utilisant une ou plusieurs colonnes comme clé de tri.
Solution
Utilisez la méthode de tri du tableau, qui prend en charge l'ordre croissant et décroissant et le tri sur place ou nouveau tableau.
// 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 );
Discussion
Le dernier exemple montre comment ajouter une nouvelle colonne pour capturer l'ordre de tri d'origine et comment utiliser cette nouvelle colonne pour restaurer l'ordre d'origine. La documentation montre une autre option utile pour nommer la table.
new table = dt << sort( by( height, weight ), Output Table Name("Fred") );
Voir également
Documentation
Bon point. Plutôt que d'évaluer une formule pour chaque ligne, puis de supprimer la formule, créez simplement la séquence sous forme de matrice (l'opérateur ::) et initialisez directement la colonne. Merci!
je pense que la déclaration
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 (!)
être plus efficace que
dt << New Column( "original row", set values( 1::(N Rows(dt)) );
.
Merci pour l'exemple !