Ist das Erstellen mehrerer gestapelter Tabellen aus einer Originaltabelle in einer verschachtelten For-Schleife möglich?Ich möchte das Erstellen mehrerer gestapelter Tabellen aus einer ursprünglichen Datentabelle automatisieren. Ich plane, dies zu tun, indem ich eine Liste mit Schlüsselwörtern erstelle, und wenn eine Spalte in meiner ursprünglichen Tabelle dieses Schlüsselwort enthält, wird es in einer neuen Datentabelle gestapelt. Im Wesentlichen habe ich eine Liste mit 3 Schlüsselwörtern, also würde ich 3 gestapelte Datentabellen erstellen. Mein Skript hat eine verschachtelte For-Schleife, um alle Spalten in der ursprünglichen Datentabelle zu durchlaufen und zu sehen, ob sie das indizierte Schlüsselwort enthalten. Siehe unten:
groupNames = {"abc", "def", "ghi"};
for (i = 1, i <= nitems(groupNames), i++,
for (j = 1, j <= ncols(Data Table("Original Data")), j++,
if ((contains(Column Name(j), groupNames[i])),
Insert Into(tempStack, Column Name(j));
);
);
tempTable = Stack(
Columns(tempStack),
Source Label Column("Label"),
Stacked Data Column("Data"),
"Non-stacked columns"n (Keep(:tst_temp, :stdf_file)),
);
tempStack = {};
tempTable << set name(char(groupNames[i]) || " Stacked");
);
Das Problem, das bei der Ausführung dieses Codes entsteht, besteht darin, dass die erste Gruppe problemlos gestapelt wird, die For-Schleife beim Indexieren auf i=2 zum Suchen nach der nächsten Gruppe jedoch nicht die ursprüngliche Datentabelle betrachtet, sondern die Tabelle, die gerade gestapelt wurde (in diesem Fall die Datentabelle „abc Stacked“).
Wie kann ich es so einrichten, dass meine For-Schleife meine ursprüngliche Datentabelle betrachtet und nicht die neu erstellte Tabelle? Danke!
Am besten,
Abonnieren
Automatisierung und SkriptingInhaltsorganisationWindowsBetreff: Ist das Erstellen mehrerer gestapelter Tabellen aus einer Originaltabelle in einer verschachtelten For-Schleife möglich?Sie müssen nur angeben, dass die Originaldaten für den Stack-Eingang verwendet werden sollen.
groupNames = {"abc", "def", "ghi"};
For( i = 1, i <= N Items( groupNames ), i++,
For( j = 1, j <= N Cols( Data Table( "Original Data" ) ), j++,
If( (Contains( Column Name( j ), groupNames[i] )),
Insert Into( tempStack, Column Name( j ) )
)
);
tempTable = data table("Original Data") << Stack(
Columns( tempStack ),
Source Label Column( "Label" ),
Stacked Data Column( "Data" ),
"Non-stacked columns"n( Keep( :tst_temp, :stdf_file ) ),
Output Table( Char( groupNames[i] ) || " Stacked" )
);
tempStack = {};
);Betreff: Ist das Erstellen mehrerer gestapelter Tabellen aus einer Originaltabelle in einer verschachtelten For-Schleife möglich?Hallo Jim,
Leider habe ich das bereits versucht und es scheint nicht zu funktionieren. Es ist immer noch verwirrt und denkt, ich beziehe mich auf die neu gestapelte Tabelle, wenn ich die Iteration i=2 ausführe. Ich kann das erkennen, weil meine neu gestapelte Tabelle 4 Spalten hat. Der Fehler, den ich erhalte, ist ein j-Indizierungsfehler, der fehlschlägt, wenn j=5.

