項目のリストのいずれかが列の行に含まれているかどうかを確認する数式Mac用JMP
バージョン 17.2.0 (701896)
次のような number_number の行を持つ列「データ」があります。
1_3
3_7
6_5
...
この列をテストして、一部の行に値のリストの値が含まれているかどうかを確認し、値が含まれている行にフラグまたはラベルを付けます。
次のような複雑な式を作成できることはわかっています。
If( :Die X_Y == "3_9" | :Die X_Y == "3_4",
1,
0
)
しかし、さまざまな値の長いリストをチェックするのは非常に面倒です。チェックする値のリストをスペースまたはカンマで区切って数式に貼り付けられるようにしたいと思います。
「 Contains Item 」という関数を見つけました。これは 1 つのアイテムに対しては正常に機能しますが、ヘルプ エントリには「リスト」オプションの構築方法に関する説明がありません。私はこれを試しました (オプションの区切り文字をスペースとして指定します)。
If( Contains Item( :Die X_Y, "3_4 3_9", " " ),
"exclude",
"not exclude"
)
そしてこれ:
If( Contains Item( :Data, "3_4,3_9", "," ),
"exclude",
"not exclude"
)
デフォルトの区切り文字はコンマであることは理解していますが、機能するものを見つけるために強制したいと考えていました。Contains Item 関数はどちらも、求められている動作 (一致する場合は論理 1、一致しない場合は 0) を返しません。より適切な関数がある場合は、アドバイスをお願いします。
これは私が解決したい一般的な問題です。つまり、列を検査して、長い項目リストとの一致を見つけるという問題です。
ありがとう
自動化とスクリプトmacOSRe: 列の行にアイテムのリストが含まれているかどうかを確認する数式嬉しい副作用:
この議論から私は次のことを考えました。
Contains はコル..集計の速度も向上させますか?
信じられないかもしれませんが、本当にそうなるのです。すごい、そうなるのです!!!!
https://community.jmp.com/t5/Discussions/How-do-I-use-the-Col-Maximum-Formula-with-a-quot-where-quot/mp/810363/highlight/true#M99287
文字の比較がなぜこんなに遅いのか、何かヒントはありますか?
Re: 項目のリストのいずれかが列の行に含まれているかどうかを確認する数式読み方は: 3つの引数
- x - 文字列
- 3つのオプション:
- 検索する項目
- 複数のアイテムのリスト - 裾の1つが一致していますか
- 検索するパターン - オプション引数: x を単語に分割するための区切り文字
@datanaut は次のように書きました:
したがって (私の単純な解釈では)、x または {list} のいずれかに、検索する単語または比較する単語のリストを含めることができます。
-> はい。
Jarmoの例のように列を含める
列の式の場合、次の考え方に従って、これは常に可能です。
JMP は、各行ごとに、それぞれの行の列のエントリを自動的に取得します。
数式エディタを使用するとき、このトリックを常に実行します - ただ気づかないだけです。
Re: 項目のリストのいずれかが列の行に含まれているかどうかを確認する数式私の質問に答えて努力してくださった@jthiと@txnelsonと@hogiと@mmarchandFSLRに感謝します。
Jarmo は私の問題 (数式内のリストと項目の入れ替え) を見つけました。正しい使用方法を示すコードに感謝します。
「ドキュメントが少し不足しています」
私も同感です。スクリプト インデックスの説明と例は、私には少し曖昧に思えます。以下はスクリプト インデックスのエントリです。
「
アイテムを含む(x、<アイテム| {リスト} |パターン>、<デリミタ>)
...
Returns a Boolean that indicates whether the word (アイテム), one of a list of words (リスト), or pattern (パターン) matches one of the words in the text represented by x. Words are delimited by the characters in the optional quoted delimiter (デリミタ) string. A comma is the default delimiter. Blanks are trimmed from the ends of each extracted word from the input text string (x).
"
したがって (私の単純な解釈では)、x または {list} のいずれかに、検索する単語または比較する単語のリストを含めることができます。Jarmo の例のように列を含むいくつかの代替例を示す例がさらにいくつかあると、わかりやすくなるかもしれません。
すでに解決策を実行しました。改めて感謝いたします。
Re: 項目のリストのいずれかが列の行に含まれているかどうかを確認する数式ああ、素晴らしい!
最初はWhere()でかなり悪い経験をしましたが、その理由は思い出せません。
おそらく間違った構文を使用したか、あるいはその間に問題が修正されたのでしょう...
Re: 項目のリストのいずれかが列の行に含まれているかどうかを確認する数式Where() 関数は < よりもはるかに高速 (> 桁違いに!) であることも付け加えておく価値があると思います。 <<>名前はデフォルトで Here( 1 ); dt = Data Table( "SATByYear" ); Show( N Rows( dt ) ); //N Rows(dt) = 21245376; now = HP Time(); dt << Select Where( :State == "Wisconsin" | :State == "Alabama" ); Wait( 0 ); total = HP Time() - now; Print( "<
Re: 項目のリストのいずれかが列の行に含まれているかどうかを確認する数式申し訳ありませんが、前回の実行で wait() を忘れていました。これにより、回答 1 が反転し、#3、#4、#5 の新しい可能性が生じます。
新たな発見:
- アイテム()を含む @jthiの構文では高速です - v2 は低速です
- 選択場所()それを置き換えることで、はるかに速くなりますwhere() で行を取得 + row() で行を選択します。
- 文字列比較をcontains item()に置き換えることで、 Select Where() が大幅に (!!) 高速化されます。
- (2)と(3)を組み合わせると、かなり似ている
- ...より大きなデータセットにも適用できます。

