Quando considero la mia vita professionale, sono relativamente nuovo alla JMP. In effetti, la mia esperienza JMP e JSL (JMP Scripting Language) è iniziata il giorno in cui sono diventato uno sviluppatore qui nel gruppo JMP Life Sciences, circa quattro anni fa. Al contrario, ho utilizzato SAS da quando ero studente universitario in matematica, dandomi più di 20 anni di esperienza. Sebbene ci siano molte differenze tra le due lingue, una delle cose che mi piace di più del mio lavoro è usare questo set di strumenti molto ampio e ricco per sviluppare nuove fantastiche funzionalità per JMP Clinical .
Anche se ho accesso ad entrambi JMP e SAS , A volte mi trovo a chiedermi come replicare una funzione in SAS usando JSL. L'argomento di questo post del blog è come replicare il comportamento del passaggio dei dati SAS per selezionare il primo e l'ultimo record all'interno dei gruppi. In SAS, ciò viene eseguito innanzitutto ordinando i dati e utilizzando parole chiave speciali all'interno del passaggio dei dati. Ad esempio, se avessi la tabella dei dati della Classe Grande formattata in SAS e volessi scegliere il primo ragazzo e una ragazza in ordine alfabetico, il programma seguente avrebbe ottenuto questo risultato:
proc sort data = bigclass;
per nome del sesso;
correre;
dati prima;
imposta bigclass;
per nome del sesso;
se first.sex;
correre;
Vorrei scegliere l'ultimo ragazzo e una ragazza in ordine alfabetico se last.sex; . Una logica simile si applica se volessi selezionare prima e ultima all'interno di ulteriori gruppi. Di ', volevo scegliere la persona più piccola per ogni nome all'interno di genere, il seguente lo farebbe:
proc sort data = bigclass;
per altezza del nome del sesso;
correre;
dati prima;
imposta bigclass;
per altezza del nome del sesso;
se first.name;
correre;
Il mio collega Brady Brady è stato così gentile da aiutarmi a risolvere questo problema con JSL usando Col Min () e Col Max (). La Figura 1 contiene un set di dati di esempio. I dati originali includevano solo lettere (da A a J) e lettere 2 (da A a D). La tabella dati è ordinata da queste due variabili. Puoi vedere sotto che First.Letter è uguale a 1 per la prima istanza di ogni lettera in Letter (0 altrimenti); Last.Letter è un 1 per l'ultima istanza di ogni lettera in Letter (0 altrimenti). Le formule per queste variabili sono le seguenti:
First.Letter = If (Row () == Col Minimum (Row (),: Letter),
1,
0
)
Last.Letter = If (Row () == Col Maximum (Row (),: Letter),
1,
0
)
Per interpretare queste formule, le funzioni di Col M ** imum () stanno utilizzando: Lettera come un gruppo per ottenere i numeri di riga minima o massima all'interno di ciascun valore di Lettera. La funzione If () imposta First.Letter = 1 se il numero di riga corrente è uguale al: Numero di riga minimo specifico della lettera. Nota che se un valore particolare per: Letter aveva solo una singola riga, quel record sarebbe considerato sia il primo che l'ultimo, con Prima lettera = 1 e Last.Letter = 1

Figura 1. Data Table FirstLast
Simile al codice precedente per SAS, questo può essere esteso per più variabili. Dire che volevo selezionare la prima istanza di ogni lettera di Letter2 entro Lettera, aggiungo semplicemente un byvar aggiuntivo alla funzione.
First.Letter2 = If (Row () == Col Minimum (Row (),: Letter,: Letter2),
1,
0
)
Last.Letter2 = If (Row () == Col Maximum (Row (),: Letter,: Letter2),
1,
0
)
Queste funzioni hanno una funzione utile in quanto consente di suddividere facilmente i gruppi in cui si verificano duplicati. Selezione delle file dove Prima lettera = 0 o L'ultima lettera = 0 seleziona tutte le righe in cui: la lettera viene ripetuta. Nel contesto di Big Class, l'utilizzo di queste funzioni su: Height consente di creare un sottotitolo in cui è possibile che vengano ripetute altezze specifiche.
Nota che in SAS è necessario un ordinamento per creare le variabili speciali first.XX last.XX. Sebbene la tabella dati sopra sia ordinata, questo non è un requisito per il codice JSL sopra riportato per funzionare.
Mille grazie a Brady Brady per il suo aiuto!