[JSL] 「複雑な」条件を使用して行を選択するみなさんこんにちは
「複雑な」条件を持つテーブル内の行を選択する JSL スクリプトを記述したいと思います。
優先順位に従って、メトリック (列:メトリック) ごとに 1 つの行を選択する必要があります。
1-条件Flag1 = “FLAG” AND Flag2 = “FLAG”が存在する場合、この条件のCol Max (:Metric1)を選択します。
2- 条件Flag1 = “FLAG” XOR Flag2 = “FLAG”が存在する場合、この条件のCol Max (:Metric1)を選択します。
3- それ以外の場合は、行 Max (Metric1) を選択します。
以下は For Each Row() とデバッグ列を使用した暫定的なコードですが、私の試みは機能せず、あまりエレガントではありません。
また、基本ゲートの組み合わせを使用せずに JLS で XOR (排他的論理和) を実行する方法もわかりません。
これを行うより良い方法はありますか?
注: 私のリクエストを説明するPNGを添付してください。
ありがとう
- 説教者
Names Default To Here(1);
dt = New Table("RawData",
Add Rows(27),
Compress File When Saved(1),
New Column("Metric",
Character,
"Nominal",
Set Values(
{"A", "A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B", "C", "C", "C", "C", "C", "C", "C", "D", "D", "D", "D", "D", "D", "D"}
)
),
New Column("Flag1",
Character,
"Nominal",
Set Values(
{"FLAG", "OK", "FLAG", "OK", "OK", "OK", "OK", "FLAG", "FLAG", "OK", "OK", "FLAG", "OK", "OK", "FLAG",
"FLAG", "OK", "OK", "OK", "FLAG", "OK", "OK", "OK", "OK", "OK", "OK", "OK"}
)
),
New Column("Flag2",
Character,
"Nominal",
Set Values(
{"OK", "OK", "OK", "OK", "OK", "FLAG", "OK", "FLAG", "FLAG", "OK", "OK", "FLAG", "OK", "OK", "OK",
"OK", "OK", "OK", "OK", "OK", "OK", "OK", "OK", "OK", "OK", "OK", "OK"}
)
),
New Column("metric1",
Numeric,
"Continuous",
Format("Best", 10),
Set Values([1, 2, 3, 5, 7, 10, 13, 2, 4, 5, 6, 8, 11, 1, 2, 4, 5, 5, 9, 12, 1, 2, 4, 5, 5, 9, 18])
)
);
//This attempt doesn't select the right rows
debugcol = dt << New Column("Debug", Numeric, Continuous);
For Each Row(dt,
FLAG_row =
If(
:Flag1 == "FLAG" & :Flag2 == "FLAG",
Col Max(:metric1, :Metric),
IF(
:Flag1 == "FLAG" | :Flag2 == "FLAG",
Col Max(:metric1, :Metric),
If(
:Flag1 == "OK" & :Flag2 == "OK",
Col Max(:metric1, :Metric)
)));
debugcol[Row()] = FLAG_row;
);
dt << select where (:metric1 == :Debug);

基本的なデータ分析とモデリングRe: [JSL] 「複雑な」条件を使用して行を選択するこれが私がこれをやる方法です

