La boucle JSL qui ajoute des statistiques par ID d'exécution pour plusieurs colonnes prend du tempsSalut les gars.
Besoin de vos conseils avec ce qui suit.
J'ai créé cette boucle qui recherche toutes les colonnes numériques dont le nom commence par "MEAS" (pour la mesure) et crée de nouvelles colonnes statistiques basées sur les données de ces colonnes, regroupées par données d'exécution.
La boucle fonctionne, mais il faut du temps pour la terminer - vous savez pourquoi? ou que peut-on faire pour l'améliorer?
THX
dt_ncol=ncol(dt);
for(i=1,i<=dt_ncol,i++,
if(column(i)<<GET data="https://community.jmp.com/" type="="Numeric""></GET>
Re: la boucle JSL qui ajoute des statistiques par ID d'exécution pour plusieurs colonnes prend du tempsMorgen merci pour votre replay.
Je n’ai pas pu vous remercier à temps, mais j’ai pris votre conseil pour résumer les données dans un tableau temporaire et mettre à jour les nouvelles colonnes de ce tableau dans le tableau principal.
Je l'ai fait un peu différemment du script que vous avez suggéré, principalement en raison du problème que j'avais avec l'utilisation d'un nom de liste dans les calculs récapitulatifs (Moyenne (cols)).
Quoi qu'il en soit, j'ai conçu ce court script qui fonctionne parfaitement pour moi:
// Ajouter des statistiques de mesures
// Liste les noms de colonne pertinents
colcol = dt << obtenir les noms de colonne (numérique);
MeasNC = N Items (Meascol);
Meascollist = {};
Pour (i = 1, i <= Measnc, i ++,
Si (contient (colcol [i], "MEAS"),
Insérer dans (Meascollist, Meascol [i])
));
// Résumé des colonnes pertinentes et tableau de mise à jour
pour (k = 1, k <= n éléments (cmoncolliste), k ++,
dt << Résumé (
Groupe (: RUNID),
Moyenne (omc (Meascollist [k])),
Max (char (Meascollist [k])),
Min (char (Meascollist [k])),
nom de la table de sortie ("tempmeas")
)
dt << Update (
Avec (table de données ("tempmeas")),
Match Columns (: RUNID =: RUNID)
)
close (table de données ("tempmeas"), pas de sauvegarde));
Re: la boucle JSL qui ajoute des statistiques par ID d'exécution pour plusieurs colonnes prend du tempsMorgen merci pour votre replay.
Je n’ai pas pu vous remercier à temps, mais j’ai pris votre conseil pour résumer les données dans un tableau temporaire et mettre à jour les nouvelles colonnes de ce tableau dans le tableau principal.
Je l'ai fait un peu différemment du script que vous avez suggéré, principalement en raison du problème que j'avais avec l'utilisation d'un nom de liste dans les calculs récapitulatifs (Moyenne (cols)).
Quoi qu'il en soit, j'ai conçu ce court script qui fonctionne parfaitement pour moi:
// Ajouter des statistiques de mesures
col_ncol = ncol (dt);
// Liste les noms de colonne pertinents
colcol = dt << obtenir les noms de colonne (numérique);
MeasNC = N Items (Meascol);
Meascollist = {};
Pour (i = 1, i <= Measnc, i ++,
Si (contient (colcol [i], "MEAS"),
Insérer dans (Meascollist, Meascol [i])
));
// Résumé des colonnes pertinentes et tableau de mise à jour
pour (k = 1, k <= n éléments (cmoncolliste), k ++,
dt << Résumé (
Groupe (: RUNID),
Moyenne (omc (Meascollist [k])),
Max (char (Meascollist [k])),
Min (char (Meascollist [k])),
nom de la table de sortie ("tempmeas")
)
dt << Update (
Avec (table de données ("tempmeas")),
Match Columns (: RUNID =: RUNID)
)
close (table de données ("tempmeas"), pas de sauvegarde));
Re: la boucle JSL qui ajoute des statistiques par ID d'exécution pour plusieurs colonnes prend du tempsCela prend du temps en raison du nombre de calculs (ordre) et de rendu (dessin) des valeurs de la table. En outre, les formules de colonne pourraient le ralentir par rapport à l'utilisation de valeurs.
Notez que la méthode que vous utilisez consiste à rechercher et à calculer les lignes runid, par (: runid), 3 fois pour chaque colonne. Deux méthodes alternatives sont:
- Utilisez la manipulation de table et oubliez les formules de colonne. Vous trouverez ci-dessous un exemple de script utilisant le tableau de données exemple JMP Semiconductor Capability.jmp.
- Ajouter une colonne de séquence, je l'appelle seq qui est row (). Utilisez Summarize (rid = By (: runid), ibeg = Min (: seq), iend = Max (: seq)). Ensuite, utilisez les affectations de table. Je n'ai pas montré d'exemple de cette méthode car je pense que ce serait plus lent que les manipulations de table.
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 fichier JSL agréable serait un message de table de données dans Order By (liste), dt << Order Columns By (mylist) ou dt << Move Columns (list, After | Before | To Last | To First). Actuellement, je trouve le sous-ensemble (Colonnes (liste)) le plus rapide.