Sélectionnez les lignes d'une table de données en utilisant les lignes d'une autreBonjour la communauté JMP,
J'ai deux tables de données différentes où elles partagent une colonne en commun, Numéro de lot (Lot en abrégé). (Exécutant JMP Pro 14.1.0 sur W10)
Les tableaux de données proviennent de deux sources différentes et contiennent un nombre de lignes différent. Je souhaite utiliser l'une des tables de données pour sélectionner les lignes correspondantes dans l'autre table de données. Les valeurs dans Lot sont continues/numériques. dt1 a 1430 lignes et dt2 en a 158. Il y a plus de lots dans dt1 que dans dt2, je dois donc utiliser dt2 pour sélectionner uniquement les lots correspondants dans dt1.
Je pensais pouvoir faire un simple : dt1<
Je pense que je peux le faire en utilisant deux boucles for, où pour chaque ligne de dt1, cela parcourrait dt2 pour voir où elles sont égales, malheureusement cela aboutit à 225940 comparaisons, ce que je pensais être facile, mais cela prend beaucoup plus de temps à JMP. que je ne l'imaginais.
Voici le code de sélection que j'ai écrit :
For(l=1, l<=NRows(dt1), l++,
For(i=1, 1<=NRows(dt2), i++,
dt1<<SELECT where=""></SELECT>Mais ça ne marche pas. Il semble être pris dans une boucle infinie (il a fallu forcer la fermeture de JMP).
J'ai fait un peu de lecture en écrivant ce post, et comme je dois conserver toutes les lignes précédemment sélectionnées, je dois invoquer l'option Current Selection("extend"). Donc, je sais avec certitude que le code ci-dessus ne fonctionnera pas, mais il aurait dû faire quelque chose.
Il doit y avoir un moyen plus rapide de faire cela que les For Loops, quelque chose de plus élégant.
Tout commentaire est très apprécié.
Merci!,
DS
Re : Sélectionner des lignes dans une table de données en utilisant les lignes d'une autreSalut @txnelson ,
J'ai essayé le deuxième et ça a très bien fonctionné ! Merci pour la solution.
DSRe : Sélectionner des lignes dans une table de données en utilisant les lignes d'une autreVoici 2 façons de procéder.La première méthode utilise votre approche, cependant, elle sera lente avec de grandes tables de données
Names Default To Here( 1 );
// create sample data
dtMain = New Table( "Main",
Add Rows( 2 ),
New Column( "lot",
Character,
"Nominal",
Set Values( {"a", "b", "c", "d", "e", "a", "b", "c"} )
)
);
dtSmall = New Table( "Small",
Add Rows( 2 ),
New Column( "lot",
Character,
"Nominal",
Set Values( {"a", "e"} ),
Set Display Width( 49 )
)
);
Names Default To Here( 1 );
dtMain << clear select;
For( i = 1, i <= N Rows( dtSmall ), i++,
dtMain << select where(
dtMain:Lot == dtSmall:Lot[i],
current selection( "extend" )
)
);
Le second fonctionnera plus efficacement
Names Default To Here( 1 );
// create sample data
dtMain = New Table( "Main",
Add Rows( 2 ),
New Column( "lot",
Character,
"Nominal",
Set Values( {"a", "b", "c", "d", "e", "a", "b", "c"} )
)
);
dtSmall = New Table( "Small",
Add Rows( 2 ),
New Column( "lot",
Character,
"Nominal",
Set Values( {"a", "e"} ),
Set Display Width( 49 )
)
);
// Create a new column as a Select indicator
dtSmall << New Column( "Select", set each value( 1 ) );
// Update the Main table with values from the Small table
dtMain << Update( With( dtSmall ), Match Columns( :lot = :lot ) );
// Select the matching columns
dtMain << select where( :select == 1 );
// get rid of select columns
dtMain << delete columns( "Select" );
dtSmall << delete columns( "Select" );