Al considerar mi vida profesional, soy relativamente nuevo en JMP. De hecho, mi experiencia con JMP y JSL (JMP Scripting Language) comenzó el día en que me convertí en un desarrollador aquí en el grupo de ciencias de la vida de JMP, hace aproximadamente cuatro años. En contraste, he estado usando SAS desde que era estudiante de licenciatura en matemáticas, lo que me ha dado más de 20 años de experiencia. Aunque hay muchas diferencias entre los dos idiomas, una de las cosas que más disfruto de mi trabajo es usar este conjunto de herramientas muy grande y rico para desarrollar nuevas funciones geniales para JMP clinico .
Aunque tengo acceso a ambos JMP y SAS , A veces me pregunto cómo replicar una característica en SAS usando JSL. El tema de esta publicación de blog es cómo replicar el comportamiento del paso de datos de SAS para seleccionar los primeros y últimos registros dentro de los grupos. En SAS, esto se realiza clasificando primero los datos y utilizando palabras clave especiales dentro del paso de datos. Por ejemplo, si tuviera la tabla de datos de Big Class formateada en SAS y quisiera elegir el primer niño y niña por orden alfabético, el siguiente programa lograría esto:
proc sort data = bigclass;
por nombre de sexo;
correr;
primero los datos
establecer bigclass
por nombre de sexo;
si primero.sex;
correr;
Para elegir el último chico y chica alfabéticamente, usaría si last.sex; . Se aplica una lógica similar si quisiera seleccionar primero y último dentro de grupos adicionales. Decir, quería elegir a la persona más corta para cada nombre dentro del género, lo siguiente haría eso:
proc sort data = bigclass;
por nombre de sexo altura;
correr;
primero los datos
establecer bigclass
por nombre de sexo altura;
si first.name;
correr;
Mi colega Brady Brady fue lo suficientemente amable para ayudarme a resolver esto dentro de JSL usando Col Min () y Col Max (). La figura 1 contiene un conjunto de datos de muestra. Los datos originales solo incluían la letra (A a J) y la letra 2 (A a D). La tabla de datos está ordenada por estas dos variables. Puede ver a continuación que First.Letter es igual a 1 para la primera instancia de cada letra en la Carta (0 en caso contrario); Last.Letter es un 1 para la última instancia de cada letra en la Carta (0 de lo contrario). Las fórmulas para estas variables son las siguientes:
First.Letter = If (Row () == Col Minimum (Row (),: Letter),
1,
0
)
Last.Letter = If (Row () == Col Maximum (Row (),: Letter),
1,
0
)
Para interpretar estas fórmulas, las funciones Col M ** imum () utilizan: Letra como por grupo y obtienen los números de fila mínimos o máximos dentro de cada valor de Letra. La función If () establece First.Letter = 1 si el número de fila actual es igual a: Número de fila mínimo específico de la letra. Tenga en cuenta que si un valor particular para: Letra solo tuviera una fila, ese registro se consideraría tanto el primero como el último, con Primera letra = 1 y Last.Letter = 1

Figura 1. Tabla de datos FirstLast
Similar al código anterior para SAS, esto puede extenderse para múltiples por variables. Digamos que quería seleccionar la primera instancia de cada letra de Letter2 dentro Letra, simplemente agrego un byvar adicional a la función.
First.Letter2 = If (Row () == Col Minimum (Row (),: Letter,: Letter2),
1,
0
)
Last.Letter2 = If (Row () == Col Maximum (Row (),: Letter,: Letter2),
1,
0
)
Estas funciones tienen una característica útil porque le permite subcontratar fácilmente a grupos en los que se producen duplicados. Seleccionando filas donde Primera letra = 0 o Última carta = 0 seleccionará todas las filas donde: Se repite la letra. En el contexto de Big Class, el uso de estas funciones en: Altura puede permitirle crear una subtabla donde se pueden repetir alturas específicas.
Tenga en cuenta que en SAS, se requiere una ordenación para crear las variables especiales first.XX last.XX. Aunque la tabla de datos anterior está ordenada, este no es un requisito para que el código JSL de arriba funcione.
Muchas gracias a Brady Brady por su ayuda!