ネストされた For ループで 1 つの元のテーブルから複数の積み重ねられたテーブルを作成することは可能ですか?1 つの元のデータ テーブルから複数のスタック テーブルを自動的に作成したいと考えています。キーワードのリストを作成し、元のテーブルのいずれかの列にそのキーワードが含まれている場合は、新しいデータ テーブルにスタックされるようにする予定です。基本的に、キーワードのリストは 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 ループが新しく作成されたテーブルではなく元のデータ テーブルを参照するようにするにはどうすればよいですか。 ありがとうございます!
最高、
カオティラマ
自動化とスクリプトコンテンツの編成ウィンドウズRe: ネストされた For ループで 1 つの元のテーブルから複数の積み重ねられたテーブルを作成することは可能ですか?スタック入力に元のデータを使用するように指定するだけです
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 = {};
);Re: ネストされた For ループで 1 つの元のテーブルから複数の積み重ねられたテーブルを作成することは可能ですか?やあジム、
残念ながら、すでに試してみましたが、うまくいかないようです。まだ混乱していて、i=2 の反復を実行するときに、新しく積み重ねられたテーブルを参照していると考えてしまいます。新しく積み重ねられたテーブルには 4 つの列があるため、それがわかります。私が受け取るエラーは、j=5 のときに失敗する j インデックス エラーです。

参考までに、私は JMP Pro 17.2 を使用しています。
Re: ネストされた For ループで 1 つの元のテーブルから複数の積み重ねられたテーブルを作成することは可能ですか?コードに2つの変更を加えたのに、1つだけ変更したと誤解させてしまったかもしれません。最新のテストを行ったときに、次の行を使用しましたか?
tempTable = data table("Original Data") << Stack(
実行して、指定したエラーが発生した場合は、サンプル データ テーブルの提供をお願いし、問題をさらに調査します。
Re: ネストされた For ループで 1 つの元のテーブルから複数の積み重ねられたテーブルを作成することは可能ですか?やあジム、
心配しないでください。更新されたコードとサンプル データがここにあります。提案された変更ではまだ動作しません。
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");
);見つけたものを教えてください。ありがとう
Re: ネストされた For ループで 1 つの元のテーブルから複数の積み重ねられたテーブルを作成することは可能ですか?スクリプトを台無しにしていたのは、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");
);Re: ネストされた For ループで 1 つの元のテーブルから複数の積み重ねられたテーブルを作成することは可能ですか?ジム、
この件についてご協力いただき、誠にありがとうございます。非常にわかりやすく説明されており、完璧に動作します。
最高、
カオティラマ
Re: ネストされた For ループで 1 つの元のテーブルから複数の積み重ねられたテーブルを作成することは可能ですか?スクリプトを大幅に変更した別の提案を次に示します。これは、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);