Problème
Problème 1 : J'ai besoin d'obtenir une liste des valeurs uniques dans une colonne de table de données.
Problème 2 : J'ai besoin d'obtenir une liste des valeurs uniques dans une structure de données JSL (liste ou matrice)
Solution
Pour le problème 1 :
Solution 1 : Utiliser des tableaux récapitulatifs.Le JSL ci-dessous montre comment utiliser Summary() pour obtenir une table qui aura une ligne avec chaque valeur unique dans une seule colonne.Vous pouvez ensuite effectuer d'autres commandes de table JSL pour obtenir ces valeurs à partir de la table récapitulative.
_dt = Open( "$sample_data/big class.jmp" );
//create a summary table of the :sex column
_dt1 = _dt << Summary(
Group( :sex ),
Freq( "None" ),
Weight( "None" )
);
//create a summary table of the :age column
_dt2 = _dt << Summary(
Group( :age ),
Freq( "None" ),
Weight( "None" )
);
<SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="2-13-2018 5-22-08 PM.png" style="width: 280px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="2-13-2018 5-22-08 PM.png" style="width: 280px;"><span class="lia-inline-image-display-wrapper" image-alt="2-13-2018 5-22-08 PM.png" style="width: 280px;"><img src="https://us.v-cdn.net/6038925/uploads/images/9328i5A075F342798D202/2-13-2018%205-22-08%20PM.png" role="button" title="2-13-2018 5-22-08 PM.png" alt="2-13-2018 5-22-08 PM.png" /></span></SPAN></SPAN>
Problème 2 :
Maintenant, au lieu d'une table de données, vous avez une liste ou une matrice JMP :
sexlist = {"F", "M", "M", "F", "F", "M", "M", "F", "M"};
agelist = [14, 11, 12, 13, 15, 17, 15, 11, 12];les moyens compliqués de le faire seraient:
a) placez les valeurs de la liste dans une nouvelle colonne de la table de données, puis utilisez l'approche récapitulative, OU
b) écrire une boucle for quelque peu compliquée pour rechercher et enregistrer des valeurs uniques
Heureusement, il existe un moyen plus simple, en utilisant des tableaux associatifs.
Associative Array(sexlist) << Get Keys;
Associative Array(agelist) << Get Keys;
renvoie {"F", "M"} et {11, 12, 13, 14, 15, 17}, respectivement (notez que ce sont de belles listes triées !).Si vous souhaitez que les valeurs numériques soient triées, vous pouvez utiliser
Matrix(Associative Array(agelist) << Get Keys);
qui renvoie [11, 12, 13, 14, 15, 17].
Cette approche peut également être utilisée à la place de la solution 1 pour le problème 1 :
Problème 1, Solution 2 :Associative Array(Column(_dt, "sex") << Get Values) << Get Keys;<BR />Matrix(Associative Array(Column(_dt, "age")<< Get Values)<<GET keys=""></GET>
Retour {"F", "M"} et [11, 12, 13, 14, 15, 17]., respectivement. Ce que cela fait est
- obtenir les valeurs de la colonne spécifiée sous forme de liste (si la colonne est de type caractère) ou de matrice (si la colonne est numérique)
- transformer cette liste ou matrice en un tableau associatif
- obtenir les clés du tableau associatif, qui dans ce cas sont les niveaux uniques des valeurs de la colonne, en les renvoyant sous forme de liste
- (si Matrix() est utilisé sur la liste résultante, cela ne fonctionnera que si les valeurs de la liste sont toutes des nombres).
Summarize() est beaucoup plus efficace que le tableau associatif, c'est très évident avec 2 millions de lignes de données (1sec vs 8sec time lapse). Si les performances sont critiques, utilisez Summarize() chaque fois que possible.
Résumer( dt, smrz1 = by( :sex ) ); Résumer( dt, smrz2 = by( :age ) );
* Summarize() ne crée pas de table de données intermédiaire en tant que << Résumé
Le tableau associatif est excellent dans la mesure où il économise l'effort de mettre la liste/matrice dans la table de données, c'est la solution parfaite pour les petites tailles de données.