[JSL] Seleccionar filas utilizando condiciones "complejas"Hola a todos,
Me gustaría escribir un script JSL para seleccionar las filas de una tabla con condiciones “complejas”:
Necesito seleccionar UNA FILA por Métrica (Columna: Métrica) con condiciones EN ORDEN DE PRIORIDAD:
1- si existe la condición Flag1 = “FLAG” AND Flag2 = “FLAG”, seleccionar Col Max (:Metric1) de esta condición
2- si existe la condición Flag1 = “FLAG” XOR Flag2 = “FLAG”, seleccionar Col Max (:Metric1) de esta condición
3- De lo contrario, seleccione la fila Máx. (Métrica1)
A continuación se muestra un código tentativo que utiliza For Each Row () y una columna de depuración, pero mi intento no funciona y no es muy elegante.
Además, no estoy seguro de cómo hacer un XOR (OR exclusivo) en JLS sin utilizar una combinación de puertas básicas.
¿Existe una mejor manera de hacer esto?
Nota: adjunto un PNG que ilustra mi solicitud
Gracias
- Predicador
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);

Análisis y modelado de datos básicosRe: [JSL] Seleccionar filas utilizando condiciones "complejas"Así es como lo haría yo

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] Seleccionar filas utilizando condiciones "complejas"Se puede hacer sin columnas adicionales, pero podría ser más fácil con ellas.
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);
Un problema con esta solución es que podría dejar de funcionar en cualquier versión futura de JMP, ya que no se supone que se deba usar nada más que referencias de columnas con las funciones estadísticas Col. Aquí hay un elemento de la lista de deseos con la esperanza de que JMP no deje de funcionar una de las "características" más útiles que tienen esas funciones actualmente.
Haga que el uso de expresiones de fórmula en Establecer cada valor y el uso de expresiones como primer argumento en fórmulas estadísticas de Col sean comportamientos admitidos (estoy tratando de usar esas funciones cada vez menos, pero es difícil ya que actualmente son muy poderosas y crean scripts más fáciles de leer y más rápidos que otras opciones).
Re: [JSL] Seleccionar filas utilizando condiciones "complejas"Hola Jim,
Gracias por tu respuesta,
Lo siento mucho, me doy cuenta que mi solicitud no fue muy clara.
Después de priorizar el grupo de filas dentro de cada métrica (que funciona bien con su secuencia de comandos),
Necesito seleccionar la fila del valor más alto (Columna: metric1), no en función de Max (theRows) como en el script actual.
La tabla ficticia que proporcioné antes aumentó la confusión porque "Col Max (:metric1)" dentro de cada grupo siempre es igual a "Max (theRows)".
El script que sugeriste ya no funciona con un nuevo conjunto de valores. A continuación, reemplacé :metric1 por :Value para eliminar la ambigüedad del nombre de la columna y, además, reordené los valores numéricos.
Intenté jugar con "Col Max ()" agregado como regla dentro de "obtener filas donde()", pero no tuve éxito.
(Me doy cuenta de que mi inglés no es perfecto, por eso agregué una imagen para describir mi objetivo, en caso de que mi redacción no sea lo suficientemente precisa)
¿Tienes alguna sugerencia?
gracias de nuevo
Predicador
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] Seleccionar filas utilizando condiciones "complejas"jarmo,
Muchas gracias,
¡La solución que propones funciona en mi script principal!
Aunque mencionaste que una versión futura de JMP podría romper esta disposición de la función Col.
Siempre estamos actualizando la versión JMP a la última versión cada año en mi empresa.
Usaré tu script por ahora e intentaré obtener la ayuda de Jim (txnelson) para que su sugerencia funcione y así mi código sea más sólido.
¡¡Gracias de nuevo!!
Predicador
Re: [JSL] Seleccionar filas utilizando condiciones "complejas"No sabemos si JMP cambiará el comportamiento. JMP lo considera un comportamiento no deseado, lo que significa que está sujeto a cambios en cualquier momento sin ninguna información. Si aún no lo ha hecho, dé su apoyo al elemento de la lista de deseos para que cambie esto por una funcionalidad en lugar de un comportamiento no deseado ( Haga que el uso de expresiones de fórmula en Establecer cada valor y el uso de expresiones como primer argumento en las fórmulas estadísticas de columnas sean comportamientos admitidos ).
Re: [JSL] Seleccionar filas utilizando condiciones "complejas"Acabo de hacerlo,
Gracias:)