[JSL] Zeilen mit „Komplexen“ Bedingungen auswählenHallo zusammen,
Ich möchte ein JSL-Skript schreiben, um die Zeilen in einer Tabelle mit „komplexen“ Bedingungen auszuwählen:
Ich muss EINE ZEILE pro Metrik (Spalte: Metrik) mit Bedingungen IN DER REIHENFOLGE DER PRIORITÄT auswählen:
1- Wenn die Bedingung Flag1 = „FLAG“ UND Flag2 = „FLAG“ vorliegt, wählen Sie Col Max (:Metric1) dieser Bedingung aus.
2- wenn die Bedingung Flag1 = „FLAG“ XOR Flag2 = „FLAG“ vorliegt, wählen Sie Col Max (:Metric1) dieser Bedingung
3- Sonst Zeile Max (Metric1) auswählen
Unten ein vorläufiger Code mit For Each Row () und einer Debug-Spalte, aber mein Versuch funktioniert nicht und ist nicht sehr elegant.
Außerdem bin ich nicht sicher, wie man in JLS ein XOR (exklusives ODER) durchführt, ohne eine Kombination aus Basisgattern zu verwenden.
Gibt es eine bessere Möglichkeit, dies zu tun?
Hinweis: Im Anhang finden Sie ein PNG, das meine Anfrage veranschaulicht
Danke
- Prediger
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);

Grundlegende Datenanalyse und ModellierungBetreff: [JSL] Zeilen mit „komplexen“ Bedingungen auswählenSo würde ich es machen

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>Betreff: [JSL] Zeilen mit „komplexen“ Bedingungen auswählenKann ohne zusätzliche Spalten durchgeführt werden, ist aber möglicherweise einfacher mit ihnen
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);
Ein Problem mit dieser Lösung ist, dass sie in jeder kommenden JMP-Version kaputt gehen könnte, da Sie mit statistischen Funktionen für Spalten nichts anderes als Spaltenreferenzen verwenden sollen. Hier ist ein Wunschzettel in der Hoffnung, dass JMP nicht eines der nützlichsten „Features“ kaputt macht, die diese Funktionen derzeit haben.
Unterstütztes Verhalten durch die Verwendung von Formelausdrücken in „Set Each Value“ und durch die Verwendung von Ausdrücken als erstes Argument in statistischen Col-Formeln (ich versuche, diese Funktionen immer weniger zu verwenden, aber es ist schwierig, da sie derzeit so leistungsstark sind und sie einfachere und schnellere Skripte erstellen, die einfacher zu lesen sind als andere Optionen).
Betreff: [JSL] Zeilen mit „komplexen“ Bedingungen auswählenHallo Jim,
Vielen Dank für Ihre Antwort,
Es tut mir sehr leid, mir ist klar, dass meine Anfrage nicht ganz klar war.
Nachdem Sie die Zeilengruppe innerhalb jeder Metrik priorisiert haben (was mit Ihrem Skript gut funktioniert),
Ich muss die Zeile mit dem höchsten Wert auswählen (Spalte: metric1), nicht basierend auf Max (theRows) wie im aktuellen Skript.
Die Dummy-Tabelle, die ich zuvor bereitgestellt habe, hat zur Verwirrung beigetragen, da „Col Max (:metric1)“ innerhalb jeder Gruppe immer gleich „Max (theRows)“ ist.
Ihr vorgeschlagenes Skript funktioniert mit einem neuen Wertesatz nicht mehr. Unten habe ich :metric1 durch :Value ersetzt, um die Mehrdeutigkeit des Spaltennamens zu beseitigen, und außerdem habe ich die numerischen Werte neu gemischt.
Ich habe versucht, mit „Col Max ()“ herumzuspielen, das als Regel innerhalb von „get rows where()“ hinzugefügt wurde, aber es hat nicht geklappt.
(Mir ist klar, dass mein Englisch nicht perfekt ist, daher habe ich ein Bild hinzugefügt, um mein Ziel zu beschreiben, falls meine Formulierung nicht präzise genug ist.)
Haben Sie einen Vorschlag?
Danke noch einmal
Prediger
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>
Betreff: [JSL] Zeilen mit „komplexen“ Bedingungen auswählenJarmo,
Vielen Dank,
Die von Ihnen vorgeschlagene Lösung funktioniert in meinem Hauptskript!
Sie haben jedoch erwähnt, dass eine zukünftige Version von JMP diese Anordnung der Col-Funktionen möglicherweise nicht mehr unterstützt.
Wir aktualisieren die JMP-Version in meinem Unternehmen jedes Jahr auf die neueste Version.
Ich werde vorerst Ihr Skript verwenden und versuchen, Jims Hilfe (txnelson) in Anspruch zu nehmen, damit sein Vorschlag funktioniert und mein Code robuster wird.
Danke noch einmal!!
Prediger
Betreff: [JSL] Zeilen mit „komplexen“ Bedingungen auswählenWir wissen nicht, ob JMP sein Verhalten ändern wird. JMP betrachtet es als unbeabsichtigtes Verhalten, was bedeutet, dass es jederzeit ohne Informationen geändert werden kann. Geben Sie dem Wunschlistenelement ein Lob, falls Sie dies noch nicht getan haben, um dies in eine Funktionalität statt in unbeabsichtigtes Verhalten zu ändern ( Machen Sie die Verwendung von Formelausdrücken in „Set Each Value“ und die Verwendung von Ausdrücken als erstes Argument in statistischen Formeln für Spalten zu einem unterstützten Verhalten ).
Betreff: [JSL] Zeilen mit „komplexen“ Bedingungen auswählenIch habe es gerade getan,
Danke:)