IF式で列変数を使用する親愛なるコミュニティの皆様
以下では、ダイアログによってもたらされたいくつかの変数を使用しています。
- ColSelect: 分析する列
- quantVal1 & quantVal2: 分位値
次のスクリプトでは、「カテゴリ」列を作成し、それを表にして各分位の金額を取得します。
2 つの問題:
- ハードコードされた列名を Eval() メソッドで置き換えても機能しません
- 列がすでに存在するかどうかをテストし、存在する場合はその式を更新するにはどうすればよいですか?
これにより、データ テーブルの読み込みと処理を最初からやり直すことなく、新しい列と分位数で分析プロセス全体を更新できます。
//Custom Quantiles amounts
dt << New Column( "Categories",
Numeric, "Continuous",
Format( "Best", 9 ),
Formula(
If( Eval( colSelect )/*:Total Time From CheckIn Collector To Exit*/ <= quantVal1,
1,
If( Eval( colSelect )/*:Total Time From CheckIn Collector To Exit*/ <= quantVal2,
2,
3
)
)
),
Set Property( "Value Order", {} ),
Set Property(
"Color Gradient",
{{"Green to Orange to Red", 4099, {{0, 227, 0}, {255, 255, 0}, {252, 11, 11}}, {0, 0.5, 1}}, Range( {1, 3, 1} )}
),
Color Cell by Value,
Set Display Width( 74 )
);ありがとう!
高度な統計モデリング自動化とスクリプト作成コンテンツの構成データアクセスデータのブレンディングとクリーンアップデータの探索と視覚化実験計画法マスカスタマイゼーションRe: IF式で列変数を使用するこのコードのわずかな欠点は、Formula 内の変数が後で定義されなくなることです。
これは、数式エディターの赤い波によって確認できます。

結果: 将来テーブル内の値が変更された場合、列は自動的に更新されません。
@jthiから学んだアプローチを使用すると、より堅牢なコードを生成できます。
NameExpr(As Column()) をExpr()の中に入れます。
すると、式は次のようになります。

