Formel zum Prüfen, ob in den Zeilen einer Spalte ein Element einer Liste enthalten istJMP für Mac
Version 17.2.0 (701896)
Ich habe eine Spalte „Daten“ mit Zeilen von Zahl_Zahl wie folgt:
1_3
3_7
6_5
...
Ich möchte diese Spalte testen, um zu sehen, ob einige der Zeilen Werte aus einer Werteliste enthalten und dann die Zeilen markieren oder beschriften, bei denen dies der Fall ist.
Ich weiß, dass ich eine komplizierte Formel wie diese konstruieren könnte:
If( :Die X_Y == "3_9" | :Die X_Y == "3_4",
1,
0
)
Das ist jedoch sehr mühsam, wenn man lange Listen mit unterschiedlichen zu prüfenden Werten hat. Ich möchte einfach eine Liste der zu prüfenden Werte in eine Formel einfügen können, getrennt durch ein Leerzeichen oder Komma.
Ich habe die Funktion „ Enthält Element “ gefunden. Sie funktioniert für ein Element einwandfrei, aber der Hilfeeintrag bietet keinen Einblick in die Erstellung der Option „Liste“. Ich habe Folgendes versucht (indem ich das optionale Trennzeichen als Leerzeichen angegeben habe):
If( Contains Item( :Die X_Y, "3_4 3_9", " " ),
"exclude",
"not exclude"
)
und das:
If( Contains Item( :Data, "3_4,3_9", "," ),
"exclude",
"not exclude"
)
Ich verstehe, dass das Standardtrennzeichen ein Komma ist, wollte es aber durchsetzen, um etwas zu finden, das funktioniert. Keine der „Contains Item“-Funktionen gibt das gewünschte Verhalten zurück (logisch 1, wenn eine Übereinstimmung vorliegt, 0, wenn nicht). Wenn es eine bessere Funktion gibt, geben Sie bitte Bescheid.
Dies ist ein allgemeines Problem, das ich gerne lösen würde: das Untersuchen einer Spalte, um Übereinstimmungen mit langen Elementlisten zu finden.
Danke
Automatisierung und SkriptingmacOSBetreff: Formel zum Prüfen, ob in den Zeilen einer Spalte Elemente einer Liste enthalten sindEin schöner Nebeneffekt:
Diese Diskussion brachte mich zum Nachdenken:
Erhöht Enthält auch die Geschwindigkeit von Col..- Aggregationen?
Und ob Sie es glauben oder nicht – das tut es. Wow, das tut es!!!!
https://community.jmp.com/t5/Discussions/How-do-I-use-the-Col-Maximum-Formula-with-a-quot-where-quot/mp/810363/highlight/true#M99287
Irgendeine Ahnung, warum der Zeichenvergleich SOOO langsam ist?
Betreff: Formel zum Prüfen, ob in den Zeilen einer Spalte ein Element einer Liste enthalten istdie Lesart ist: 3 Argumente
- x - eine Zeichenfolge
- 3 Möglichkeiten:
- zu suchendes Element
- eine Liste mit mehreren Einträgen - passt einer davon
- ein zu suchendes Muster - optionales Argument: das Trennzeichen um x in Wörter aufzuteilen
@datanaut schrieb:
Daher könnte (meiner vereinfachten Lesart nach) entweder x oder die {Liste} die zu suchenden Wörter oder die Liste der Wörter enthalten, mit denen verglichen werden soll.
-> ja.
eine Spalte wie in Jarmos Beispiel eingefügt
Bei einer Spaltenformel ist dies immer möglich, und zwar nach dem Grundsatz:
Für jede Zeile übernimmt JMP automatisch den Eintrag der Spalte in der jeweiligen Zeile.
Wenn Sie den Formel-Editor verwenden, wenden Sie diesen Trick ständig an – ohne es zu merken.
Betreff: Formel zum Prüfen, ob in den Zeilen einer Spalte ein Element einer Liste enthalten istDanke @jthi und @txnelson und @hogi und @mmarchandFSLR für die Antworten und Mühe bei meiner Frage.
Jarmo hat mein Problem gefunden – das Vertauschen der Liste und des Elements in meiner Formel. Danke für den Code, der die korrekte Verwendung veranschaulicht.
Betreff: „Dokumentation etwas mangelhaft“
Ich stimme zu. Die Anweisungen und Beispiele im Skriptindex erscheinen mir etwas mehrdeutig. Hier ist der Eintrag für den Skriptindex:
"
Enthält Artikel(x, <Artikel| {Liste} |Muster>, <Trennzeichen>)
...
Returns a Boolean that indicates whether the word (Artikel), one of a list of words (Liste), or pattern (Muster) matches one of the words in the text represented by x. Words are delimited by the characters in the optional quoted delimiter (Trennzeichen) string. A comma is the default delimiter. Blanks are trimmed from the ends of each extracted word from the input text string (x).
"
Also (meiner vereinfachten Lesart nach) könnte entweder x oder die {Liste} die zu suchenden Wörter oder die Liste der Wörter enthalten, mit denen verglichen werden soll. Ein paar weitere Beispiele, die einige Alternativen zeigen, die eine Spalte enthalten, wie in Jarmos Beispiel, könnten zur Verdeutlichung beitragen.
Ich habe die Lösung bereits verwendet! Nochmals vielen Dank.
Betreff: Formel zum Prüfen, ob in den Zeilen einer Spalte ein Element einer Liste enthalten istAh, großartig!
Ich habe mit Where() anfangs ziemlich schlechte Erfahrungen gemacht, kann mich aber nicht erinnern, warum.
Vielleicht habe ich eine falsche Syntax verwendet – oder das Problem wurde in der Zwischenzeit behoben ...
Betreff: Formel zum Prüfen, ob in den Zeilen einer Spalte ein Element einer Liste enthalten istIch denke, es ist erwähnenswert, dass die Where()-Funktion viel schneller ist (> eine Größenordnung!) als < <<> Namen standardmäßig hier (1); dt = Datentabelle („SATByYear“); Anzeigen (N Zeilen (dt)); //N Zeilen (dt) = 21245376; jetzt = HP-Zeit (); dt << Auswählen, wobei (: Staat == „Wisconsin“ |: Staat == „Alabama“); Warten (0); gesamt = HP-Zeit () – jetzt; Drucken („<
Betreff: Formel zum Prüfen, ob in den Zeilen einer Spalte ein Element einer Liste enthalten istEntschuldigung, ich habe in den vorherigen Läufen ein wait() verpasst - das kehrt Antwort 1 um ... und führt zu neuen Möglichkeiten für #3, #4 und #5
Die neuen Erkenntnisse:
- Enthält item() ist schneller mit @jthis Syntax - v2 ist langsamer
- Wählen Sie wo()wird viel schneller, wenn man es ersetzt durchZeilen abrufen, wobei () + Zeilen auswählen ().
- Select Where() wird deutlich (!!) schneller, wenn der String-Vergleich durch contains item() ersetzt wird.
- Die Kombination von (2) und (3) ist durchaus vergleichbar
- ... auch für größere Datenmengen.

