[JSL] Selezionare le righe utilizzando condizioni "complesse"Ciao a tutti,
Vorrei scrivere uno script JSL per selezionare le righe in una tabella con condizioni "complesse":
Devo selezionare UNA RIGA per metrica (Colonna: metrica) con condizioni IN ORDINE DI PRIORITÀ:
1- se esiste la condizione Flag1 = “FLAG” AND Flag2 = “FLAG”, seleziona Col Max (:Metric1) di questa condizione
2- se esiste la condizione Flag1 = “FLAG” XOR Flag2 = “FLAG”, seleziona Col Max (:Metric1) di questa condizione
3- Altrimenti, seleziona riga Max (Metric1)
Di seguito è riportato un codice provvisorio che utilizza For Each Row() e una colonna di debug, ma il mio tentativo non funziona e non è molto elegante.
Inoltre, non sono sicuro di come eseguire un XOR (OR esclusivo) in JLS senza utilizzare una combinazione di porte di base.
Esiste un modo migliore per farlo?
Nota: in allegato troverete un PNG che illustra la mia richiesta
Grazie
- Predicatore
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);

Analisi e modellazione dei dati di baseRe: [JSL] Seleziona righe usando condizioni "complesse"Ecco come lo farei

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] Seleziona righe usando condizioni "complesse"Può essere fatto senza colonne extra, ma potrebbe essere più facile con loro
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 questa soluzione è che potrebbe rompersi in qualsiasi futura versione di JMP, poiché non dovresti usare altro che riferimenti di colonna con le funzioni statistiche Col. Ecco un elemento della lista dei desideri nella speranza che JMP non rompa una delle "caratteristiche" più utili che queste funzioni hanno attualmente
Rendi supportato il comportamento tramite l'uso di espressioni di formule in Imposta ogni valore e tramite l'uso di espressioni come primo argomento nelle formule statistiche Col (sto cercando di usare sempre meno queste funzioni, ma è difficile perché al momento sono molto potenti e creano script più facili e veloci da leggere rispetto ad altre opzioni).
Re: [JSL] Seleziona righe usando condizioni "complesse"Ciao Jim,
Grazie per la tua risposta,
Mi dispiace molto, mi rendo conto che la mia richiesta non è stata molto chiara.
Dopo aver dato la priorità al gruppo di righe all'interno di ogni metrica (che funziona bene con il tuo script),
Devo selezionare la riga con il valore più alto (Colonna: metric1), non in base a Max (theRows) come nello script corrente.
La tabella fittizia che ho fornito prima ha aumentato la confusione perché "Col Max (:metric1)" all'interno di ogni gruppo è sempre uguale a "Max (theRows)".
Lo script suggerito non funziona più con un nuovo set di valori. Di seguito ho sostituito :metric1 con :Value per rimuovere l'ambiguità del nome della colonna, inoltre ho riorganizzato i valori numerici.
Ho provato a giocare con "Col Max()" aggiunto come regola all'interno di "get rows where()", ma non ci sono riuscito.
(Mi rendo conto che il mio inglese non è perfetto, quindi ho aggiunto un'immagine per descrivere il mio obiettivo, nel caso in cui la mia formulazione non fosse sufficientemente precisa)
Hai un suggerimento?
grazie ancora
Predicatore
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] Seleziona righe usando condizioni "complesse"Jarmo,
Molte grazie,
La soluzione che proponi funziona nel mio script principale!
Sebbene tu abbia accennato al fatto che una futura versione di JMP potrebbe interrompere questa disposizione della funzione Col.
Nella mia azienda aggiorniamo sempre la versione JMP all'ultima release ogni anno.
Per ora userò il tuo script e cercherò di ottenere l'aiuto di Jim (txnelson) per far funzionare il suo suggerimento, così il mio codice sarà più robusto.
Grazie ancora!!
Predicatore
Re: [JSL] Seleziona righe usando condizioni "complesse"Non sappiamo se JMP cambierà comportamento. JMP lo considera un comportamento indesiderato, il che significa che è soggetto a modifiche in qualsiasi momento senza alcuna informazione. Fai i complimenti all'elemento della lista dei desideri, se non l'hai ancora fatto, per trasformarlo in una funzionalità anziché in un comportamento indesiderato ( Rendi l'utilizzo di espressioni di formule in Imposta ogni valore e l'utilizzo di espressioni come primo argomento in Col comportamento supportato dalle formule statistiche )
Re: [JSL] Seleziona righe usando condizioni "complesse"L'ho appena fatto,
Grazie:)