Código JSL y ayuda para resumirHola comunidad JMP,
JMP Pro v17.
Tengo un script que funcionaba el mes pasado, pero parece que ya no funciona. Tengo una tabla de datos en la que una columna se llama :Date (ver la tabla de datos adjunta). Se supone que el siguiente script resume la tabla de datos por el Año( ) de :Date y genera una lista de años para la variable "yrs".
Summarize( dt, yrs = By( Year( :Date ) ) );
Por ejemplo, se supone que debe devolver una lista de fechas como {"2022", "2023", "2024"} y así sucesivamente, porque se supone que el comando Year() extrae solo el valor del año de la columna :Date, sin embargo no lo hace.
Si elimina el comando Año() alrededor de :Fecha y lo ejecuta de esta manera:
Summarize( dt, yrs = By( :Date ) );
El resultado es una lista de todas las fechas individuales, aquí hay un extracto:
{"29/09/0263", "30/01/1930", "11/02/1955", "03/05/2002", "13/08/2002", "19/10/2002",
"01/01/2021", "02/01/2021", "06/01/2021", "18/01/2021", "30/01/2021", "12/02/2021",
"13/02/2021", "15/02/2021", "26/03/2021", "27/03/2021", "28/03/2021", "30/03/2021",
"23/04/2021", "24/04/2021", "25/04/2021",}
Hay algunas fechas mal escritas, pero esto se puede ignorar por ahora.
En realidad no quiero todas las fechas individuales, solo quiero una lista de todos los años. Desafortunadamente, cuando intento ejecutar yr = Year( :Date), obtengo una variable nula/vacía para yr. Esto termina por no poder evaluarse con el siguiente comando By( ) en el JSL original. No sé si necesito
Lo que me parece extraño es que hace un mes aproximadamente, cuando estaba construyendo este código, parecía funcionar bien, pero ahora no funciona como antes.
Estoy seguro de que me estoy perdiendo algo simple que está causando este problema, pero no puedo averiguar qué es. O bien, estoy pensando en Summarize() y/o en cómo utiliza el grupo By() en él.
¡Gracias por cualquier idea o comentario!
DS
Automatización y scriptingPersonalización masivaVentanasRe: Código JSL y ayuda para resumirHola,
Debes evaluar la función Año de la siguiente manera:
Eval(Eval Expr(summarize (dt, yr = By(Year(:Date)))));
Mejor,
TS
Re: Código JSL y ayuda para resumirNo creo que puedas hacer eso con Resumen, pero podrías usar Resumen con la columna de transformación si no quieres crear una nueva columna en tu tabla.
Names Default To Here(1);
dt = Open("$DOWNLOADS/Date.jmp");
dt_summary = dt << Summary(
Group(Transform Column("Year", Formula(Year(:Date)))),
Freq("None"),
Weight("None"),
Link to original data table(0),
output table name("Summary of Date grouped by Year"),
Private
);
years = dt_summary[0, 1];
Close(dt_summary, no save);
Show(years);
Re: Código JSL y ayuda para resumirHola @Thierry_S y @jthi ,
Gracias a ambos por sus comentarios y sus ideas. Es posible que me haya apresurado a marcarlo como resuelto porque sucedió algo extraño.
Intenté ejecutar Eval( Eval Expr( )) de @Thierry_S envuelto alrededor del comando de resumen, y funcionó cuando lo estaba probando en la tabla de datos de prueba (la de solo las fechas), pero tan pronto como me moví a la tabla de datos original, dejó de funcionar y aparece el siguiente error: Columna no encontrada en el acceso o la evaluación de 'Año', Año/*###*/(:Fecha).
Ahora, cuando vuelvo e intento hacerlo en la tabla de datos "falsa" de fechas, aparece el error nuevamente.
@jthi , tu opción es una posibilidad, pero necesitaría convertirla de una matriz (o un vector unidimensional en una lista de números). ¿Hay alguna forma rápida de hacerlo? Necesito hacerlo porque estoy usando la lista de años en una matriz asociativa.
¡Gracias!,
DS
Re: Código JSL y ayuda para resumir¿Las claves de la matriz asociativa son números enteros o cadenas? Si son números enteros, puedes usar As List())
Names Default To Here(1);
dt = Open("$DOWNLOADS/Date.jmp");
dt_summary = dt << Summary(
Group(Transform Column("Year", Formula(Year(:Date)))),
Freq("None"),
Weight("None"),
Link to original data table(0),
output table name("Summary of Date grouped by Year"),
Private
);
years = dt_summary[0, 1];
Close(dt_summary, no save);
show(As List(years)); // As List(years) = {263, 1930, 1955, 2002, 2021, 2022, 2023, 2024, 2025};
Y si son cadenas, cambiaría la columna a carácter y luego tomaría los valores.
Names Default To Here(1);
dt = Open("$DOWNLOADS/Date.jmp");
dt_summary = dt << Summary(
Group(Transform Column("Year", Formula(Year(:Date)))),
Freq("None"),
Weight("None"),
Link to original data table(0),
output table name("Summary of Date grouped by Year"),
Private
);
Column(dt_summary, 1) << Set Data Type("Character");
years = dt_summary[0, 1];
Close(dt_summary, no save);
show(years); // years = {"263", "1930", "1955", "2002", "2021", "2022", "2023", "2024", "2025"};
Re: Código JSL y ayuda para resumirTengo un script que estuvo funcionando el mes pasado.
¿Tal vez debido a una columna preexistente?

Re: Código JSL y ayuda para resumirResumir funciona con columnas de Transformación:
dt = Open( "$SAMPLE_DATA/Hurricanes.jmp" );
dt << Transform Column( "tmp", Formula( year(:date) ) );
Summarize(years = by (tmp));
//dt << Delete Columns( :tmp );
Show(years)
No te preocupes si olvidas eliminar la columna de transformación, desaparecerá después de la próxima "apertura".
Re: Código JSL y ayuda para resumirHola @jthi ,
Gracias por los comentarios y sugerencias. Necesito los años como cadenas porque los termino usando más adelante en un cuadro combinado, que solo acepta cadenas.
¡Gracias por toda la ayuda y resolución de problemas!
DS
Re: Código JSL y ayuda para resumirHola @hogi ,
Todas las tablas de datos tienen el mismo nombre de columna: Fecha, y todas son columnas numéricas y continuas, por lo que no estoy seguro de por qué funcionaba antes y ahora no. Y lo extraño es que funciona para la tabla de datos Hurricanes.jmp, pero no funciona para la mía. Realmente no entiendo por qué sucede esto, pero sucede.
De todos modos, la forma que sugirió Jarmo funciona bien y no termina siendo tan complicada como el comando Summarize(By()).
¡Gracias!,
DS
Re: Código JSL y ayuda para resumirPara Hurricanes.jmp, funciona debido a la columna :year .
¿JMP redirige el año(:fecha) a :año ?
Re: Código JSL y ayuda para resumirHola @hogi , tal vez. No tengo idea y no entiendo por qué JSL haría algo así. Acabo de probar esa teoría y, efectivamente, el comando Summarize NO funcionó porque la columna :Year había desaparecido. ¡Qué extraño! Y, aunque la columna :Date es una fórmula en el archivo Hurricanes.jmp, no importa. Si se elimina la fórmula, funciona bien, pero si se elimina la columna :Year, ya no funciona. No entiendo la lógica de JSL detrás de eso, pero así es.