Formula per verificare se uno qualsiasi degli elementi di un elenco è contenuto nelle righe di una colonnaJMP per Mac
Versione 17.2.0 (701896)
Ho una colonna "Dati" con righe di numero_numero come questa:
1_3
3_7
6_5
...
Voglio testare questa colonna per vedere se alcune righe contengono valori da un elenco di valori e quindi contrassegnare o etichettare le righe che li contengono.
So che potrei costruire una formula elaborata come questa:
If( :Die X_Y == "3_9" | :Die X_Y == "3_4",
1,
0
)
Ma è molto laborioso per lunghe liste di valori diversi da controllare. Vorrei solo poter incollare una lista di valori da controllare in una formula, delimitata da uno spazio o una virgola.
Ho trovato la funzione " Contains Item ". Funziona bene per un elemento, ma la voce di aiuto non offre alcuna indicazione su come costruire l'opzione "list". Ho provato questo (specificando il delimitatore facoltativo come uno spazio):
If( Contains Item( :Die X_Y, "3_4 3_9", " " ),
"exclude",
"not exclude"
)
e questo:
If( Contains Item( :Data, "3_4,3_9", "," ),
"exclude",
"not exclude"
)
Capisco che il delimitatore predefinito è una virgola, ma volevo forzarlo per trovare qualcosa che funzionasse. Nessuna delle due funzioni Contains Item restituisce il comportamento ricercato (logico 1 se c'è una corrispondenza, 0 in caso contrario). Se c'è una funzione migliore da usare, per favore, consigliatemi.
Questo è un problema generalizzato che vorrei riuscire a risolvere: ispezionare una colonna per trovare corrispondenze con lunghi elenchi di elementi.
Grazie
Automazione e scriptingsistema operativo macOSRe: Formula per verificare se un elemento di un elenco è contenuto nelle righe di una colonnaUn piacevole effetto collaterale:
Questa discussione mi ha fatto pensare:
Contiene aumenta anche la velocità delle aggregazioni Col.. ?
E che ci crediate o no, lo fa. Wow, lo fa!!!!
https://community.jmp.com/t5/Discussions/How-do-I-use-the-Col-Maximum-Formula-with-a-quot-where-quot/mp/810363/highlight/true#M99287
Qualche idea sul perché il confronto tra i personaggi sia COSÌ lento?
Re: Formula per verificare se un elemento di un elenco è contenuto nelle righe di una colonnala lettura è: 3 argomenti
- x - una stringa di caratteri
- 3 opzioni:
- elemento da cercare
- un elenco di diversi elementi - uno di essi corrisponde
- uno schema da ricercare - argomento facoltativo: il delimitatore per dividere x in parole
@datanaut ha scritto:
Quindi (secondo la mia interpretazione semplicistica) sia x che {list} potrebbero contenere le parole da ricercare o l'elenco di parole con cui confrontarle.
-> sì.
inclusa una colonna come nell'esempio di Jarmo
Per una formula di colonna, questo è sempre possibile, seguendo l'idea:
Per ogni riga, JMP prenderà automaticamente la voce della colonna nella rispettiva riga.
Quando si utilizza l'editor di formule, si esegue questo trucco ogni volta, ma senza accorgersene.
Re: Formula per verificare se un elemento di un elenco è contenuto nelle righe di una colonnaGrazie @jthi , @txnelson , @hogi e @mmarchandFSLR per le risposte e l'impegno profuso nel rispondere alla mia domanda.
Jarmo ha trovato il mio problema: invertire la lista e l'elemento nella mia formula. Grazie per il pezzo di codice che illustra l'uso corretto.
re: "Documentazione un po' carente"
Sono d'accordo. Le istruzioni e l'esempio nell'indice di scripting mi sembrano un po' ambigui. Ecco la voce per l'indice di scripting:
"
Contiene l'oggetto(x, <articolo| {lista} |modello>, <delimitatore>)
...
Returns a Boolean that indicates whether the word (articolo), one of a list of words (lista), or pattern (modello) matches one of the words in the text represented by x. Words are delimited by the characters in the optional quoted delimiter (delimitatore) string. A comma is the default delimiter. Blanks are trimmed from the ends of each extracted word from the input text string (x).
"
Quindi (secondo la mia lettura semplicistica) sia x che {list} potrebbero contenere le parole da ricercare o l'elenco di parole con cui confrontarle. Qualche altro esempio che mostra alcune alternative che includevano una Colonna come nell'esempio di Jarmo potrebbe aiutare a chiarire.
Ho già messo in pratica la soluzione! Grazie ancora.
Re: Formula per verificare se un elemento di un elenco è contenuto nelle righe di una colonnaAh, fantastico!
All'inizio ho avuto un'esperienza piuttosto negativa con Where() , ma non ricordo il motivo.
Forse ho usato una sintassi sbagliata, oppure il problema è stato risolto nel frattempo...
Re: Formula per verificare se un elemento di un elenco è contenuto nelle righe di una colonnaPenso che valga la pena aggiungere che la funzione Where() è molto più veloce (> di un ordine di grandezza!) di < <<> I nomi predefiniti sono qui (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: Formula per verificare se un elemento di un elenco è contenuto nelle righe di una colonnaMi dispiace, ho saltato un wait() nelle esecuzioni precedenti, che inverte la risposta 1... e porta a nuove possibilità per #3, #4 e #5
le nuove scoperte:
- Contiene elemento() è più veloce con la sintassi di @jthi - v2 è più lento
- Seleziona dove()diventa molto più veloce sostituendolo conottieni le righe where() + seleziona le righe().
- Select Where() diventa significativamente (!!) più veloce sostituendo il confronto delle stringhe con contains item() .
- la combinazione di (2) e (3) è abbastanza comparabile
- ... anche per set di dati più grandi.

Vedi altro...
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: Formula per verificare se un elemento di un elenco è contenuto nelle righe di una colonnaaggiunto a Suggerimenti e trucchi - best practice con JMP/JSL
#4 è sorprendente. Al momento, direi:

Re: Formula per verificare se un elemento di un elenco è contenuto nelle righe di una colonnaGrazie per il commento.
scavando più a fondo, in realtà non è "contiene elemento" ma "Seleziona dove" .
alcuni risultati:
- Contiene item() è più veloce con la sintassi inversa "v2"
- Seleziona dove()diventa molto più veloce sostituendolo conottieni le righe where() + seleziona le righe().
- Select Where() diventa significativamente più veloce sostituendo il confronto delle stringhe con contains item() .
- e combinando (2) e (3) diventa ... un fattore 2 più lento di (2) (?!?!)
- quindi, il vincitore (per questo set di dati) è il n. 2:
in totale:

dettagli:
Vedi altro...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: Formula per verificare se un elemento di un elenco è contenuto nelle righe di una colonnaHo eseguito alcuni test di temporizzazione confrontando la soluzione di Jarmo con la mia soluzione e la soluzione Contiene elemento è spettacolarmente più veloce della soluzione Seleziona dove.
Re: Formula per verificare se un elemento di un elenco è contenuto nelle righe di una colonnaUsually 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
)
)

Secondo esempio da Scripting Index


o JSL Syntax Reference contiene esempi accettabili https://www.jmp.com/support/help/en/18.0/#page/jmp/character-functions-2.shtml?os=win&source=application#ww6166335 ma la documentazione è un po' carente.
Re: Formula per verificare se un elemento di un elenco è contenuto nelle righe di una colonnaEcco l'approccio che adotterei
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>