もっと見る...
names default to here(1);
dt = Open( "$SAMPLE_DATA/Wafer Stacked.jmp" );
New Column( "x_y",
Character,
Formula( Concat Items( {Char( :X_Die ), Char( :Y_Die )}, "_" ) )
);
wait(0);
t0=hptime();
New Column( "contains item",
Character,
Formula( If( Contains Item( "1_3 3_9", :x_y, " " ), "exclude", "not exclude" ) )
);
dt << run formulas();
t= (hptime()-t0)/1000000;
print("formula - contains item", t);
t0=hptime();
New Column( "contains item v2",
Character,
Formula( If( Contains Item( :x_y, {"3_1","4_4"}) , "exclude", "not exclude" ) )
);
dt << run formulas();
t= (hptime()-t0)/1000000;
print("1) formula - contains item v2", t);
t0=hptime();
New Column( "get rows where",
Character,
set each value("not excluded") );
myrows=[];
for each( {compare}, {"3_1","4_4"},
myrows = V concat to (myrows, dt << get rows where(:x_y == compare));
);
dt << select rows(myrows); // just for fun - it's fast
dt[myrows,"get rows where"] = Repeat({"excluded"},n items(myrows) );
t= (hptime()-t0)/1000000;
print("2) get rows where", t);
t0=hptime();
for each( {compare}, {"3_1","4_4"},
dt<<SELECT where=""> names default to here(1);
dt = Open( "$SAMPLE_DATA/Wafer Stacked.jmp" );
New Column( "x_y",
Character,
Formula( Concat Items( {Char( :X_Die ), Char( :Y_Die )}, "_" ) )
);
wait(0);
t0=hptime();
New Column( "contains item",
Character,
Formula( If( Contains Item( "1_3 3_9", :x_y, " " ), "exclude", "not exclude" ) )
);
dt << run formulas();
t= (hptime()-t0)/1000000;
print("formula - contains item", t);
t0=hptime();
New Column( "contains item v2",
Character,
Formula( If( Contains Item( :x_y, {"3_1","4_4"}) , "exclude", "not exclude" ) )
);
dt << run formulas();
t= (hptime()-t0)/1000000;
print("1) formula - contains item v2", t);
t0=hptime();
New Column( "get rows where",
Character,
set each value("not excluded") );
myrows=[];
for each( {compare}, {"3_1","4_4"},
myrows = V concat to (myrows, dt << get rows where(:x_y == compare));
);
dt << select rows(myrows); // just for fun - it's fast
dt[myrows,"get rows where"] = Repeat({"excluded"},n items(myrows) );
t= (hptime()-t0)/1000000;
print("2) get rows where", t);
t0=hptime();
for each( {compare}, {"3_1","4_4"},
dt<</SELECT> <SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="hogi_0-1731305493836.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="hogi_0-1731305493836.png" style="width: 400px;"><span class="lia-inline-image-display-wrapper" image-alt="hogi_0-1731305493836.png" style="width: 400px;"><img src="https://us.v-cdn.net/6038925/uploads/images/70019i116F7A07829AD82B/hogi_0-1731305493836.png" role="button" title="hogi_0-1731305493836.png" alt="hogi_0-1731305493836.png" /></span></SPAN></SPAN>
Re: 項目のリストのいずれかが列の行に含まれているかどうかを確認する数式ヒントとコツ - JMP/JSL のベストプラクティスに追加しました
4 番目は驚きです。現時点では、次のように言えます。

Re: 項目のリストのいずれかが列の行に含まれているかどうかを確認する数式コメントありがとうございます。
さらに深く掘り下げると、実際には、 contains 項目ではなくSelect Whereです。
いくつかの調査結果:
- Contains item() は逆の「v2」構文でより高速になります
- 選択場所()それを置き換えることで、はるかに速くなりますwhere() で行を取得 + row() で行を選択します。
- 文字列の比較をcontains item()に置き換えることで、 Select Where() が大幅に高速化されます。
- そして、(2)と(3)を組み合わせると、(2)よりも2倍遅くなります(?!?!)
- したがって、このデータセットの勝者は #2 です。
合計:

詳細:
もっと見る...names default to here(1);
dt = Open( "$SAMPLE_DATA/Wafer Stacked.jmp" );
New Column( "x_y",
Character,
Formula( Concat Items( {Char( :X_Die ), Char( :Y_Die )}, "_" ) )
);
t0=hptime();
New Column( "contains item",
Character,
Formula( If( Contains Item( "1_3 3_9", :x_y, " " ), "exclude", "not exclude" ) )
);
dt << run formulas();
t= (hptime()-t0)/1000000;
print("formula - contains item", t);
t0=hptime();
New Column( "contains item v2",
Character,
Formula( If( Contains Item( :x_y, {"3_1","4_4"}) , "exclude", "not exclude" ) )
);
dt << run formulas();
t= (hptime()-t0)/1000000;
print("1) formula - contains item v2", t);
t0=hptime();
New Column( "get rows where",
Character,
set each value("not excluded") );
myrows=[];
for each( {compare}, {"3_1","4_4"},
myrows = V concat to (myrows, dt << get rows where(:x_y == compare));
);
dt << select rows(myrows); // just for fun - it's fast
dt[myrows,"get rows where"] = Repeat({"excluded"},n items(myrows) );
t= (hptime()-t0)/1000000;
print("2) get rows where", t);
t0=hptime();
for each( {compare}, {"3_1","4_4"},
dt<<SELECT where="">names default to here(1);
dt = Open( "$SAMPLE_DATA/Wafer Stacked.jmp" );
New Column( "x_y",
Character,
Formula( Concat Items( {Char( :X_Die ), Char( :Y_Die )}, "_" ) )
);
t0=hptime();
New Column( "contains item",
Character,
Formula( If( Contains Item( "1_3 3_9", :x_y, " " ), "exclude", "not exclude" ) )
);
dt << run formulas();
t= (hptime()-t0)/1000000;
print("formula - contains item", t);
t0=hptime();
New Column( "contains item v2",
Character,
Formula( If( Contains Item( :x_y, {"3_1","4_4"}) , "exclude", "not exclude" ) )
);
dt << run formulas();
t= (hptime()-t0)/1000000;
print("1) formula - contains item v2", t);
t0=hptime();
New Column( "get rows where",
Character,
set each value("not excluded") );
myrows=[];
for each( {compare}, {"3_1","4_4"},
myrows = V concat to (myrows, dt << get rows where(:x_y == compare));
);
dt << select rows(myrows); // just for fun - it's fast
dt[myrows,"get rows where"] = Repeat({"excluded"},n items(myrows) );
t= (hptime()-t0)/1000000;
print("2) get rows where", t);
t0=hptime();
for each( {compare}, {"3_1","4_4"},
dt<</SELECT>
Re: 項目のリストのいずれかが列の行に含まれているかどうかを確認する数式Jarmo のソリューションと私のソリューションを比較するタイミング テストをいくつか実行しましたが、Contains Item ソリューションは Select Where ソリューションよりも大幅に高速でした。
Re: 項目のリストのいずれかが列の行に含まれているかどうかを確認する数式Usually in cases like this I tend to use Words() to split the string into a list and then compare using Contains() (or in some rare cases Contains Item()). But Contains Item() should also work and you just seem to have your parameters in incorrect order</CODE></P>
<PRE><CODE class=" language-jsl">New Table("Untitled",
Add Rows(3),
Compress File When Saved(1),
New Column("Column 1", Character, "Nominal", Set Values({"1_3", "3_7", "6_5"})),
New Column("Column 2",
Character,
"Nominal",
Formula(
If(Contains Item("1_3 3_9", :Column 1, " "),
"exclude",
"not exclude"
)
),
Set Selected
)
)

スクリプトインデックスからの2番目の例


または、JSL 構文リファレンスには okeish の例があります(https://www.jmp.com/support/help/en/18.0/#page/jmp/character-functions-2.shtml?os=win&source=application#ww6166335)が、ドキュメントが少し不足しています。
Re: 項目のリストのいずれかが列の行に含まれているかどうかを確認する数式私が取るアプローチは次のとおりです
names default to here(1);
dt=current data table();
dt << clear select;
find = {"3_1","4_4"};
for each( {compare}, find,
dt<<SELECT where="">
Once the rows are selected, then excluding, deleting etc. can be done.</SELECT>