Skript zum dynamischen Durchlaufen und Gruppieren von Spalten nach NamenAlso versuche ich das herauszufinden, aber es funktioniert einfach nicht ganz.
Ich habe eine Tabelle mit einem Schlüssel-Wert-Paar, das ich von Tall nach Wide aufgeteilt habe. Am Ende habe ich ungefähr 10.000 Spalten, die alle eine regelmäßige Namensstruktur haben
„15.02.0 param1“, „15.02 param2“, „15.02 param3“.…“15.03 param1“, „15.03 param2“, „15.03 param3“,...
Wie kann ich alle diese Spalten durchsehen und sie dynamisch nach dem Startbegriff gruppieren? dh. alle 15,02 %-Spalten in einer Gruppe, alle 15,03 %-Spalten, alle 15,04 %, ... alle 17,06 % ... und die Gruppe basierend auf der Groupby-Nummer benennen?
Mein Skript gruppiert einfach alles in einer einzigen Gruppe. 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();
);Datenmischung und -bereinigungBetreff: Skript zum dynamischen Durchlaufen und Gruppieren von Spalten nach NamenGotchya. Ich habe herausgefunden, wie ich beide Versionen zum Laufen bekomme! Vielen Dank und großes Lob.
Für alle, die in der Zukunft dabei sein werden, hier sind meine fertigen Versionen:
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);
);Betreff: Skript zum dynamischen Durchlaufen und Gruppieren von Spalten nach NamenIch denke, dieser Fehler bedeutet, dass Sie keinen Schlüssel im assoziativen Array haben. Wenn Sie den zweiten Code ausprobiert haben, enthält Ihr Code diese Zeile:
aa_groups = Associative Array(RecipeStepIndex, Repeat({{}}, N Items(RecipeStepIndex)));
Es wird verwendet, um aa_groups zu initialisieren. Auch wenn die RecipeStepIndex stimmen nicht mit überein col_group = Word(1, col_name, " "); Sie erhalten diesen Fehler. Für solche Fälle müssen Sie möglicherweise eine zusätzliche Behandlung hinzufügen (Gruppe hinzufügen, die alle fehlenden Spalten sammelt, oder nur gefundene Spalten hinzufügen).
Dadurch sollten Spalten übersprungen werden, die keine passende Gruppe haben.
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);
);
);
Betreff: Skript zum dynamischen Durchlaufen und Gruppieren von Spalten nach NamenOK, ich glaube, ich verstehe, was Sie meinen. Ich war verwirrt, warum Sie ein neues DT erstellt haben, aber es sieht so aus, als wäre es nur ein Beispiel.
Ihr zweiter Satz Code scheint bei mir nicht zu funktionieren, der erste Satz jedoch schon. Irgendeine Idee, was dieser Fehler bedeutet?

//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);
);
Betreff: Skript zum dynamischen Durchlaufen und Gruppieren von Spalten nach NamendtAggWide ist vorhanden, weil es die Datentabelle ist, die die Spalten enthält, die Sie gruppieren möchten. Im obigen Code fehlt Ihnen ein Verweis darauf. Der einfachste und beste Weg, ihn hinzuzufügen, wäre (dadurch wird die Verwendung von Current Data Table() vermieden, die möglicherweise funktioniert oder auch nicht):
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 ))
);
Und col_list dient dazu, die Spalten in dtAggWide zu durchlaufen und die Spalten dann zu korrekten Listen im assoziativen Array aa_groups hinzuzufügen
Betreff: Skript zum dynamischen Durchlaufen und Gruppieren von Spalten nach NamenHmm. Ich stecke etwas fest und bin mir nicht sicher, was Sie hier tun.
Warum noch dtAggWide und 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);
);Betreff: Skript zum dynamischen Durchlaufen und Gruppieren von Spalten nach NamenSie könnten das assoziative Array beispielsweise mit den Spaltennamen basierend auf RecipeStepIndex „vorab füllen“. Höchstwahrscheinlich wird RecipeStepIndex am Anfang geteilter Spaltennamen gefunden, sodass dies weiterhin funktionieren sollte.
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);
);
Betreff: Skript zum dynamischen Durchlaufen und Gruppieren von Spalten nach NamenDanke, ich werde es in Kürze versuchen.
Aber wie sieht es mit der dynamischen Erstellung der Gruppierungs-Array-Liste aus? Grundsätzlich sollte jeder eindeutige Wert von :RecipeStepId ein Groupby-Name sein. Ich habe das am Anfang versucht, bevor ich die Tabelle geteilt und im „RecipeStepIndex“ gespeichert habe.
Summarize( dt, RecipeStepIndex = by( :RecipeStepId) );//get list of unique RecipeStepID's
Betreff: Skript zum dynamischen Durchlaufen und Gruppieren von Spalten nach NamenEs gibt viele Möglichkeiten, dies zu tun.
Hier ist ein Beispiel, das die Gruppen zunächst in ein assoziatives Array mit dem Schlüssel als Namen der Gruppe und dem Wert einer Liste der Spalten in der Gruppe einrichtet und dann dieses assoziative Array durchläuft, um Spalten in der Datentabelle zu gruppieren. Um Gruppennamen zu erhalten, verwenden wir die Word()-Funktion für die Spaltennamen. Dies erfordert JMP16 aufgrund der Verwendung von 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);
);

Betreff: Skript zum dynamischen Durchlaufen und Gruppieren von Spalten nach NamenGibt es eine Möglichkeit, nach einem bestimmten Zeichen zu suchen und dieses dann als Gruppennamen zu verwenden? Auf diese Weise ist es eine dynamische Länge für den ersten Abschnitt?
Betreff: Skript zum Durchlaufen und dynamischen Gruppieren von Spalten nach NamenSie würden den Teil ändern, in dem col_group bestimmt wird, und dann entsprechend fortfahren.