Hallo zusammen,
Ich versuche, eine Formel oder ein Skript zu erstellen, das für jede Zeile einen bestimmten Wert („Gut“, „Schlecht“ oder „N/A“) festlegt, basierend darauf, ob in der Tabelle eine andere Zeile mit Werten vorhanden ist, die einer Logik entsprechen, die die aktuelle Zeile als Eingabe verwendet.
Ich habe ein Skript, das genau dies tut, indem es verschachtelte For-Schleifen verwendet, wenn eine kleine Teilmenge der vollständigen Datentabelle verwendet wird. Bei der vollständigen Datentabelle, die ich verwenden möchte und die ungefähr 1 Million Zeilen umfasst, stürzt das Skript jedoch einfach JMP ab.
Gibt es eine effizientere Möglichkeit, dies mit JMP durchzuführen? (Oder wenn es mit SQL geht, kann ich das tun, bevor ich es in JMP einfüge).
Im Anhang finden Sie das Skript, das das macht, wovon ich spreche.
Normalerweise besteht keine Notwendigkeit, for-Schleifen zu verschachteln, wenn Sie mit Datentabellen arbeiten.
Könnten Sie eine kleine Teilmenge Ihrer Daten bereitstellen und eine Spalte mit den gewünschten Ergebnissen einfügen?
Okay, ich werde die Daten aus Datenschutzgründen nachahmen.
| Cola | colB | colC | kaltes Datum | colE | Logik |
| A0001 | 16 | 100 | 01.04.2022 09:15:01 Uhr | Aktion1 | N / A |
| A0001 | 100 | 182 | 01.04.2022 09:15:31 Uhr | Aktion2 | Gut |
| A0001 | 100 | 100 | 01.04.2022 09:15:36 Uhr | Aktion1 | N / A |
| A0002 | 212 | 200 | 02.04.2022 03:15:21 Uhr | Aktion1 | N / A |
| A0002 | 211 | 282 | 02.04.2022 03:15:11 Uhr | Aktion2 | Schlecht |
| A0002 | 212 | 200 | 02.04.2022 03:15:16 Uhr | Aktion1 | N / A |
| A0003 | 441 | 382 | 01.05.2022 01:15:31 Uhr | Aktion2 | Schlecht |
| A0004 | 441 | 382 | 01.05.2022 05:16:31 Uhr | Aktion2 | Schlecht |
| A0004 | 441 | 300 | 01.05.2022 05:15:31 Uhr | Aktion1 | N / A |
Wenn die Logik des ursprünglichen Skripts nicht klar war:
Wenn colE der aktuellen Zeile "Aktion 1" ist: dann weise "N/A" zu;
Andernfalls, wenn colE der aktuellen Zeile "Aktion 2" ist, dann folgen Sie der Logik im nächsten Absatz.
Wenn es eine andere Zeile in der Tabelle mit den gleichen Werten der aktuellen Zeile für die Spalten colA und colB gibt; der colC-Wert der aktuellen Zeile ist genau 82 höher als in dieser anderen Zeile; colDate-Werte liegen innerhalb von 18 Sekunden voneinander; die Spalte der aktuellen Zeile ist "Aktion 2" und die Spalte dieser anderen Zeile ist "Aktion 1": dann weise "Gut" zu; sonst weisen Sie dann "Schlecht" zu.
Schätzen Sie jede Hilfe! Ich sehe im Moment einfach keinen Weg ohne verschachtelte Schleifen.
Aber mir ist jetzt zumindest klar, dass ich ein Break() nach Zeile 25 meines ursprünglichen Skripts einfügen sollte. Kein Grund, weiter nach einer anderen Zeile zu suchen, die meinen Kriterien entspricht, wenn ich bereits mindestens eine gefunden habe.
Die Logik in diesem Skript ist zu kompliziert, da ich nicht alle Einschränkungen der Daten kenne (kann es beispielsweise mehrere Übereinstimmungen geben) und ich habe es nicht optimiert
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(9),
Compress File When Saved(1),
New Column("colA", Character, "Nominal", Set Values({"A0001", "A0001", "A0001", "A0002", "A0002", "A0002", "A0003", "A0004", "A0004"})),
New Column("colB", Numeric, "Continuous", Format("Best", 9), Set Values([16, 100, 100, 212, 211, 212, 441, 441, 441])),
New Column("colC", Numeric, "Continuous", Format("Best", 9), Set Values([100, 182, 100, 200, 282, 200, 382, 382, 300])),
New Column("colDate",
Character(22),
"Nominal",
Set Values(
{" 2022/04/01 9:15:01 AM", " 2022/04/01 9:15:31 AM", " 2022/04/01 9:15:36 AM", " 2022/04/02 3:15:21 AM", " 2022/04/02 3:15:11 AM",
" 2022/04/02 3:15:16 AM", " 2022/05/01 1:15:31 AM", " 2022/05/01 5:16:31 AM", " 2022/05/01 5:15:31 AM"}
)
),
New Column("colE",
Character(16),
"Nominal",
Set Values({"Action1", "Action2", "Action1", "Action1", "Action2", "Action1", "Action2", "Action2", "Action1"})
),
New Column(" Logic", Character(16), "Nominal", Set Values({" N/A", " Good", " N/A", " N/A", " Bad", " N/A", " Bad", " Bad", " N/A"}))
);
dt << New Column("Group", Character, Nominal, << Set Each Value(char(:colA)||char(:colB)));
//fix date
Column(dt, "colDate") << Set Each Value(Substitute(:colDate, " AM", "")) << Data Type(Numeric);
dt << New Column("Logic", Character, Nominal, << Set Each Value(
As Constant(
m_group = :Group << get values;
m_c = :colC << get values;
m_date = :colDate << get values;
);
If(:colE == "Action1",
"N/A";
, :colE == "Action2",
cur_group_idx = Loc(m_group, :Group);
If(N Items(cur_group_idx) == 0,
"Bad"
,
plus_idx = cur_group_idx[Loc(:colC - 82 == m_c[cur_group_idx])];
If(N Items(plus_idx) == 0,
"Bad"
,
timediff_idx = Loc(Abs(m_date[plus_idx] - :colDate) <= 18);
If(N Items(timediff_idx) > 0,
If(:colE == "Action2" & :colE[timediff_idx[1]] == "Action1",
"Good"
,
"Bad"
)
,
"Bad"
);
)
);
,
"Bad";
);
));
dt << Delete Column("Group");
