Come creo una nuova colonna e inserisco un testo x-righe prima di un "evento" e y-righe dopo l'"evento"Salve JMP Community, sto lavorando con una tabella con migliaia di righe. In una colonna alcune righe sono contrassegnate come "evento" (ad esempio un lotto fuori specifica in un giorno particolare). Come posso creare una nuova colonna in cui le righe x prima di un "evento" sono contrassegnate PRE e le righe y dopo l'evento sono contrassegnate POST. Nell'esempio seguente x=3 e y=5.
Grazie per l'aiuto!

Ri: Come creo una nuova colonna e inserisco un testo x-righe prima di un "evento" e y-righe dopo l'"evento"Eccellente, molte grazie Jim!Ri: Come creo una nuova colonna e inserisco un testo x-righe prima di un "evento" e y-righe dopo l'"evento"Un piccolo aggiustamento per la tua logica aggiuntiva e il seguente JSL credo ti dia quello che vuoi
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"
)
Ri: Come creo una nuova colonna e inserisco un testo x-righe prima di un "evento" e y-righe dopo l'"evento"Caro Jim ( @txnelson ),
Grazie per aver offerto questa soluzione, che fa esattamente quello che stavo chiedendo.
Giocandoci, ho imparato che ho trascurato una sfida nella mia domanda originale: quando gli "Eventi" si avvicinano troppo uno dopo l'altro, le regole seguenti potrebbero sovrascrivere i risultati precedenti.
C'è un modo per perfezionare ulteriormente la tua soluzione incorporando le seguenti regole di prioritizzazione:
- 1a priorità: una riga 'Evento', copiala sempre nella nuova colonna come riga 'Evento' e non può essere sovrascritta da 'POST' o 'PRE';
- 2a priorità: un risultato 'POST' non può mai essere sovrascritto da un 'PRE'
Ri: Come creo una nuova colonna e inserisco un testo x-righe prima di un "evento" e y-righe dopo l'"evento"@pmroz , ho provato a eseguire la soluzione proposta, ma crea più nuove tabelle? (invece di una nuova colonna, nella tabella esistente)Ri: Come creo una nuova colonna e inserisco un testo x-righe prima di un "evento" e y-righe dopo l'"evento"Ecco una formula che è un vero e proprio metodo di forza bruta.Sembra più complesso di quanto non sia in realtà, a causa della tua scelta di avere un segno meno "-" come parte del nome della colonna, forza il codice a usare la funzione :Name() attorno al nome della colonna.
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"
)
In allegato è la tua tabella di dati di esempio con la nuova colonna aggiunta
Ri: Come creo una nuova colonna e inserisco un testo x-righe prima di un "evento" e y-righe dopo l'"evento"Questo dovrebbe farlo:
/* 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";
);
);Ri: Come creo una nuova colonna e inserisco un testo x-righe prima di un "evento" e y-righe dopo l'"evento"@pmroz Si prega di trovare un breve esempio allegato.
Ogni 'PRE' dovrebbe iniziare (in questo esempio) 3 righe prima della riga 'Event' e terminare 1 riga prima di 'Event'
Ogni "POST" dovrebbe iniziare 1 riga dopo l'evento e terminare 5 righe dopo l'"Evento"
Grazie!
Ri: Come creo una nuova colonna e inserisco un testo x-righe prima di un "evento" e y-righe dopo l'"evento"Non è chiaro dal tuo esempio quando dovrebbe iniziare il prossimo "PRE".Puoi fornire un piccolo set di dati di esempio?