Names Default To Here( 1 );
dt = New Table( "RawData",
Add Rows( 27 ),
Compress File When Saved( 1 ),
New Column( "Metric",
Character,
"Nominal",
Set Values(
{"A", "A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B", "C", "C", "C", "C", "C", "C", "C", "D", "D",
"D", "D", "D", "D", "D"}
)
),
New Column( "Flag1",
Character,
"Nominal",
Set Values(
{"FLAG", "OK", "FLAG", "OK", "OK", "OK", "OK", "FLAG", "FLAG", "OK", "OK", "FLAG", "OK", "OK", "FLAG", "FLAG",
"OK", "OK", "OK", "FLAG", "OK", "OK", "OK", "OK", "OK", "OK", "OK"}
)
),
New Column( "Flag2",
Character,
"Nominal",
Set Values(
{"OK", "OK", "OK", "OK", "OK", "FLAG", "OK", "FLAG", "FLAG", "OK", "OK", "FLAG", "OK", "OK", "OK", "OK", "OK",
"OK", "OK", "OK", "OK", "OK", "OK", "OK", "OK", "OK", "OK"}
)
),
New Column( "metric1",
Numeric,
"Continuous",
Format( "Best", 10 ),
Set Values( [1, 2, 3, 5, 7, 10, 13, 2, 4, 5, 6, 8, 11, 1, 2, 4, 5, 5, 9, 12, 1, 2, 4, 5, 5, 9, 12] )
)
);
dt << clear select;
rowsToSelect = {};
groups = associative array(:metric<<GET values=""> 0,
Insert Into( rowsToSelect, Max( theRows ) ),
theRows = dt << get rows where( :metric == group & (:Flag1 == "FLAG" | :Flag2 == "FLAG") );
If( N Rows( theRows ) > 0,
Insert Into( rowsToSelect, Max( theRows ) ),
Insert Into( rowsToSelect, Max( dt << get rows where( :metric == group ) ) )
);
);
);
dt << select rows( rowsToSelect );</GET>Re: [JSL] 「複雑な」条件を使用して行を選択する追加の列がなくても実行できますが、あった方が簡単かもしれません
Names Default To Here(1);
dt = New Table("RawData",
Add Rows(27),
Compress File When Saved(1),
New Column("Metric",
Character,
"Nominal",
Set Values(
{"A", "A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B", "C", "C", "C", "C", "C", "C", "C", "D", "D", "D", "D", "D", "D", "D"}
)
),
New Column("Flag1",
Character,
"Nominal",
Set Values(
{"FLAG", "OK", "FLAG", "OK", "OK", "OK", "OK", "FLAG", "FLAG", "OK", "OK", "FLAG", "OK", "OK", "FLAG", "FLAG", "OK", "OK", "OK", "FLAG",
"OK", "OK", "OK", "OK", "OK", "OK", "OK"}
)
),
New Column("Flag2",
Character,
"Nominal",
Set Values(
{"OK", "OK", "OK", "OK", "OK", "FLAG", "OK", "FLAG", "FLAG", "OK", "OK", "FLAG", "OK", "OK", "OK", "OK", "OK", "OK", "OK", "OK", "OK",
"OK", "OK", "OK", "OK", "OK", "OK"}
)
),
New Column("metric1",
Numeric,
"Continuous",
Format("Best", 10),
Set Values([1, 2, 3, 5, 7, 10, 13, 2, 4, 5, 6, 8, 11, 1, 2, 4, 5, 5, 9, 12, 1, 2, 4, 5, 5, 9, 18])
)
);
typecol = dt << New Column("ROWTYPE", Numeric, Continuous, Formula(
If(:Flag1 == "FLAG" & :Flag2 == "FLAG",
2
, :Flag1 == "OK" & :Flag2 == "OK",
0
,
1
);
));
dt << Select Where(
:metric1 == Col Max(
If(:ROWTYPE == Col Max(:ROWTYPE, :Metric),
:metric1
,
.
),
:Metric
);
);
dt << Delete Columns(typecol);
wait(0);
このソリューションの問題点は、Col 統計関数では列参照以外のものを使用できないため、今後の JMP バージョンで機能しなくなる可能性があることです。これは、JMP がこれらの関数の現在の最も便利な「機能」の 1 つを壊さないことを願う、希望リスト項目です。
Set Each Value で数式表現を使用したり、Col 統計式で最初の引数として表現を使用したりすることが、サポートされる動作になるようにします(これらの関数の使用を減らそうとしていますが、現在これらの関数は非常に強力であり、他のオプションよりも簡単かつ高速で読みやすいスクリプトを作成するため、困難です)。
Re: [JSL] 「複雑な」条件を使用して行を選択するこんにちは、ジムさん
ご返信ありがとうございます。
大変申し訳ございませんが、私のリクエストがあまり明確ではなかったと認識しております。
各メトリック内の行のグループに優先順位を付けた後(スクリプトでうまく機能します)、
現在のスクリプトのようにMax (theRows) に基づくのではなく、最高値の行 (列:metric1) を選択する必要があります。
前に提供したダミー テーブルでは、各グループ内の「Col Max (:metric1)」が常に「Max (theRows)」と等しいため、混乱が生じていました。
提案されたスクリプトは、新しい値のセットでは機能しなくなりました。以下では、列名のあいまいさをなくすために :metric1 を :Value に置き換え、さらに数値を入れ替えました。
「get rows where()」内にルールとして追加された「Col Max()」を試してみましたが、成功しませんでした。
(私の英語は完璧ではないと認識しているので、言葉が正確でない場合は、目標を説明する画像を追加しました)
何か提案はありますか?
再度、感謝します
説教者
Names Default To Here( 1 );
dt = New Table( "RawData",
Add Rows( 27 ),
Compress File When Saved( 1 ),
New Column( "Metric",
Character,
"Nominal",
Set Values(
{"A", "A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B", "C", "C", "C", "C", "C", "C", "C", "D", "D",
"D", "D", "D", "D", "D"}
)
),
New Column( "Flag1",
Character,
"Nominal",
Set Values(
{"FLAG", "OK", "FLAG", "OK", "OK", "OK", "OK", "FLAG", "FLAG", "OK", "OK", "FLAG", "OK", "OK", "FLAG", "FLAG",
"OK", "OK", "OK", "FLAG", "OK", "OK", "OK", "OK", "OK", "OK", "OK"}
)
),
New Column( "Flag2",
Character,
"Nominal",
Set Values(
{"OK", "OK", "OK", "OK", "OK", "FLAG", "OK", "FLAG", "FLAG", "FLAG", "OK", "FLAG", "OK", "OK", "OK", "OK", "OK",
"OK", "OK", "OK", "OK", "OK", "OK", "OK", "OK", "OK", "OK"}
)
),
New Column( "Value",
Numeric,
"Continuous",
Format( "Best", 10 ),
Set Values( [1, 2, 9, 5, 13, 2, 7, 9, 4, 11, 6, 8, 3, 1, 2, 13, 5, 5, 9, 12, 1, 2, 4, 5, 5, 9, 7] )
)
);
dt << clear select;
rowsToSelect = {};
groups = associative array(:metric<<GET values=""> 0,
Insert Into( rowsToSelect, Max( theRows ) ),
theRows = dt << get rows where( :metric == group & (:Flag1 == "FLAG" | :Flag2 == "FLAG") /*& :Value == Col Max (:Value, :Metric, :Flag1, :Flag2)*/ );
show (theRows);
If( N Rows( theRows ) > 0,
Insert Into( rowsToSelect, Max( theRows ) ),
Insert Into( rowsToSelect, Max( dt << get rows where( :metric == group /*& :Value == Col Max (:Value, :Metric, :Flag1, :Flag2)*/) ) );
show (theRows);
);
);
);
dt << select rows( rowsToSelect );</GET>
Re: [JSL] 「複雑な」条件を使用して行を選択するジャーモ
どうもありがとう、
あなたが提案した解決策は私のメイン スクリプトで機能しています。
ただし、JMP の将来のバージョンでは、この Col 関数の配置が壊れる可能性があるとおっしゃっていました。
当社では、毎年 JMP のバージョンを最新リリースにアップグレードしています。
今のところはあなたのスクリプトを使用し、Jim (txnelson) の助けを借りて彼の提案を実現し、私のコードがより堅牢になるようにします。
再度、感謝します!!
説教者
Re: [JSL] 「複雑な」条件を使用して行を選択するJMP の動作が変更されるかどうかはわかりません。JMP では、これは意図しない動作とみなされており、情報なしでいつでも変更される可能性があります。まだ変更していない場合は、ウィッシュ リスト項目に賛同して、これを意図しない動作ではなく機能に変更してください ( 各値の設定で数式を使用し、Col 統計数式の最初の引数として式を使用する動作をサポートする)。
Re: [JSL] 「複雑な」条件を使用して行を選択する私は今、
ありがとう:)