Fórmula para comprobar si alguno de los elementos de una lista está contenido en las filas de una columnaJMP para Mac
Versión 17.2.0 (701896)
Tengo una columna "Datos" con filas de número_número como esta:
1_3
3_7
6_5
...
Quiero probar esta columna para ver si algunas de las filas contienen valores de una lista de valores y luego marcar o etiquetar las filas que los contienen.
Sé que podría construir una fórmula elaborada como ésta:
If( :Die X_Y == "3_9" | :Die X_Y == "3_4",
1,
0
)
Pero eso es muy laborioso para listas largas de distintos valores a comprobar. Me gustaría poder pegar una lista de valores a comprobar en una fórmula, delimitada por un espacio o una coma.
Encontré la función " Contiene elemento ". Funciona bien para un elemento, pero la entrada de ayuda no ofrece ninguna información sobre cómo construir la opción "lista". Probé esto (especificando el delimitador opcional como un espacio):
If( Contains Item( :Die X_Y, "3_4 3_9", " " ),
"exclude",
"not exclude"
)
Y esto:
If( Contains Item( :Data, "3_4,3_9", "," ),
"exclude",
"not exclude"
)
Entiendo que el delimitador predeterminado es una coma, pero quería hacer que se encuentre algo que funcione. Ninguna de las funciones Contains Item devuelve el comportamiento buscado (1 lógico si hay una coincidencia, 0 si no). Si hay una función mejor para usar, avíseme.
Este es un problema generalizado que me gustaría poder resolver: inspeccionar una columna para encontrar coincidencias con largas listas de elementos.
Gracias
Automatización y scriptingmacOSRe: Fórmula para comprobar si alguno de los elementos de una lista está contenido en las filas de una columnaUn efecto secundario agradable:
Esta discusión me hizo pensar:
¿ Contiene también aumenta la velocidad de las agregaciones de Col.. ?
Y créalo o no, ¡sí lo hace! ¡Vaya, sí lo hace!
https://community.jmp.com/t5/Discussions/How-do-I-use-the-Col-Maximum-Formula-with-a-quot-where-quot/mp/810363/highlight/true#M99287
¿Alguna pista de por qué la comparación de personajes es TAN lenta?
Re: Fórmula para comprobar si alguno de los elementos de una lista está contenido en las filas de una columnaLa lectura es: 3 argumentos
- x - una cadena de caracteres
- 3 opciones:
- artículo a buscar
- una lista de varios elementos - ¿alguno de ellos coincide?
- un patrón para buscar - argumento opcional: el delimitador para dividir x en palabras
@datanaut escribió:
Entonces (según mi lectura simplista) tanto x como la {lista} podrían contener las palabras que se buscarán o la lista de palabras con las que compararlas.
-> sí.
Incluyó una columna como en el ejemplo de Jarmo
Para una fórmula de columna, esto siempre es posible, según la idea:
Para cada fila, JMP tomará automáticamente la entrada de la columna en la fila respectiva.
Cuando usas el editor de fórmulas, haces este truco todo el tiempo, pero sin darte cuenta.
Re: Fórmula para comprobar si alguno de los elementos de una lista está contenido en las filas de una columnaGracias @jthi , @txnelson , @hogi y @mmarchandFSLR por las respuestas y el esfuerzo a mi pregunta.
Jarmo encontró mi problema: cambiar la lista y el elemento en mi fórmula. Gracias por el fragmento de código que ilustra el uso correcto.
Re: "La documentación es un poco deficiente"
Estoy de acuerdo. Las instrucciones y el ejemplo del índice de secuencias de comandos me parecen un poco ambiguos. Aquí está la entrada del índice de secuencias de comandos:
"
Contiene el artículo(x, <artículo| {lista} |patrón>, <delimitador>)
...
Returns a Boolean that indicates whether the word (artículo), one of a list of words (lista), or pattern (patrón) matches one of the words in the text represented by x. Words are delimited by the characters in the optional quoted delimiter (delimitador) string. A comma is the default delimiter. Blanks are trimmed from the ends of each extracted word from the input text string (x).
"
Por lo tanto (según mi interpretación simplista), tanto x como {list} podrían contener las palabras que se buscarán o la lista de palabras con las que se comparará. Unos cuantos ejemplos más que muestren algunas alternativas que incluyan una columna como en el ejemplo de Jarmo podrían ayudar a aclararlo.
¡Ya he puesto en práctica la solución! Gracias de nuevo.
Re: Fórmula para comprobar si alguno de los elementos de una lista está contenido en las filas de una columna¡Ah, genial!
Al principio tuve una experiencia bastante mala con Where() , pero no recuerdo por qué.
Quizás utilicé una sintaxis incorrecta o el problema se solucionó mientras tanto...
Re: Fórmula para comprobar si alguno de los elementos de una lista está contenido en las filas de una columnaCreo que vale la pena agregar que la función Where() es mucho más rápida (¡> un orden de magnitud!) que < <<> Nombres Predeterminado a Aquí( 1 ); dt = Tabla de datos( "SATByYear" ); Mostrar( N filas( dt ) ); // N filas(dt) = 21245376; ahora = Hora HP(); dt << Seleccionar Dónde( : Estado == "Wisconsin" | : Estado == "Alabama" ); Esperar( 0 ); total = Hora HP() - ahora; Imprimir( "<
Re: Fórmula para comprobar si alguno de los elementos de una lista está contenido en las filas de una columnaLo siento, me perdí un wait() en las ejecuciones anteriores, lo que invierte la respuesta 1... y conduce a nuevas posibilidades para los números 3, 4 y 5.
Los nuevos hallazgos:
- Contiene elemento() es más rápido con la sintaxis de @jthi - v2 es más lento
- Seleccione dónde()se vuelve mucho más rápido al reemplazarlo conobtener filas donde() + seleccionar filas().
- Select Where() se vuelve significativamente (!!) más rápido al reemplazar la comparación de cadenas con el elemento contains() .
- La combinación de (2) y (3) es bastante comparable.
- ... también para conjuntos de datos más grandes.

