Il ciclo JSL che aggiunge statistiche eseguendo l'ID per più colonne impiega anniCiao ragazzi.
Hai bisogno del tuo consiglio con il seguente.
Ho trattato questo ciclo che cerca tutte le colonne numeriche che il loro nome inizia con "MEAS" (per la misurazione) e crea una nuova colonna statistica basata sui dati in quelle colonne raggruppate da dati runid.
Il ciclo sta funzionando, ma ci vogliono secoli per completare - qualche idea sul perché? o cosa si può fare per migliorarlo?
Grazie
dt_ncol=ncol(dt);
for(i=1,i<=dt_ncol,i++,
if(column(i)<<GET data="https://community.jmp.com/" type="="Numeric""></GET>
Ri: ciclo JSL che aggiunge statistiche eseguendo ID per più colonne impiegano anniMorgen thx per il tuo replay.
Non potrei ringraziarti in tempo, ma ad ogni modo ho preso il tuo consiglio per riassumere i dati all'interno di una tabella temporanea e aggiornare le nuove colonne da quella tabella nella tabella principale.
L'ho fatto in modo leggermente diverso dallo script che hai suggerito, principalmente a causa del problema che avevo con l'uso di un nome di lista nei calcoli di riepilogo (Mean (cols)).
Ad ogni modo, ho inventato questa breve sceneggiatura che funziona perfettamente per me:
// Aggiungi le statistiche delle misurazioni
// Elenca i nomi delle colonne pertinenti
meascol = dt << ottieni i nomi delle colonne (numerico);
measnc = N Items (meascol);
meascollist = {};
Per (i = 1, i <= measnc, i ++,
Se (Contiene (meascol [i], "MEAS"),
Insert Into (meascollist, meascol [i])
));
// Riepilogo delle colonne pertinenti e della tabella degli aggiornamenti
for (k = 1, k <= n items (meascollist), k ++,
dt << Sommario (
Gruppo (: RUNID),
Media (char (meascollist [k])),
Max (char (meascollist [k])),
Min (char (meascollist [k])),
nome della tabella di output ("tempmeas")
);
dt << Aggiorna (
Con (tabella dati ("tempmeas")),
Colonne di corrispondenza (: RUNID =: RUNID)
);
chiudi (tabella dati ("tempmeas"), nessun salvataggio));
Ri: ciclo JSL che aggiunge statistiche eseguendo ID per più colonne impiegano anniMorgen thx per il tuo replay.
Non potrei ringraziarti in tempo, ma ad ogni modo ho preso il tuo consiglio per riassumere i dati all'interno di una tabella temporanea e aggiornare le nuove colonne da quella tabella nella tabella principale.
L'ho fatto in modo leggermente diverso dallo script che hai suggerito, principalmente a causa del problema che avevo con l'uso di un nome di lista nei calcoli di riepilogo (Mean (cols)).
Ad ogni modo, ho inventato questa breve sceneggiatura che funziona perfettamente per me:
// Aggiungi le statistiche delle misurazioni
meas_ncol = n col (dt);
// Elenca i nomi delle colonne pertinenti
meascol = dt << ottieni i nomi delle colonne (numerico);
measnc = N Items (meascol);
meascollist = {};
Per (i = 1, i <= measnc, i ++,
Se (Contiene (meascol [i], "MEAS"),
Insert Into (meascollist, meascol [i])
));
// Riepilogo delle colonne pertinenti e della tabella degli aggiornamenti
for (k = 1, k <= n items (meascollist), k ++,
dt << Sommario (
Gruppo (: RUNID),
Media (char (meascollist [k])),
Max (char (meascollist [k])),
Min (char (meascollist [k])),
nome della tabella di output ("tempmeas")
);
dt << Aggiorna (
Con (tabella dati ("tempmeas")),
Colonne di corrispondenza (: RUNID =: RUNID)
);
chiudi (tabella dati ("tempmeas"), nessun salvataggio));
Ri: ciclo JSL che aggiunge statistiche eseguendo ID per più colonne impiegano anniCiò richiede tempo a causa del numero di calcoli (ordine) e rendering (disegno) dei valori della tabella. Inoltre, le formule di colonna potrebbero rallentarlo rispetto all'uso dei valori.
Nota che il metodo che stai utilizzando è trovare e calcolare le file runid, da (: runid), 3 volte per ogni colonna. Due metodi alternativi sono:
- Usa la manipolazione della tabella e dimentica le formule della colonna. Di seguito è riportato uno script di esempio, che utilizza la tabella di dati di esempio JMP Semiconductor Capability.jmp
- Aggiungi una colonna di sequenza, la chiamo seq che è row (). Usa Riassumi (rid = By (: runid), ibeg = Min (: seq), iend = Max (: seq)). Quindi usa i compiti della tabella. Non ho mostrato un esempio di questo metodo perché ritengo che sarebbe più lento delle manipolazioni della tabella.
Names Default to Here(1);
dt = Open("$sample_data/semiconductor Capability.jmp");
//change lot_id column name to runid
dt:lot_id << set name("runid");
//select the columns here. I will just use columns with a name that starts with I
cols = {};
for(i=5, i<=ncol(dt), i++,
nme = column(dt,i) << get name;
if( substr(nme, 1, 1) == "I", insert into(cols, nme) );
);
sumdt = dt << Summary( Group(:runid), Mean(cols), Max(cols), Min(cols),
statistics column name format( "column stat" ), Invisible,
Link to original data table( 0 )
);
ord = {"runid"};
for(i=1, i<=ngrp, i++,
nme = cols[i];
column(sumdt, nme || "Mean") << Set Name(nme || "_MEAN");
column(sumdt, nme || "Min") << Set Name(nme || "_MIN");
column(sumdt, nme || "Max") << Set Name(nme || "_MAX");
insert into( ord, eval list({nme||"_MEAN", nme||"_MIN", nme||"_MAX"}))
);
newdt = sumdt << Subset( All Rows, Columns(ord), Invisible );
close(sumdt, NoSave);
wait(0);
dt2 = dt << Join(
With( newdt ),
By Matching Columns( :runid = :runid ),
Merge Same name columns(1),
Match Flag(0),
Drop multiples( 0, 0 ),
Include Nonmatches( 1, 0 ),
Preserve main table order( 1 )
);
close(newdt,NoSave);
nme = dt << get name;
Close(dt, NoSave);
dt = dt2;
dt << set name(nme);
dt << delete scripts("Source");Un JSL piacevole da avere sarebbe un messaggio di tabella dati da Ordinare per (lista), dt << Ordina colonne da (lista mia) o dt << Sposta colonne (lista, dopo | prima | prima | prima). Attualmente, trovo il sottoinsieme (colonne (lista)) il più veloce.