Wie erstelle ich eine neue Spalte und füge einen Text x-Zeilen vor einem „Ereignis“ und Y-Zeilen nach dem „Ereignis“ ein?Hallo JMP-Community, ich arbeite mit einer Tabelle mit Tausenden von Zeilen. In einer Spalte sind bestimmte Zeilen mit „Ereignis“ gekennzeichnet (z. B. ein nicht den Spezifikationen entsprechendes Los an einem bestimmten Tag). Wie kann ich eine neue Spalte erstellen, in der die x-Zeilen vor einem „Ereignis“ mit der Markierung PRE und die y-Zeilen nach dem Ereignis mit der Markierung POST gekennzeichnet sind? Im Beispiel unten ist x=3 und y=5.
Ich danke Ihnen für Ihre Hilfe!

Betreff: Wie erstelle ich eine neue Spalte und füge einen Text X-Zeilen vor einem „Ereignis“ und Y-Zeilen nach dem „Ereignis“ ein?Ausgezeichnet, vielen Dank, Jim!Betreff: Wie erstelle ich eine neue Spalte und füge einen Text X-Zeilen vor einem „Ereignis“ und Y-Zeilen nach dem „Ereignis“ ein?Eine kleine Anpassung für Ihre zusätzliche Logik und die folgende JSL geben Ihnen meiner Meinung nach, was Sie wollen
If(
:Name( "Column 1 -Existing" )[Row()] == "Event", "Event",
(:Name( "Column 1 -Existing" )[Row() - 1] == "Event" |
:Name( "Column 1 -Existing" )[Row() - 2] == "Event" |
:Name( "Column 1 -Existing" )[Row() - 3] == "Event" |
:Name( "Column 1 -Existing" )[Row() - 4] == "Event" |
:Name( "Column 1 -Existing" )[Row() - 5] == "Event") &
:Name( "Column 1 -Existing" )[Row()] == "", "POST",
(:Name( "Column 1 -Existing" )[Row() + 1] == "Event" |
:Name( "Column 1 -Existing" )[Row() + 2] == "Event" |
:Name( "Column 1 -Existing" )[Row() + 3] == "Event") &
:Name( "Column 1 -Existing" )[Row()] == "", "PRE"
)
Betreff: Wie erstelle ich eine neue Spalte und füge einen Text X-Zeilen vor einem „Ereignis“ und Y-Zeilen nach dem „Ereignis“ ein?Lieber Jim ( @txnelson ),
Vielen Dank, dass Sie diese Lösung anbieten, die genau das tut, was ich gefragt habe.
Als ich damit herumspielte, stellte ich fest, dass ich in meiner ursprünglichen Frage eine Herausforderung übersehen hatte: Wenn „Ereignisse“ zu nahe hintereinander liegen, können die folgenden Regeln frühere Ergebnisse überschreiben.
Gibt es eine Möglichkeit, Ihre Lösung weiter zu verfeinern, indem Sie die folgenden Priorisierungsregeln einbetten:
- 1. Priorität: Eine „Ereignis“-Zeile, wird immer als „Ereignis“-Zeile in die neue Spalte kopiert und kann nicht durch „POST“ oder „PRE“ überschrieben werden;
- 2. Priorität: Ein „POST“-Ergebnis kann niemals durch ein „PRE“-Ergebnis überschrieben werden.
Betreff: Wie erstelle ich eine neue Spalte und füge einen Text X-Zeilen vor einem „Ereignis“ und Y-Zeilen nach dem „Ereignis“ ein?@pmroz , ich habe versucht, Ihre vorgeschlagene Lösung auszuführen, aber es werden mehrere neue Tabellen erstellt? (anstelle einer neuen Spalte in der vorhandenen Tabelle)Betreff: Wie erstelle ich eine neue Spalte und füge einen Text X-Zeilen vor einem „Ereignis“ und Y-Zeilen nach dem „Ereignis“ ein?Hier ist eine Formel, die eine echte Brut-Force-Methode ist.Es sieht komplexer aus, als es wirklich ist, da Sie durch die Wahl eines Minuszeichens „-“ als Teil des Spaltennamens den Code dazu zwingen, die Funktion :Name() um den Spaltennamen herum zu verwenden.
If(
:Name( "Column 1 -Existing" )[Row() + 1] == "Event" |
:Name( "Column 1 -Existing" )[Row() + 2] == "Event" |
:Name( "Column 1 -Existing" )[Row() + 3] == "Event", "PRE",
:Name( "Column 1 -Existing" )[Row() - 1] == "Event" |
:Name( "Column 1 -Existing" )[Row() - 2] == "Event" |
:Name( "Column 1 -Existing" )[Row() - 3] == "Event" |
:Name( "Column 1 -Existing" )[Row() - 4] == "Event" |
:Name( "Column 1 -Existing" )[Row() - 5] == "Event", "POST",
:Name( "Column 1 -Existing" )[Row()] == "Event", "Event"
)
Im Anhang finden Sie Ihre Beispieldatentabelle mit der hinzugefügten neuen Spalte
Betreff: Wie erstelle ich eine neue Spalte und füge einen Text X-Zeilen vor einem „Ereignis“ und Y-Zeilen nach dem „Ereignis“ ein?Das sollte reichen:
/* Each 'PRE' should start (in this example) 3 rows before the 'Event'-row and
stop 1 row before the 'Event'
Each 'POST' should start 1 row after the event and stop 5 rows after the 'Event'
Thank you! */
dt = New Table( "pre-post example", Add Rows( 23 ),
New Column( "Column 1", Character, "Nominal",
Set Values(
{"", "", "", "", "Event", "", "", "", "", "", "", "", "", "", "", "", "",
"Event", "", "", "", "", ""}
)
),
New Column( "Column 2", Character, "Nominal",
Set Values(
{"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
"", "", "", "", ""}
)
)
);
event_rows = dt << get rows where(dt:Column 1 == "Event");
nr = nrows(event_rows);
if (nr > 0,
for (i = 1, i <= nr, i++,
start_row = maximum(event_rows[i] - 3, 1); // Keep from trying to set a negative row
for (k = start_row, k < event_rows[i] , k++,
dt:column 2[k] = "PRE";
);
end_row = minimum(event_rows[i] + 5, nrows(dt)); // Prevent setting higher rows than are in the table
for (k = event_rows[i] + 1, k <= end_row, k++,
dt:column 2[k] = "POST";
);
dt:column 2[event_rows[i]] = "Event";
);
);Betreff: Wie erstelle ich eine neue Spalte und füge einen Text X-Zeilen vor einem „Ereignis“ und Y-Zeilen nach dem „Ereignis“ ein?@pmroz Im Anhang finden Sie ein kurzes Beispiel.
Jedes „PRE“ sollte (in diesem Beispiel) 3 Zeilen vor der „Event“-Zeile beginnen und 1 Zeile vor dem „Event“ enden.
Jeder „POST“ sollte eine Zeile nach dem Ereignis beginnen und fünf Zeilen nach dem „Ereignis“ enden.
Danke schön!
Betreff: Wie erstelle ich eine neue Spalte und füge einen Text X-Zeilen vor einem „Ereignis“ und Y-Zeilen nach dem „Ereignis“ ein?Aus Ihrem Beispiel geht nicht klar hervor, wann der nächste „PRE“ beginnen soll.Können Sie einen kleinen Beispieldatensatz bereitstellen?