可変数の入力列を取得できる数式を作成するにはどうすればよいですか?皆さん、
グループ化列によってデータ列を中央揃えにするスクリプトを作成しました。

今のところ、中央揃えの列は1列のみしか考慮されませんが、複数の列を入力できるようにしたいと思っています。数式をより動的にする方法はありますか?現在は、この数式を使って新しい列を開始し、中央揃えの対象となる列を手動で追加しています。
Names Default To Here( 1 );
dt = current data table();
results = Column Dialog(src=ColList("Cols to be centered", Min Col(1)),trg = ColList("centered by", Min Col(1)));
for(i=1, i<= n items(eval(results[1])), i++,
ts=expr(dt << New Column( "cent col", "Numeric",Formula(Expr(Eval( results[1] )[i]) - Col Mean( Expr(Eval( results[1] )[i]), Expr(Eval( results[2] )[1]) ))));
eval(eval expr(TS));
ts=expr(dt:"cent col"n<<SET name=""></SET>
<P>ご意見をいただければ幸いです。</P>
<BR />
<BR /><LINGO-LABS id="lingo-labs-869624" slang="en-US" mode="CREATE"><LINGO-LABEL>自動化とスクリプト</LINGO-LABEL></LINGO-LABS>Re: 可変数の入力列を取得できる数式を作成するにはどうすればよいですか?「列の中央揃え」 - これは非常に頻繁に必要になります。中央揃えの方法(割り算または引き算)と「参照」の計算方法の組み合わせは数百通りあります。

https://marketplace.jmp.com/appdetails/Normalization+GUIをご覧ください。JMP メニューに GUI を追加して、必要な処理を実行できます。行を除外した場合でも機能します。
自分で設定したい場合、基本的な考え方は、式を段階的に操作することです。
たとえば、動的な数のグループ化列を追加するには、 挿入を使用します。
For Each( {groupByCol, idx}, currentGroupCols,
Insert Into( secondArgumentDirect, Name Expr( As Column( dt, groupByCol ) ) )
);Re: 可変数の入力列を取得できる数式を作成するにはどうすればよいですか?グループ化列をさらに追加したいということですか?
Names Default To Here(1);
dt = Current Data Table();
results = Column Dialog(
src=ColList("Cols to be centered", Min Col(1)),
trg = ColList("centered by", Min Col(1))
);
srcs = results["src"];
trgs = results["trg"];
For Each({src}, srcs,
colname = (src << get name) || " centered by";
mean_expr = Expr(Col Mean());
Insert Into(mean_expr, NameExpr(src));
For Each({trg}, trgs,
colname = colname || " " || (trg << get name);
Insert Into(mean_expr, NameExpr(trg));
);
Eval(Substitute(
Expr(dt << New Column(colname, "Numeric", "Continuous", Formula(
_col1_ - _mean_
));
),
Expr(_col1_), Name Expr(src),
Expr(_mean_), Name Expr(mean_expr),
));
);
オプションとして、JMPに新しい計算式列を使用して名前を変更することで、さらにこの処理を実行させることもできます。
Names Default To Here(1);
dt = Current Data Table();
results = Column Dialog(
src=ColList("Cols to be centered", Min Col(1)),
trg = ColList("centered by", Min Col(1))
);
srcs = results["src"];
trgs = results["trg"];
res = dt << New Formula Column(
Operation(Category("Distributional"), "Center"),
Columns(srcs),
Group By(trgs)
);Re: 可変数の入力列を取得できる数式を作成するにはどうすればよいですか?@hogiさん、ありがとうございます。追加しておきます。
ああ、「Insert Into」、それが正解のようです ( @jthiもそう言っています)。
Re: 可変数の入力列を取得できる数式を作成するにはどうすればよいですか?こんにちは@jthi 、
はい、グループ化の列をさらに追加できるようになり、最初のスクリプトは完璧です!ご協力ありがとうございます!
Re: 可変数の入力列を取得できる数式を作成するにはどうすればよいですか?1 つのオプションは、 数式内の列のリストを使用して、一部の式を Col Mean で置き換えるために Substitute を使用することです。
ここにあなたのデータを使った怠惰な例があります
Names Default To Here(1);
dt = Current Data Table();
results = Column Dialog(
src=ColList("Cols to be centered", Min Col(1)),
trg = ColList("centered by", Min Col(1))
);
srcs = results["src"];
trgs = results["trg"];
For Each({src}, srcs,
colname = (src << get name) || " centered by";
l = Insert(trgs, Name Expr(src), 1);
f = Substitute(l, Expr(List), Expr(Col Mean()));
Eval(Substitute(
Expr(dt << New Column(colname, "Numeric", "Continuous", Formula(
_col1_ - _mean_
));
),
Expr(_col1_), Name Expr(src),
Expr(_mean_), Name Expr(f),
));
);
注意点が 1 つあります: 列ダイアログではなく新しいウィンドウを使用してダイアログを構築します。これにより、非常に単純な場合でも柔軟性が大幅に向上します。
Re: 可変数の入力列を取得できる数式を作成するにはどうすればよいですか?追加されたオプションを提供してくれた@jthiに感謝します。
はい、これは新しいウィンドウを使用するように切り替えていなかった古いスクリプトだったので、その悪い癖を修正しました。