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 à 15,02 % d'un groupe, toutes les colonnes à 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, :EquipmentId, :ChamberId, :LotId, :SlotNo ))
);
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();
);ScriptRe : 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 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 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);
);