是否可以在嵌套的 For 循环中从一个原始表创建多个堆叠表?我想自动从一张原始数据表创建多个堆叠表。我计划通过创建一个关键字列表来实现这一点,如果原始表中的任何列包含该关键字,那么它将堆叠在新的数据表中。本质上,我有 3 个关键字的列表,所以我将创建 3 个堆叠数据表。我的脚本有一个嵌套的 for 循环,用于遍历原始数据表中的所有列,并查看它们是否包含被索引的关键字。见下文:
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");
);
执行此代码时出现的问题是,第一个组可以正常堆叠,但是当 for 循环索引到 i=2 来查找下一个组时,它无法查看原始数据表,而是查看刚刚堆叠的表(在本例中为数据表“abc Stacked”)。
我怎样才能使我的 for 循环查看原始数据表而不是新创建的表。谢谢!
最好的,
卡奥蒂克拉马
自动化和脚本内容组织视窗回复:是否可以在嵌套 For 循环中从一个原始表创建多个堆叠表?您只需指定使用原始数据到堆栈输入
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 = {};
);回复:是否可以在嵌套 For 循环中从一个原始表创建多个堆叠表?嘿吉姆,
不幸的是,我已经尝试过这个,但似乎不起作用。在执行 i=2 迭代时,它仍然会感到困惑,并认为我指的是新堆叠的表。我可以分辨出来,因为我的新堆叠表有 4 列。我收到的错误是 j 索引错误,当 j=5 时失败。

作为参考,我使用的是 JMP Pro 17.2。
回复:是否可以在嵌套 For 循环中从一个原始表创建多个堆叠表?我可能让你困惑了,因为你对代码做了 2 处更改,但只说了 1 处。当你做最近的测试时,你使用了以下代码吗?
tempTable = data table("Original Data") << Stack(
如果您这样做了,然后得到了您指定的错误,我会要求您提供一个示例数据表,然后我会进一步探讨这个问题。
回复:是否可以在嵌套 For 循环中从一个原始表创建多个堆叠表?嘿吉姆,
不用担心,这是更新后的代码和示例数据。它仍然无法按照您建议的更改运行。
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");
);请告诉我你发现了什么。谢谢
回复:是否可以在嵌套 For 循环中从一个原始表创建多个堆叠表?是 Column Name() 函数搞乱了脚本。它指向当前活动的数据表。因此,我将当前数据表的设置添加回原始示例数据表。
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");
);回复:是否可以在嵌套 For 循环中从一个原始表创建多个堆叠表?吉姆,
非常感谢你的帮助!解释得非常好,而且效果很好。
最好的,
卡奥蒂克拉马
回复:是否可以在嵌套 For 循环中从一个原始表创建多个堆叠表?这是另一个建议,它对您的脚本进行了相当大的修改。它使用了一种略有不同的方法,即使用 For Each()(在我看来,比 For() 更容易阅读)和关联数组来收集列组。
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);