Codice JSL e aiuto riassuntivoCiao comunità JMP,
JMP Pro v17.
Ho uno script che funzionava il mese scorso, ma ora non sembra più funzionare. Ho una tabella dati in cui una colonna è denominata :Date (vedi tabella dati allegata). Lo script seguente dovrebbe riassumere la tabella dati in base all'anno( ) di :Date e generare un elenco di anni per la variabile "yrs".
Summarize( dt, yrs = By( Year( :Date ) ) );
Ad esempio, dovrebbe restituire un elenco di date come {"2022", "2023", "2024"} e così via, perché il comando Year( ) dovrebbe estrarre solo il valore dell'anno dalla colonna :Date, ma non lo fa.
Se rimuovi il comando Year( ) attorno a :Date e lo esegui in questo modo:
Summarize( dt, yrs = By( :Date ) );
Il risultato è un elenco di tutte le date individuali, ecco un estratto:
{"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",}
Ci sono alcune date errate, ma per il momento possiamo ignorarlo.
In realtà non voglio tutte le date individuali, voglio solo un elenco di tutti gli anni. Sfortunatamente, quando provo a eseguire yr = Year( :Date), ottengo una variabile nulla/vuota per yr. Questo finisce per non essere valutato dal successivo comando By( ) attorno ad esso nel JSL originale. Non so se ho bisogno
Ciò che trovo strano è che circa un mese fa, quando stavo sviluppando questo codice, sembrava funzionare perfettamente, ma ora non funziona più come prima.
Sono sicuro che mi sfugge qualcosa di semplice che sta causando questo problema, ma non riesco a capire cosa sia. Oppure, sto pensando a Summarize( ) e/o a come usa il gruppo By( ) al suo interno.
Grazie per qualsiasi pensiero/feedback!
S.S.
Automazione e scriptingPersonalizzazione di massaFinestreRe: Codice JSL e aiuto per SummarizeCIAO,
È necessario valutare la funzione Anno come segue:
Eval(Eval Expr(summarize (dt, yr = By(Year(:Date)))));
Migliore,
STUDENTI
Re: Codice JSL e aiuto per SummarizeNon credo che tu possa farlo con Summarize, ma potresti usare Summary con la colonna di trasformazione se non vuoi creare una nuova colonna nella tua tabella
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: Codice JSL e aiuto per SummarizeCiao @Thierry_S e @jthi ,
Grazie a entrambi per il feedback rapido e le idee. Forse sono stato troppo veloce a contrassegnarlo come risolto perché è appena successo qualcosa di strano.
Ho provato a eseguire Eval( Eval Expr( )) di @Thierry_S avvolto attorno al comando summary e ha funzionato quando lo testavo sulla tabella dati di prova (quella con solo le date), ma non appena sono passato alla tabella dati originale, ha smesso di funzionare e ho ricevuto il seguente errore: Colonna non trovata nell'accesso o nella valutazione di 'Year' , Year/*###*/(:Date).
Ora, quando torno indietro e provo a farlo sulla tabella dati "falsa" delle date, ottengo di nuovo l'errore.
@jthi , la tua opzione è una possibilità, ma avrei bisogno di trasformarla da una matrice (o vettore 1-D in un elenco di numeri) -- c'è un modo rapido per farlo? Devo farlo perché sto usando l'elenco degli anni in un array associativo.
Grazie!,
S.S.
Re: Codice JSL e aiuto per SummarizeLe chiavi sono interi o stringhe nel tuo array associativo? Se sono interi, puoi usare 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};
E se sono stringhe, cambierei la colonna in carattere e poi prenderei i valori
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: Codice JSL e aiuto per SummarizeHo uno script che ha funzionato il mese scorso
forse a causa di una colonna preesistente?

Re: Codice JSL e aiuto per SummarizeRiepilogo funziona con le colonne Trasforma:
dt = Open( "$SAMPLE_DATA/Hurricanes.jmp" );
dt << Transform Column( "tmp", Formula( year(:date) ) );
Summarize(years = by (tmp));
//dt << Delete Columns( :tmp );
Show(years)
Non preoccuparti se dimentichi di eliminare la colonna di trasformazione: scomparirà dopo la prossima "apertura".
Re: Codice JSL e aiuto per SummarizeCiao @jthi ,
Grazie per il feedback e il suggerimento. Ho bisogno degli anni come stringhe perché finisco per usarli più avanti in una combo box, che accetta solo stringhe.
Grazie per tutto l'aiuto e la risoluzione dei problemi!
S.S.
Re: Codice JSL e aiuto per SummarizeCiao @hogi ,
Tutte le tabelle dati hanno lo stesso nome di colonna: Data, e sono tutte colonne numeriche e continue, quindi non sono sicuro del perché funzionasse prima e non ora. E, la cosa strana è che funziona per la tabella dati Hurricanes.jmp, ma non funziona per la mia. Non capisco davvero perché ciò accada, ma accade.
In ogni caso, il metodo suggerito da Jarmo funziona bene e non risulta pignolo come il comando Summarize(By( )).
Grazie!,
S.S.
Re: Codice JSL e aiuto per SummarizePer Hurricanes.jmp, funziona grazie alla colonna :year .
JMP reindirizza year(:date) a :year ?!?
Re: Codice JSL e aiuto per SummarizeCiao @hogi , forse. Non ne ho idea e non capisco perché JSL dovrebbe fare una cosa del genere. Ho appena testato questa teoria e, come previsto, il comando Summarize NON ha funzionato perché la colonna :Year era sparita. Che strano! E, anche se la colonna :Date è una formula nel file Hurricanes.jmp, non importa. Se la formula viene rimossa funziona benissimo, ma se la colonna :Year viene eliminata, non funziona più. Non capisco la logica JSL dietro a tutto questo, ma è così che stanno le cose.