Mehr anzeigen...
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>
Betreff: Formel zum Prüfen, ob in den Zeilen einer Spalte ein Element einer Liste enthalten isthat es zu Tipps und Tricks hinzugefügt – Best Practice mit JMP/JSL
#4 überrascht. Im Moment würde ich sagen:

Betreff: Formel zum Prüfen, ob in den Zeilen einer Spalte ein Element einer Liste enthalten istDanke für den Kommentar.
bei genauerem Hinsehen stellt sich heraus, dass es sich tatsächlich nicht um ein „contains item“ (enthält das Element) im Gegensatz zu „Select Where“ (Wo auswählen) handelt.
einige Erkenntnisse:
- Contains item() ist mit der inversen „v2“-Syntax schneller
- Wählen Sie wo()wird viel schneller, wenn man es ersetzt durchZeilen abrufen, wobei () + Zeilen auswählen ().
- Select Where() wird deutlich schneller, wenn der String-Vergleich durch contains item() ersetzt wird.
- und die Kombination von (2) und (3) macht es ... um den Faktor 2 langsamer als (2) (?!?!)
- also, der Gewinner (für diesen Datensatz) ist Nr. 2:
in Summe:

Details:
Mehr anzeigen...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>
Betreff: Formel zum Prüfen, ob in den Zeilen einer Spalte ein Element einer Liste enthalten istIch habe einige Zeittests durchgeführt und dabei die Lösung von Jarmo mit meiner Lösung verglichen. Dabei ist die „Contains Item“-Lösung deutlich schneller als die „Select Where“-Lösung.
Betreff: Formel zum Prüfen, ob in den Zeilen einer Spalte ein Element einer Liste enthalten istUsually 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
)
)

Zweites Beispiel aus dem Scripting Index


oder die JSL-Syntaxreferenz enthalten einigermaßen gute Beispiele https://www.jmp.com/support/help/en/18.0/#page/jmp/character-functions-2.shtml?os=win&source=application#ww6166335 , aber die Dokumentation lässt etwas zu wünschen übrig.
Betreff: Formel zum Prüfen, ob in den Zeilen einer Spalte ein Element einer Liste enthalten istHier ist der Ansatz, den ich wählen würde
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>