Codice JSL necessario per generare una colonna formula dinamica che somma le colonne da un elencoCiao a tutti,
Questa domanda è in relazione a un post Qui che genera piacevolmente una colonna non dinamica per riassumere un elenco di altre colonne.
Il problema che sto avendo è come sommare le colonne (usando JSL) quando hai un elenco di altre N colonne e hai una formula dinamica.
Ho un elenco di colonne nella mia tabella dati, ad esempio ColList, e voglio generare una nuova colonna con una formula che somma semplicemente gli N elementi in ColList. Qualcosa a cui stavo pensando è così:
Names Default to Here (1);
dt = Current Data Table();
dt << New Column("Sum", Formula(Sum(ColList)));Questo chiaramente non funziona perché ColList è un elenco di colonne: ColList = {"col1", "col2", ..., "colN"}. Ho provato a creare una stringa e utilizzando Eval (Parse ()) e Eval Insert () in questo modo:
Names Default to Here (1);
dt = Current Data Table();
str = Eval Insert("dt << New Column(\!"Sum\!", Formula(Sum(Eval(ColList))));
Eval(Parse(str));Ma ancora senza fortuna. Il codice JSL genererà la colonna con una formula, ma avrà valori di riga vuoti perché mostra ancora Eval (ColList) nella formula invece di essere la formula effettiva, che dovrebbe essere simile a: Sum (: col1,: col2,: col3, ...,: colN).
Non riesco a capire cosa sto sbagliando passando dall'elenco {""} di colonne al riferimento alle colonne con i due punti:.
Ogni aiuto è molto apprezzato.
Grazie!,
DS
AnalyticsTabella datiScriptingOggetto: codice JSL necessario per generare una colonna formula dinamica che somma le colonne da un elencoCi sono diversi modi per farlo. Preferisco creare una variabile per l'espressione desiderata utilizzando EvalExpr () e quindi utilizzare NameExpr () per trasferire l'espressione (non valutata) nell'argomento Formula ().
Names Default To Here( 1 );
dt = Open( "$Sample_Data/2D Gaussian Process Example.jmp" );
ColList = dt << Get Column Names;
F = Eval Expr( Sum( Expr( ColList ) ) );
dt << New Column( "Sum", Formula( Name Expr( F ) ) );
Oggetto: codice JSL necessario per generare una colonna formula dinamica che somma le colonne da un elencoCiao @SM ,
È una soluzione perfetta, grazie! Mi piace quanto sia semplice ed elegante.
Ho dovuto cambiare un po 'il mio codice perché farlo a modo tuo ha ancora un problema quando l'elenco è strutturato come: {"A", "B", "C", ...}. Ma, se l'elenco è strutturato come {A, B, C, ...}, allora valuta l'espressione correttamente. I due elenchi vengono generati in modo leggermente diverso e le virgolette generano davvero Eval ().
Grazie!,
DS
Oggetto: codice JSL necessario per generare una colonna formula dinamica che somma le colonne da un elencoCiao @SM ,
Ho una domanda correlata (quindi non un altro post) con cui spero che il tuo metodo di scripting possa essere d'aiuto. Ha a che fare con la posta Qui . Quello che sto cercando di fare ora è fondamentalmente generalizzare ciò che è stato inserito nel post originale da una matrice di correlazione 4x4 a una matrice NxN arbitraria quando "fornisce" informazioni al simulatore nel profilo.
Dall'altro post originale, c'è uno script che può generare la matrice di correlazione NxN e, dal tuo input, può generare una colonna di "previsione" (la somma delle altre N colonne). Dove sto attraversando un momento difficile è il seguente: quando chiami la funzione Simulator (), devi passarla:
Simulatore (stato = 0 | 1, , )
Quindi, dall'altro articolo originale, la soluzione per passare l'elenco corretto di fattori ("tpListY") e la matrice di correlazione ("corr.mat"), il codice JSL necessario per avere Eval Insert () avvolto attorno alla chiamata da inviare Simulator () al report Profiler e quindi eseguire un Eval (Parse ()) attorno a quello.
La sfida ora è come generalizzare correttamente questo in modo che quando si chiama Simulator () e si definiscono i fattori, è possibile farlo su quella ColList.
ColList potrebbe essere qualcosa del tipo: ColList = {A, B, C, D, ...} e c'è una media e una deviazione standard associate per ogni colonna A, B, C, ....
Qual è la sintassi corretta per chiamare il simulatore in modo che inserisca la media e lo sviluppo std corretti per ogni fattore? Esempio:
sim_design = Profiler(Y(:Pred), Invisible);
new = Eval Insert(
"sim_design << Simulator(
1,
Factors(
:A << mutlivariate(Mmean[1], MSD[1])),
:B << mutlivariate(Mmean[2], MSD[2])),
:C << mutlivariate(Mmean[3], MSD[3])), //etc. for the N columns in the made up table.
),
X Correlations(
1,
Eval(ColList),
Eval(corr_mat)
),
NRuns(1e6)
);");
Eval(Parse(new));Dalla tabella dati originale, viene realizzato un secondo mock up con il numero di colonne (N) che sono state utilizzate per generare la matrice di correlazione (corr_mat). Quella tabella mock up è quella che somma le colonne per creare la colonna: Pred che viene utilizzata come funzione fittizia da inviare al Profiler. Le variabili Mmean e MSD sono vettori che contengono la media e la deviazione standard delle N colonne A attraverso qualunque.
Senza dover scrivere esplicitamente in ogni colonna e la loro media corrispondente, mi piacerebbe che questo fosse più automatizzato in modo che possa gestire qualsiasi numero di colonne.
Quale sarebbe un buon modo per farlo?
Ho anche problemi con Eval (corr_mat) che inserisce effettivamente i valori della matrice di correlazione nelle voci X Correlations.
La tabella dati e lo script allegati dovrebbero aiutare a capire cosa sto tentando.
Grazie!,
DS
Aggiorna, mi dispiace aver aggiunto il file sbagliato, ora ha la tabella dati corretta.
Oggetto: codice JSL necessario per generare una colonna formula dinamica che somma le colonne da un elencoEcco un approccio. Per prima cosa crea in modo iterativo Factors () e poi in un secondo passaggio crea l'espressione completa di Simulator () includendo gli argomenti valutati per X Correlations ().
// Iteratively build the Factors expression
fs = Expr( Factors() );
For( i = 1, i <= N Items( ColList ), i++,
Insert Into(
fs,
Eval Expr( Expr( collist[i] ) << multivariate( Expr( MMean[i] ), Expr( MSD[i] ) ) )
)
);
// Make the complete Simulator expression
sim = Eval Expr(
sim_design << Simulator(
1,
Expr( Name Expr( fs ) ),
X Correlations( 1, Expr( ColList ), Expr( corr_mat ) ),
N Runs( 1e4 )
)
);
// Name Expr( sim ) // Run this line to show the expression in the log
// Launch Profiler and run the Simulator expression
sim_design = Profiler( Y( :Pred ) );
sim;
Tuttavia, la matrice delle correlazioni X sembra (nella maggior parte dei casi) essere ignorata. Solo zeri nel report.
Inoltre, quando le correlazioni vengono inserite manualmente nel profiler e si salva ed esegue lo script, le correlazioni vengono perse. Anche se sono conservati nello script salvato. Non sono sicuro del perché.
Oggetto: codice JSL necessario per generare una colonna formula dinamica che somma le colonne da un elencoCiao @SM ,
Grazie mille per la tua soluzione. Funziona perfettamente con le mie tabelle di dati con cui sto lavorando. Avevo bisogno di modificare un po 'le cose per tenere conto del fatto che molte delle tabelle di dati con cui lavoro hanno altri tipi di dati, quindi devo solo considerare i dati numerici continui. Ad ogni modo, funziona correttamente e riempie correttamente le medie multivariate, gli sviluppatori std e le correlazioni X. Sto usando JMP 16 EA, se questo è importante.
Grazie per l'aiuto! Ho anche postato nell'altro thread della richiesta originale riguardante la matrice di correlazione in modo che la persona possa, si spera, beneficiare del codice per scalare fino a N dimensioni.
Grazie!,
DS