Ver más...
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: Fórmula para comprobar si alguno de los elementos de una lista está contenido en las filas de una columnaLo agregué a Consejos y trucos: mejores prácticas con JMP/JSL
El número 4 es sorprendente. En este momento, diría:

Re: Fórmula para comprobar si alguno de los elementos de una lista está contenido en las filas de una columnaGracias por el comentario.
Profundizando más: en realidad, no contiene el elemento frente a Seleccionar dónde .
Algunos hallazgos:
- Contiene item() es más rápido con la sintaxis inversa "v2"
- Seleccione dónde()se vuelve mucho más rápido al reemplazarlo conobtener filas donde() + seleccionar filas().
- Select Where() se vuelve significativamente más rápido al reemplazar la comparación de cadenas con el elemento contains() .
- y al combinar (2) y (3) lo hace... factor 2 más lento que (2) (?!?!)
- Entonces, el ganador (para este conjunto de datos) es el número 2:
en total:

detalles:
Ver más...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: Fórmula para comprobar si alguno de los elementos de una lista está contenido en las filas de una columnaHice algunas pruebas de tiempo comparando la solución de Jarmo con mi solución, y la solución Contiene elemento es espectacularmente más rápida que la solución Seleccionar dónde.
Re: Fórmula para comprobar si alguno de los elementos de una lista está contenido en las filas de una columnaUsually 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
)
)

Segundo ejemplo del índice de secuencias de comandos


o JSL Syntax Reference tiene buenos ejemplos https://www.jmp.com/support/help/en/18.0/#page/jmp/character-functions-2.shtml?os=win&source=application#ww6166335 pero la documentación es un poco deficiente.
Re: Fórmula para comprobar si alguno de los elementos de una lista está contenido en las filas de una columnaEste es el enfoque que yo adoptaría
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>