Script pour boucler et regrouper les colonnes par nom, de manière dynamiqueJ'essaie donc de comprendre cela et cela ne fonctionne tout simplement pas tout à fait.
J'ai une table avec une paire clé-valeur que j'ai SPLIT de Tall à Wide. Je me retrouve avec environ 10 000 colonnes qui ont toutes une structure de nommage régulière, comme
"15.02.0 param1", "15.02 param2", "15.02 param3"...."15.03 param1", "15.03 param2", "15.03 param3",...
Comment puis-je parcourir toutes ces colonnes et les regrouper dynamiquement par le terme de départ ? c'est à dire. toutes les colonnes de 15,02 % dans un groupe, toutes les colonnes de 15,03 %, toutes les 15,04 %, ... toutes les 17,06 %.... et nommez le groupe en fonction du numéro groupby ?
Mon script regroupe simplement tout dans un seul groupe. ug.
//**split Aggregate Data from TALL to WIDE, grouping WIDE columns by StepID
dt = current data table();
Summarize( dt, RecipeStepIndex = by( :RecipeStepId) );//get list of unique RecipeStepID's
//split the table TALL to WIDE
dt << Split(
Split By( :RecipeStepId, :ParameterName, :AggregateFunction ),
Split( :Value ),
Group( :Recipe, :ProcessTime, :Tool, :Chamber, :Lot, :WaferScribe ),
Output Table( "AggWide" ),
Remaining Columns( Drop All ),
Sort by Column Property,
dt << sort( by( :Recipe, :Tool, :Chamber, :Lot, :WaferScribe ))<BR />
);
dtAggWide = current data table();
ColNamesList = dtAggWide << get column names(string, continuous); //get the column names of the WIDE table
//Create an empty list for the matching columns
RecipeStepList = {};
// Find matching column names
For( i = 1, i <= N items( RecipeStepIndex ), i++,
For( j = 1, j <= N Items( ColNamesList ), j++,
If(
Contains( ColNamesList[j], RecipeStepIndex[i] ),
Insert Into( RecipeStepList, ColNamesList[j] ),
);
);
);
// If groups of columns are found, create Col groupings
If( N Items( RecipeStepList ) > 0,
dtAggWide << select columns( RecipeStepList );
dtAggWide << group columns();
);Fusion et nettoyage des donnéesRe : Script pour boucler et regrouper les colonnes par nom, de manière dynamiquegotchya. J'ai compris comment faire fonctionner les deux versions! Un grand merci et bravo.
Pour quiconque dans le futur, voici mes versions finies :
V1=
//**split Aggregate Data from TALL to WIDE, grouping WIDE columns by StepID
dt = current data table();
//Build and prefill an Array of names of the RecipeStepId
Summarize( dt, RecipeStepIndex = by( :RecipeStepId) );//get list of unique RecipeStepID's
aa_groups = Associative Array(RecipeStepIndex, Repeat({{}}, N Items(RecipeStepIndex)));
//split the table TALL to WIDE
dt << Split(
Split By( :RecipeStepId, :ParameterName, :AggregateFunction ),
Split( :Value ),
Group( :Recipe, :ProcessTime, :Tool, :Chamber, :Lot, :WaferScribe ),
Output Table( "AggWide" ),
Remaining Columns( Drop All ),
Sort by Column Property,
dt << sort( by( :Recipe, :Tool, :Chamber, :Lot, :WaferScribe ))
);
//Group the Cols by name of RecipeStepId
col_list = dtAggWIDE << Get Column Names("String"); //get the col list
For Each({col_name}, col_list,
col_group = Word(1, col_name, " ");
If(!Contains(aa_groups, col_group),
aa_groups[col_group] = Eval List({col_name});
,
Insert Into(aa_groups[col_group], col_name);
);
);
For Each({{key, value}}, aa_groups, //perform the grouping
dtAggWide << Group Columns(key, value);
);
V2=
//**split Aggregate Data from TALL to WIDE, grouping WIDE columns by StepID
dt = current data table();
//Build and prefill an Array of names of the RecipeStepId
Summarize( dt, RecipeStepIndex = by( :RecipeStepId) );//get list of unique RecipeStepID's
aa_groups = Associative Array();
//split the table TALL to WIDE
dt << Split(
Split By( :RecipeStepId, :ParameterName, :AggregateFunction ),
Split( :Value ),
Group( :Recipe, :ProcessTime, :Tool, :Chamber, :Lot, :WaferScribe ),
Output Table( "AggWide" ),
Remaining Columns( Drop All ),
Sort by Column Property,
dt << sort( by( :Recipe, :Tool, :Chamber, :Lot, :WaferScribe ))
);
//Group the Cols by name of RecipeStepId
col_list = dtAggWide << Get Column Names("String");
For Each({col_name}, col_list,
col_group = Word(1, col_name, " ");
If(!Contains(aa_groups, col_group),
aa_groups[col_group] = {};
);
Insert Into(aa_groups[col_group], col_name)
);
For Each({{key, value}}, aa_groups, //perform the grouping
dtAggWide << Group Columns(key, value);
);Re : Script pour boucler et regrouper les colonnes par nom, de manière dynamiqueJe pense que cette erreur signifie que vous n'avez pas de clé dans le tableau associatif. Si vous avez essayé le deuxième code, votre code contient-il cette ligne :
aa_groups = Associative Array(RecipeStepIndex, Repeat({{}}, N Items(RecipeStepIndex)));
il est utilisé pour initialiser aa_groups. Aussi si le RecetteÉtapeIndex ne correspond pas à col_group = Word(1, col_name, " "); vous obtiendrez cette erreur. Vous devrez peut-être ajouter une gestion supplémentaire pour des cas comme celui-là (ajouter un groupe qui collectera toutes les colonnes manquantes ou n'ajoutera que les colonnes trouvées).
Cela devrait ignorer les colonnes qui n'ont pas de groupe correspondant.
For Each({col_name}, col_list,
col_group = Word(1, col_name, " ");
If(!Contains(aa_groups, col_group),
aa_groups[col_group] = Eval List({col_name});
,
Insert Into(aa_groups[col_group], col_name);
);
);
Re : Script pour boucler et regrouper les colonnes par nom, de manière dynamiqueOK, je pense que je vois ce que vous voulez dire, j'étais confus pourquoi vous créiez un nouveau dt, mais ressemble juste pour l'exemple.
votre deuxième ensemble de code ne semble pas fonctionner pour moi, mais le premier a fonctionné. Une idée de ce que signifie cette erreur ?

//Group the Cols by name of RecipeStepId
col_list = dtAggWIDE << Get Column Names("String");
For Each({col_name}, col_list,
col_group = Word(1, col_name, " ");
If(!Contains(aa_groups, col_group),
aa_groups[col_group] = {};
);
Insert Into(aa_groups[col_group], col_name)
);
Show(aa_groups);
For Each({{key, value}}, aa_groups,
dtAggWide << Group Columns(key, value);
);
Re : Script pour boucler et regrouper les colonnes par nom, de manière dynamiquedtAggWide est là car c'est la table de données qui contient les colonnes que vous souhaitez regrouper. Dans le code ci-dessus, il vous manque une référence, le moyen le plus simple et le meilleur de l'ajouter serait (cela évitera d'utiliser Current Data Table() qui pourrait ou non fonctionner):
dtAggWide = dt << Split(
Split By( :RecipeStepId, :RecipeStepName, :ParameterName, :AggregateFunction ),
Split( :Value ),
Group( :Recipe, :ProcessTime, :Tool, :Chamber, :Lot, :WaferScribe ),
Output Table( "AggWide" ),
Remaining Columns( Drop All ),
Sort by Column Property,
dt << sort( by( :Recipe, :Tool, :Chamber, :Lot, :WaferScribe ))
);
Et col_list est là pour boucler sur les colonnes dans dtAggWide, puis ajouter les colonnes pour corriger les listes dans le tableau associatif aa_groups
Re : Script pour boucler et regrouper les colonnes par nom, de manière dynamiqueHmm. Je suis un peu coincé et je ne sais pas ce que vous faites ici.
Pourquoi avoir encore dtAggWide et col_list ?
//*****************************************************************
//**split Aggregate Data from TALL to WIDE, grouping WIDE columns by StepID
dt = current data table();
//Build and prefill an Array of names of the RecipeStepId
aa_groups = Associative Array();
Summarize( dt, RecipeStepIndex = by( :RecipeStepId) );//get list of unique RecipeStepID's
aa_groups = Associative Array(RecipeStepIndex, Repeat({{}}, N Items(RecipeStepIndex)));
//split the table TALL to WIDE
dt << Split(
Split By( :RecipeStepId, :RecipeStepName, :ParameterName, :AggregateFunction ),
Split( :Value ),
Group( :Recipe, :ProcessTime, :Tool, :Chamber, :Lot, :WaferScribe ),
Output Table( "AggWide" ),
Remaining Columns( Drop All ),
Sort by Column Property,
dt << sort( by( :Recipe, :Tool, :Chamber, :Lot, :WaferScribe ))
);
//Group the Cols by name of RecipeStepId
For Each({col_name}, col_list,
col_group = Word(1, col_name, " ");
Insert Into(aa_groups[col_group], col_name)
);
For Each({{key, value}}, aa_groups,
dtAggWide << Group Columns(key, value);
);Re : Script pour boucler et regrouper les colonnes par nom, de manière dynamiqueVous pouvez "pré-remplir" le tableau associatif par exemple avec les noms de colonne basés sur RecipeStepIndex. Très probablement, RecipeStepIndex sera trouvé à partir du début des noms de colonne fractionnés, cela devrait donc toujours fonctionner.
Names Default To Here(1);
// this solution requires JMP16
dtAggWide = New Table("Untitled",
Add Rows(0),
New Column("15.02.0 param1", Numeric, "Continuous", Format("Best", 12), Set Values([])),
New Column("15.02.0 param2", Numeric, "Continuous", Format("Best", 12), Set Values([])),
New Column("15.02.0 param3", Numeric, "Continuous", Format("Best", 12), Set Values([])),
New Column("15.03 param1", Numeric, "Continuous", Format("Best", 12), Set Values([])),
New Column("15.03 param2", Numeric, "Continuous", Format("Best", 12), Set Values([]))
);
col_list = dtAggWide << Get Column Names("String");
// first get the column group names and columns// in this solution case we use associative array
aa_groups = Associative Array();
//Summarize(dt, RecipeStepIndex = by(:RecipeStepId));//get list of unique RecipeStepID's
RecipeStepIndex = {"15.02.0", "15.03"};
aa_groups = Associative Array(RecipeStepIndex, Repeat({{}}, N Items(RecipeStepIndex)));
For Each({col_name}, col_list,
col_group = Word(1, col_name, " ");
Insert Into(aa_groups[col_group], col_name)
);
For Each({{key, value}}, aa_groups,
dtAggWide << Group Columns(key, value);
);
Re : Script pour boucler et regrouper les colonnes par nom, de manière dynamiquemerci, je vais essayer ça sous peu.
Mais qu'en est-il de la construction dynamique de la liste des tableaux de regroupement ? Fondamentalement, chaque valeur unique de :RecipeStepId doit être un nom groupby. J'ai essayé de le faire au début, avant de diviser la table, en l'enregistrant dans le "RecipeStepIndex"
Summarize( dt, RecipeStepIndex = by( :RecipeStepId) );//get list of unique RecipeStepID's
Re : Script pour boucler et regrouper les colonnes par nom, de manière dynamiqueIl existe de nombreuses façons de procéder.
Voici un exemple qui construit d'abord les groupes dans un tableau associatif avec la clé comme nom du groupe et la valeur est la liste des colonnes du groupe, puis boucle sur ce tableau associatif pour regrouper les colonnes dans la table de données. Pour obtenir les noms de groupe, nous utilisons la fonction Word () sur les noms de colonne. Cela nécessite JMP16 en raison de l'utilisation de For Each
Names Default To Here(1);
// this solution requires JMP16
dtAggWide = New Table("Untitled",
Add Rows(0),
New Column("15.02.0 param1", Numeric, "Continuous", Format("Best", 12), Set Values([])),
New Column("15.02.0 param2", Numeric, "Continuous", Format("Best", 12), Set Values([])),
New Column("15.02.0 param3", Numeric, "Continuous", Format("Best", 12), Set Values([])),
New Column("15.03 param1", Numeric, "Continuous", Format("Best", 12), Set Values([])),
New Column("15.03 param2", Numeric, "Continuous", Format("Best", 12), Set Values([]))
);
col_list = dtAggWide << Get Column Names("String");
// first get the column group names and columns<BR />// in this solution case we use associative array
aa_groups = Associative Array();
For Each({col_name}, col_list,
col_group = Word(1, col_name, " ");
If(!Contains(aa_groups, col_group),
aa_groups[col_group] = {};
);
Insert Into(aa_groups[col_group], col_name)
);
Show(aa_groups);
For Each({{key, value}}, aa_groups,
dtAggWide << Group Columns(key, value);
);

Re : Script pour parcourir et regrouper les colonnes par nom, de manière dynamiqueExiste-t-il un moyen de rechercher un personnage spécifique, puis de l'utiliser comme nom de groupe ? De cette façon, c'est une longueur dynamique pour la première section ?
Re : Script pour parcourir et regrouper les colonnes par nom, de manière dynamiqueVous modifieriez la partie où col_group est déterminé, puis continueriez en conséquence.