Als Referenz verwende ich JMP Pro 17.2.
Betreff: Ist das Erstellen mehrerer gestapelter Tabellen aus einer Originaltabelle in einer verschachtelten For-Schleife möglich?Ich habe Sie vielleicht verwirrt, weil ich zwei Änderungen an Ihrem Code vorgenommen habe, aber nur von einer gesprochen habe. Haben Sie bei Ihrem letzten Test die Zeile
tempTable = data table("Original Data") << Stack(
Wenn Sie dies getan haben und anschließend die angegebene Fehlermeldung erhalten haben, werde ich Sie um die Bereitstellung einer Beispieldatentabelle bitten und das Problem näher untersuchen.
Betreff: Ist das Erstellen mehrerer gestapelter Tabellen aus einer Originaltabelle in einer verschachtelten For-Schleife möglich?Hallo Jim,
Keine Sorge, hier sind der aktualisierte Code und die Beispieldaten. Mit der von Ihnen vorgeschlagenen Änderung funktioniert es immer noch nicht.
tempStack = {};
GroupNames = {"abc", "def"};
for (i = 1, i <= nitems(GroupNames), i++,
for (j = 1, j <= ncols(Data Table("Sample")), j++,
if ((contains(Column Name(j), GroupNames[i])),
Insert Into(tempStack, Column Name(j));
);
);
colNum = ncols(Data Table("Sample"));
tempTable = Data Table("Sample") << Stack(
Columns(tempStack),
Source Label Column("Label"),
Stacked Data Column("Data"),
"Non-stacked columns"n (Keep(:tst_temp, :stdf_file)),
Invisible(1)
);
tempStack = {};
tempTable << set name(char(GroupNames[i]) || " Stacked");
);Lassen Sie mich wissen, was Sie finden. Danke
Betreff: Ist das Erstellen mehrerer gestapelter Tabellen aus einer Originaltabelle in einer verschachtelten For-Schleife möglich?Es war die Funktion „Column Name()“, die das Skript durcheinander brachte. Sie verweist auf die aktuell aktive Datentabelle. Daher habe ich die Einstellung der aktuellen Datentabelle wieder zur ursprünglichen Beispieldatentabelle hinzugefügt.
names default to here(1);
tempStack = {};
GroupNames = {"abc", "def"};
for (i = 1, i <= nitems(GroupNames), i++,
Current data table(data table("Sample"));
for (j = 1, j <= ncols(Data Table("Sample")), j++,
if ((contains(Column Name(j), GroupNames[i])),
Insert Into(tempStack, Column Name(j));
);
);
colNum = ncols(Data Table("Sample"));
tempTable = Data Table("Sample") << Stack(
Columns(tempStack),
Source Label Column("Label"),
Stacked Data Column("Data"),
"Non-stacked columns"n (Keep(:tst_temp, :stdf_file)),
Invisible(1)
);
tempStack = {};
tempTable << set name(char(GroupNames[i]) || " Stacked");
);Betreff: Ist das Erstellen mehrerer gestapelter Tabellen aus einer Originaltabelle in einer verschachtelten For-Schleife möglich?Jim,
Vielen Dank für Ihre Hilfe! Sehr gut erklärt und funktioniert perfekt.
Am besten,
Abonnieren
Betreff: Ist das Erstellen mehrerer gestapelter Tabellen aus einer Originaltabelle in einer verschachtelten For-Schleife möglich?Hier ist ein weiterer Vorschlag, der Ihr Skript ziemlich stark verändert hat. Er verwendet einen etwas anderen Ansatz mit For Each() (leichter zu lesen (meiner Meinung nach) als For()) und einem assoziativen Array zum Sammeln der Spaltengruppen.
Names Default To Here(1);
// Initialize Associative Array with groups and empty lists
groups = ["abc" => {}, "def" => {}];
dt = Open("$DOWNLOADS/Sample.jmp");
colnames = dt << Get Column Names("String");
// Collect columns to each key in associative array
For Each({colname}, colnames,
For Each({{group, val}}, groups,
If(Contains(colname, group),
Insert Into(groups[group], colname);
);
);
);
// Loop over the associative array and create the stacked tables
stacked_tables = {};
For Each({{groupname, groupcols}}, groups,
stacked_dt = dt << Stack(
Columns(Eval(groupcols)),
Source Label Column("Label"),
Stacked Data Column("Data"),
"Non-stacked columns"n(Keep(:tst_temp, :stdf_file)),
Output Table(groupname || " Stacked"),
Invisible(1)
);
Insert Into(stacked_tables, stacked_dt);
);
show(stacked_tables);