将来、入力値が更新された場合、列の値も更新されます:)
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
colSelect ="age";
quantVal1 = 13;
quantVal2 = 16;
//Custom Quantiles amounts
Eval(Eval Expr(dt << New Column( "Categories",
Numeric, "Continuous",
Format( "Best", 9 ),
Formula(
If( Expr( NameExpr(As Column(dt, colSelect)) )/*:Total Time From CheckIn Collector To Exit*/ <= Expr(quantVal1),
1,
If( Expr( Name Expr(As Column(dt, colSelect)) )/*:Total Time From CheckIn Collector To Exit*/ <= Expr(quantVal2),
2,
3
)
)
),
Set Property( "Value Order", {} ),
Set Property(
"Color Gradient",
{{"Green to Orange to Red", 4099, {{0, 227, 0}, {255, 255, 0}, {252, 11, 11}}, {0, 0.5, 1}}, Range( {1, 3, 1} )}
),
Color Cell by Value,
Set Display Width( 74 )
)));
dt:age[12]=40;
Re: IF式で列変数を使用するバイロンさん、改めて感謝します。
両方を試し、提供されたリンクのいくつかを読んだ後、最終的には両方を組み合わせたものがうまくいきました: AsColumn()
皆さんありがとう!
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
colSelect = "age";
quantVal1 = 13;
quantVal2 = 16;
//Custom Quantiles amounts
Eval(Eval Expr(dt << New Column( "Categories",
Numeric, "Continuous",
Format( "Best", 9 ),
Formula(
If( AsColumn( colSelect )/*:age*/ <= quantVal1,
1,
If( AsColumn( colSelect )/*:age*/ <= quantVal2,
2,
3
)
)
),
Set Property( "Value Order", {} ),
Set Property(
"Color Gradient",
{{"Green to Orange to Red", 4099, {{0, 227, 0}, {255, 255, 0}, {252, 11, 11}}, {0, 0.5, 1}}, Range( {1, 3, 1} )}
),
Color Cell by Value,
Set Display Width( 74 )
)));
colList = dt << Get Column Names("String");
Show(Contains(colList, "Categories")); //will return indexRe: IF式で列変数を使用する次の 2 つの引数も見てみましょう。
カラム()
名前として()
スクリプトが ColSelect を列名ではなくテキスト文字列として解析しようとしている可能性があります
Re: IF式で列変数を使用するジャーモ、本当にありがとう、
あなたの返信に部分的な解決策があります。
それでも、colSelect トリックは列名ではなく、指定された数値でのみ機能します (言い忘れました)。
あなたの例のおかげで、それは次のようになります(Expr (colSelect)はこの更新されたコンテキストでは機能しません):
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
colSelect = "age";
quantVal1 = 13;
quantVal2 = 16;
//Custom Quantiles amounts
Eval(Eval Expr(dt << New Column( "Categories",
Numeric, "Continuous",
Format( "Best", 9 ),
Formula(
If( /*Expr( colSelect )*/:age <= quantVal1,
1,
If( /*Expr( colSelect )*/:age <= quantVal2,
2,
3
)
)
),
Set Property( "Value Order", {} ),
Set Property(
"Color Gradient",
{{"Green to Orange to Red", 4099, {{0, 227, 0}, {255, 255, 0}, {252, 11, 11}}, {0, 0.5, 1}}, Range( {1, 3, 1} )}
),
Color Cell by Value,
Set Display Width( 74 )
)));
colList = dt << Get Column Names("String");
Show(Contains(colList, "Categories")); //will return index
Re: IF式で列変数を使用するこんにちは、バイロン
Show(colSelect) はリストではなく単純な文字列を返します (これは、Dialog 引数を渡すときに処理しました)。
ColSelect = "チェックインから退出までの合計時間";
この PDF を調べてみます、ありがとうRe: IF式で列変数を使用するColSelect はダイアログから取得されているため、実際には 1 つの項目のリストである可能性があります。
ColSelect を評価すると、何が返されますか? {:colname} の場合、それは 1 つの項目のリストです
ColSelect[1] を評価してみてください。リストからのものであれば :colname が返されます。
この場合、 eval() はリストを返します。
Eval list() も見てください
この投稿には表現を理解するのに非常に役立つ PDF が添付されています。
式処理関数: パート I - Expr()、NameExpr()、Eval() などの難題を解明する
Re: IF式で列変数を使用する1. 数式の値を置き換える方法に関する良いスレッド:
Eval Insert、Eval Expr、Parse、Substitute を使用して、ある式を別の式に挿入する
数式が必要ない場合は、<< Set Each Value を使用することをお勧めします。
2. dt << Get Column Names("String") を使用して列名のリストを取得し、Contains() を使用してそのリスト内の列を確認できます。
これは機能するはずです:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
colSelect = 1;
quantVal1 = 1;
quantVal2 = 2;
//Custom Quantiles amounts
Eval(Eval Expr(dt << New Column( "Categories",
Numeric, "Continuous",
Format( "Best", 9 ),
Formula(
If( Expr( colSelect )/*:Total Time From CheckIn Collector To Exit*/ <= Expr(quantVal1),
1,
If( Expr( colSelect )/*:Total Time From CheckIn Collector To Exit*/ <= Expr(quantVal2),
2,
3
)
)
),
Set Property( "Value Order", {} ),
Set Property(
"Color Gradient",
{{"Green to Orange to Red", 4099, {{0, 227, 0}, {255, 255, 0}, {252, 11, 11}}, {0, 0.5, 1}}, Range( {1, 3, 1} )}
),
Color Cell by Value,
Set Display Width( 74 )
)));
colList = dt << Get Column Names("String");
Show(Contains(colList, "Categories")); //will return index