En ce qui concerne ma vie professionnelle, je suis un nouvel arrivant sur JMP. En fait, mon expérience avec JMP et JSL (langage de script JMP) a commencé le jour où je suis devenu développeur ici au sein du groupe JMP Life Sciences, il y a environ quatre ans. En revanche, j'utilise SAS depuis que je suis étudiant de premier cycle en mathématiques, ce qui me donne plus de 20 ans d'expérience. Bien qu’il existe de nombreuses différences entre les deux langues, l’un des aspects qui me passionne le plus dans mon travail est l’utilisation de cet ensemble d’outils très volumineux et riche pour développer de nouvelles JMP Clinical .
Même si j'ai accès aux deux JMP et SAS Je me demande parfois comment reproduire une fonctionnalité dans SAS à l’aide de JSL. Le sujet de cet article de blog est comment répliquer le comportement de l'étape de données SAS pour sélectionner les premier et dernier enregistrements au sein de groupes. Dans SAS, cela est effectué en triant d'abord les données et en utilisant des mots-clés spéciaux dans l'étape de données. Par exemple, si le tableau de données Big Class était formaté en SAS et que je voulais choisir le premier garçon et la première fille par ordre alphabétique, le programme ci-dessous accomplirait cette opération:
proc sort data = bigclass;
par nom de sexe;
courir;
données en premier;
définir bigclass;
par nom de sexe;
si premier.sex;
courir;
Pour choisir le dernier garçon et la dernière fille par ordre alphabétique, j'utiliserais si last.sex; . Une logique similaire s'applique si je voulais sélectionner le premier et le dernier dans des groupes supplémentaires. Dites, je voulais choisir la personne la plus courte pour chaque nom dans le genre, ce qui suit ferait cela:
proc sort data = bigclass;
par taille de nom de sexe;
courir;
données en premier;
définir bigclass;
par taille de nom de sexe;
si prénom.nom;
courir;
Mon collegue Brady Brady a eu la gentillesse de m'aider à résoudre ce problème au sein de JSL en utilisant Col Min () et Col Max (). La figure 1 contient un exemple de jeu de données. Les données originales ne comprenaient que les lettres (A à J) et la lettre 2 (A à D). Le tableau de données est trié par ces deux variables. Vous pouvez voir ci-dessous que First.Letter est égal à 1 pour la première instance de chaque lettre de Letter (0 sinon); Last.Letter est un 1 pour la dernière instance de chaque lettre de Letter (0 sinon). Les formules pour ces variables sont les suivantes:
First.Letter = If (Row () == Col. Minimum (Row (),: Letter),
1,
0
)
Last.Letter = If (Row ()
Col Maximum (Row (),: Letter),
1,
0
)
Pour interpréter ces formules, les fonctions Col M ** imum () utilisent: Letter par groupe et permettent d’obtenir le nombre minimal ou maximal de lignes dans chaque valeur de Letter. La fonction If () définit First.Letter = 1 si le numéro de ligne actuel est égal au numéro de ligne minimal spécifique à la lettre. Notez que si une valeur particulière pour: Lettre n’avait qu’une seule ligne, cet enregistrement serait considéré à la fois comme le premier et le dernier, avec Première lettre = 1 et Last.Letter = 1

Figure 1. Table de données
Semblable au code ci-dessus pour SAS, cela peut être étendu pour plusieurs variables par. Disons que je voulais sélectionner la première instance de chaque lettre de Letter2 dans Lettre, j'ajoute simplement un byvar supplémentaire à la fonction.
First.Letter2 = If (Row () == Col. Minimum (Row (),: Letter,: Letter2),
1,
0
)
Last.Letter2 = If (Row ()
Col Maximum (Row (),: Letter,: Letter2),
1,
0
)
Ces fonctions ont une fonctionnalité utile en ce sens qu’elles vous permettent de facilement créer des sous-ensembles par groupes lorsque des doublons se produisent. Sélection des lignes où Première lettre = 0 ou Dernière lettre = 0 sélectionnera toutes les lignes où: La lettre est répétée. Dans le contexte de Big Class, l’utilisation de ces fonctions sur: La hauteur peut vous permettre de créer un sous-tableau où des hauteurs spécifiques peuvent être répétées.
Notez que dans SAS, un tri est requis pour créer les variables spéciales first.XX last.XX. Bien que la table de données ci-dessus soit triée, le code JSL ci-dessus ne doit pas nécessairement fonctionner.
Merci beaucoup à Brady Brady pour son aide!